3

次の形式でツリーを描画しようとしています

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

ご覧のとおり、すべての行にスペースと「*」の両方が必要ですが、思い通りにはなりません

#!/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
4

3 に答える 3

3

これは私にはうまくいくようです。「列」引数には奇数をお勧めします。列 = 2*行 - 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
                             *
                            ***
                           *****
                          *******
                         *********
                        ***********
                       *************
                      ***************
                     *****************
                    *******************
                   *********************
                  ***********************
                 *************************
                ***************************
               *****************************
              *******************************
             *********************************
            ***********************************
           *************************************
          ***************************************
         *****************************************
        *******************************************
       *********************************************
      ***********************************************
     *************************************************
    ***************************************************
   *****************************************************
  *******************************************************
 *********************************************************
***********************************************************
于 2012-12-19T08:10:45.887 に答える
0
letters=( \" \');while true;do clear; letter=${letters[$[RANDOM%${#letters[@]}]]}; [[ $letter == \" ]] && color=35 || color=32;m=2;i=77;p=$(($i/2-1)); while [[ $m -le $i ]];do printf "%${p}s" ;printf "\e[4;${color}m${letter}%.0s\e[m" $(seq $m);echo;m=$[m+2];((p--));done;sleep 1;done 
于 2015-12-23T06:43:46.977 に答える