shell - 画一棵圣诞树

我正在尝试按以下形式绘制一棵树

    *    
   ***
  *****
 *******
*********

如您所见,我在每一行中都需要空格和“*”星号,但我无法完全按照我想要的方式得到它

#!/bin/bash

display_tree() {
    local rows=$1
    local columns=$2

    for ((i=0; i<$rows; i++))
    do
        #spaces loop
        for ((j=0; j<$columns; j++))
        do
            echo -n " "
            #drawing tree loop
            for ((a=0; a<$(($i + 1)); a++))
            do
                echo -n "*"
            done
        done
    echo 
    done
}

if [ $# -eq 2 ]; then
    display_tree $1 $2
else
    echo "Usage: $0 rows columns"
fi

最佳答案

这似乎对我有用。为“列”参数推荐的奇数。当 columns = 2*rows - 1 时看起来最漂亮。代码中最长的一行执行一些初等代数运算,特别是线性插值,用于计算给定行中要显示的星数。

#!/bin/bash
# Christmas tree ASCII drawer
# works nicest for odd integers

spaces() {
  for ((i=0; i<$1; i++)) ; do
    echo -n " "
  done 
}

stars() {
  for ((i=0; i<$1; i++)) ; do
    echo -n "*"
  done
  echo ""
}

display_tree() {
    local rows=$1
    local columns=$2

    # render
    for (( r=1; r <= $rows; r++ )); do
      s=$(( (((columns-1) * (r-1)/(rows-1) + 1)/2)*2 +1 ))
      spaces $(((columns-s)/2))
      stars $s
    done
}

if [ $# -eq 2 ]; then
    display_tree $1 $2
else
    echo "Usage: $0 rows columns"
fi

示例输出:

./display_tree.sh 5 21
          *
       *******
     ***********
  *****************
*********************

./display_tree.sh 30 59
                             *
                            ***
                           *****
                          *******
                         *********
                        ***********
                       *************
                      ***************
                     *****************
                    *******************
                   *********************
                  ***********************
                 *************************
                ***************************
               *****************************
              *******************************
             *********************************
            ***********************************
           *************************************
          ***************************************
         *****************************************
        *******************************************
       *********************************************
      ***********************************************
     *************************************************
    ***************************************************
   *****************************************************
  *******************************************************
 *********************************************************
***********************************************************

https://stackoverflow.com/questions/13408728/

相关文章:

janusgraph - 如何在 Janusgraph 中获取索引键列表?

python-3.x - pyspark中的异常值检测

docker - 使用 Dockerfile 中的 COPY 在目标目录中复制具有不同名称的文件

audio - 在网络服务器上播放 Apple 的 .caf 音频文件?

github - 如何从 GitHub 评论为我的拉取请求触发 Travis 重建?

maven - 将 Artifact 安装到特定的远程 Maven 存储库

deployment - 如何在 Kubernetes 中相同部署的两个 Pod 中使环境变量不同?

scala - 如何在 Scala 中实现 Python 的 issuperset()

ios - 如何在 SwiftUI 中全屏显示 View ?

prolog - '/1' 在 Prolog 中代表什么?