labunix's blog

labunixのラボUnix

「もしも非Javaプログラマが『Groovyイン・アクション』を読んだら~第1章をbashで対抗したら」

bashでのワンライナー。
 以下で書けてしまうのはそれはそれで良い。

 元ネタ:もし新人女子Javaプログラマが『Groovyイン・アクション』を読んだら 〜第1章〜
 http://beta.mybetabook.com/showpage/4f27ceb10cf26106dca875d3

■センタリングも自分でやろうとすると、bashでは以下のようになる。

$ MAX=8;\
  for count in `seq 1 2 $MAX`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`;\
    while [ "${SPACE}" -gt 1 ];do \
      echo -ne " ";let SPACE--; \
    done; \
    while [ $count -ne 0 ];do echo -ne "*";let count--;done; \
  echo "";done
   *
  ***
 *****
*******

■5行にしてみたけれど、実質一行で書けますよ。というただそれだけのお話。。。

$ MAX=80;for count in `seq 1 2 $MAX`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`;\
    while [ $SPACE -gt 1 ];do echo -ne " ";let SPACE--;done; \
    while [ $count -ne 0 ];do echo -ne "*";let count--;done; \
  echo "";done
                                       *
                                      ***
                                     *****
                                    *******
                                   *********
                                  ***********
                                 *************
                                ***************
                               *****************
                              *******************
                             *********************
                            ***********************
                           *************************
                          ***************************
                         *****************************
                        *******************************
                       *********************************
                      ***********************************
                     *************************************
                    ***************************************
                   *****************************************
                  *******************************************
                 *********************************************
                ***********************************************
               *************************************************
              ***************************************************
             *****************************************************
            *******************************************************
           *********************************************************
          ***********************************************************
         *************************************************************
        ***************************************************************
       *****************************************************************
      *******************************************************************
     *********************************************************************
    ***********************************************************************
   *************************************************************************
  ***************************************************************************
 *****************************************************************************
*******************************************************************************

■おまけ1

スペースの計算についての説明の代わりとして、
「変数MAXまでの奇数の増分2」はseqで決まっているので以下でも良いということを示しておく。

$ MAX=80;for count in `seq 1 2 $MAX`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-1)/2}'`; \
    while [ $SPACE -gt 1 ];do echo -ne " ";let SPACE--;done; \
    while [ $count -ne 0 ];do echo -ne "*";let count--;done; \
  echo "";done

■おまけ2

$  MAX=40;for count in `seq 1 2 $MAX`;do \
   SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`;\
   while [ $SPACE -gt 1 ];do echo -ne "  ";let SPACE--;done; \
   while [ $count -ne 0 ];do TEMP=`echo $count | awk '{printf "%2d" , $1}'`; echo -ne "$TEMP";let count--;done; \
   echo "";done
                                       1
                                     3 2 1
                                   5 4 3 2 1
                                 7 6 5 4 3 2 1
                               9 8 7 6 5 4 3 2 1
                            1110 9 8 7 6 5 4 3 2 1
                          13121110 9 8 7 6 5 4 3 2 1
                        151413121110 9 8 7 6 5 4 3 2 1
                      1716151413121110 9 8 7 6 5 4 3 2 1
                    19181716151413121110 9 8 7 6 5 4 3 2 1
                  212019181716151413121110 9 8 7 6 5 4 3 2 1
                2322212019181716151413121110 9 8 7 6 5 4 3 2 1
              25242322212019181716151413121110 9 8 7 6 5 4 3 2 1
            272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
          2928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
        31302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
      333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
    3534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
  37363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
393837363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1

■おまけ3

$ MAX=40;for count in `seq 1 2 $MAX`;do \
  SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`;\
  while [ $SPACE -gt 1 ];do echo -ne "  ";let SPACE--;done; \
  while [ $count -ne 0 ];do TEMP=`echo $count | awk '{printf "%2d" , $1-1}'`; echo -ne "$TEMP";let count--;done; \
  echo "";done
                                       0
                                     2 1 0
                                   4 3 2 1 0
                                 6 5 4 3 2 1 0
                               8 7 6 5 4 3 2 1 0
                            10 9 8 7 6 5 4 3 2 1 0
                          121110 9 8 7 6 5 4 3 2 1 0
                        1413121110 9 8 7 6 5 4 3 2 1 0
                      16151413121110 9 8 7 6 5 4 3 2 1 0
                    181716151413121110 9 8 7 6 5 4 3 2 1 0
                  2019181716151413121110 9 8 7 6 5 4 3 2 1 0
                22212019181716151413121110 9 8 7 6 5 4 3 2 1 0
              242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
            2625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
          28272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
        302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
      3231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
    34333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
  363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
3837363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0

■おまけ4

$  MAX=40;for count in `seq 1 2 $MAX`;do \
   SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`;\
   while [ $SPACE -gt 1 ];do echo -ne "  ";let SPACE--;done; \
   while [ $count -ne 0 ];do TEMP=`echo $count | awk '{printf "%02d" , $1-1}'`; echo -ne "$TEMP";let count--;done; \
   echo "";done
                                      00
                                    020100
                                  0403020100
                                06050403020100
                              080706050403020100
                            1009080706050403020100
                          12111009080706050403020100
                        141312111009080706050403020100
                      1615141312111009080706050403020100
                    18171615141312111009080706050403020100
                  201918171615141312111009080706050403020100
                2221201918171615141312111009080706050403020100
              24232221201918171615141312111009080706050403020100
            262524232221201918171615141312111009080706050403020100
          2827262524232221201918171615141312111009080706050403020100
        30292827262524232221201918171615141312111009080706050403020100
      323130292827262524232221201918171615141312111009080706050403020100
    3433323130292827262524232221201918171615141312111009080706050403020100
  36353433323130292827262524232221201918171615141312111009080706050403020100
383736353433323130292827262524232221201918171615141312111009080706050403020100

■おまけ5

$ MAX=38;for count in `seq $MAX -2 0`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`; \
    while [ $SPACE -ge 1 ];do echo -ne "  ";let SPACE--;done; \
    while [ $count -ge 0 ];do TEMP=`echo $count | awk '{printf "%2d" , $1}'`; echo -ne "$TEMP";let count--;done; \
  echo "";done
3837363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
  363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
    34333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
      3231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
        302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
          28272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
            2625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
              242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
                22212019181716151413121110 9 8 7 6 5 4 3 2 1 0
                  2019181716151413121110 9 8 7 6 5 4 3 2 1 0
                    181716151413121110 9 8 7 6 5 4 3 2 1 0
                      16151413121110 9 8 7 6 5 4 3 2 1 0
                        1413121110 9 8 7 6 5 4 3 2 1 0
                          121110 9 8 7 6 5 4 3 2 1 0
                            10 9 8 7 6 5 4 3 2 1 0
                               8 7 6 5 4 3 2 1 0
                                 6 5 4 3 2 1 0
                                   4 3 2 1 0
                                     2 1 0
                                       0


■おまけ6

$ MAX=38;for count in `seq $MAX -2 0`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`; \
    while [ $SPACE -ge 1 ];do echo -ne "  ";let SPACE--;done; \
    while [ $count -ge 0 ];do TEMP=`echo $count | awk '{printf "%2d" , $1+1}'`; echo -ne "$TEMP";let count--;done; \
  echo "";done
393837363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
  37363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
    3534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
      333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
        31302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
          2928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
            272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
              25242322212019181716151413121110 9 8 7 6 5 4 3 2 1
                2322212019181716151413121110 9 8 7 6 5 4 3 2 1
                  212019181716151413121110 9 8 7 6 5 4 3 2 1
                    19181716151413121110 9 8 7 6 5 4 3 2 1
                      1716151413121110 9 8 7 6 5 4 3 2 1
                        151413121110 9 8 7 6 5 4 3 2 1
                          13121110 9 8 7 6 5 4 3 2 1
                            1110 9 8 7 6 5 4 3 2 1
                               9 8 7 6 5 4 3 2 1
                                 7 6 5 4 3 2 1
                                   5 4 3 2 1
                                     3 2 1
                                       1

■こうやって見ると最初の「*」の三角形はダサいですね。。。

$ MAX=40;for count in `seq 1 2 $MAX`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`; \
    while [ $SPACE -gt 1 ];do echo -ne "  ";let SPACE--;done; \
    while [ $count -ne 0 ];do echo -ne "* ";let count--;done; \
  echo "";done
                                      *
                                    * * *
                                  * * * * *
                                * * * * * * *
                              * * * * * * * * *
                            * * * * * * * * * * *
                          * * * * * * * * * * * * *
                        * * * * * * * * * * * * * * *
                      * * * * * * * * * * * * * * * * *
                    * * * * * * * * * * * * * * * * * * *
                  * * * * * * * * * * * * * * * * * * * * *
                * * * * * * * * * * * * * * * * * * * * * * *
              * * * * * * * * * * * * * * * * * * * * * * * * *
            * * * * * * * * * * * * * * * * * * * * * * * * * * *
          * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

■ひし形

$ MAX=40;for count in `seq 1 2 $MAX`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`; \
    while [ $SPACE -gt 1 ];do echo -ne "  ";let SPACE--;done; \
    while [ $count -ne 0 ];do echo -ne "* ";let count--;done; \
    echo "";done; \
  MAX=36;for count in `seq $MAX -2 0`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`; \
    while [ $SPACE -ge 0 ];do echo -ne "  ";let SPACE--;done; \
    while [ $count -ge 0 ];do echo -ne "* ";let count--;done; \
  echo "";done
                                      *
                                    * * *
                                  * * * * *
                                * * * * * * *
                              * * * * * * * * *
                            * * * * * * * * * * *
                          * * * * * * * * * * * * *
                        * * * * * * * * * * * * * * *
                      * * * * * * * * * * * * * * * * *
                    * * * * * * * * * * * * * * * * * * *
                  * * * * * * * * * * * * * * * * * * * * *
                * * * * * * * * * * * * * * * * * * * * * * *
              * * * * * * * * * * * * * * * * * * * * * * * * *
            * * * * * * * * * * * * * * * * * * * * * * * * * * *
          * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
      * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
          * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
            * * * * * * * * * * * * * * * * * * * * * * * * * * *
              * * * * * * * * * * * * * * * * * * * * * * * * *
                * * * * * * * * * * * * * * * * * * * * * * *
                  * * * * * * * * * * * * * * * * * * * * *
                    * * * * * * * * * * * * * * * * * * *
                      * * * * * * * * * * * * * * * * *
                        * * * * * * * * * * * * * * *
                          * * * * * * * * * * * * *
                            * * * * * * * * * * *
                              * * * * * * * * *
                                * * * * * * *
                                  * * * * *
                                    * * *
                                      *

■ひし形2

$ MAX=40;for count in `seq 1 2 $MAX`;do \
     SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`;\
     while [ $SPACE -gt 1 ];do echo -ne "  ";let SPACE--;done; \
     while [ $count -ne 0 ];do TEMP=`echo $count | awk '{printf "%2d" , $1}'`; echo -ne "$TEMP";let count--;done; \
     echo "";done; \
  MAX=38;for count in `seq $MAX -2 0`;do \
     SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`; \
     echo -ne "  "; \
     while [ $SPACE -gt 0 ];do echo -ne "  ";let SPACE--;done; \
     while [ $count -ge 0 ];do TEMP=`echo $count | awk '{printf "%2d" , $1}'`; echo -ne "$TEMP";let count--;done; \
  echo "";done
                                       1
                                     3 2 1
                                   5 4 3 2 1
                                 7 6 5 4 3 2 1
                               9 8 7 6 5 4 3 2 1
                            1110 9 8 7 6 5 4 3 2 1
                          13121110 9 8 7 6 5 4 3 2 1
                        151413121110 9 8 7 6 5 4 3 2 1
                      1716151413121110 9 8 7 6 5 4 3 2 1
                    19181716151413121110 9 8 7 6 5 4 3 2 1
                  212019181716151413121110 9 8 7 6 5 4 3 2 1
                2322212019181716151413121110 9 8 7 6 5 4 3 2 1
              25242322212019181716151413121110 9 8 7 6 5 4 3 2 1
            272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
          2928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
        31302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
      333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
    3534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
  37363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
393837363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
  3837363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
    363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
      34333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
        3231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
          302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
            28272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
              2625242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
                242322212019181716151413121110 9 8 7 6 5 4 3 2 1 0
                  22212019181716151413121110 9 8 7 6 5 4 3 2 1 0
                    2019181716151413121110 9 8 7 6 5 4 3 2 1 0
                      181716151413121110 9 8 7 6 5 4 3 2 1 0
                        16151413121110 9 8 7 6 5 4 3 2 1 0
                          1413121110 9 8 7 6 5 4 3 2 1 0
                            121110 9 8 7 6 5 4 3 2 1 0
                              10 9 8 7 6 5 4 3 2 1 0
                                 8 7 6 5 4 3 2 1 0
                                   6 5 4 3 2 1 0
                                     4 3 2 1 0
                                       2 1 0
                                         0

■ひし形3

$ MAX=40;for count in `seq 1 2 $MAX`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`; \
    while [ $SPACE -gt 1 ];do echo -ne "  ";let SPACE--;done; \
    while [ $count -ne 0 ];do TEMP=`echo $count | awk '{printf "%2d" , $1}'`; echo -ne "$TEMP";let count--;done; \
    echo "";done; \
  MAX=36;for count in `seq $MAX -2 0`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`; \
    echo -ne "  "; \
    while [ $SPACE -gt 0 ];do echo -ne "  ";let SPACE--;done; \
    while [ $count -ge 0 ];do TEMP=`echo $count | awk '{printf "%2d" , $1+1}'`; echo -ne "$TEMP";let count--;done; \
  echo "";done
                                       1
                                     3 2 1
                                   5 4 3 2 1
                                 7 6 5 4 3 2 1
                               9 8 7 6 5 4 3 2 1
                            1110 9 8 7 6 5 4 3 2 1
                          13121110 9 8 7 6 5 4 3 2 1
                        151413121110 9 8 7 6 5 4 3 2 1
                      1716151413121110 9 8 7 6 5 4 3 2 1
                    19181716151413121110 9 8 7 6 5 4 3 2 1
                  212019181716151413121110 9 8 7 6 5 4 3 2 1
                2322212019181716151413121110 9 8 7 6 5 4 3 2 1
              25242322212019181716151413121110 9 8 7 6 5 4 3 2 1
            272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
          2928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
        31302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
      333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
    3534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
  37363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
393837363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
  37363534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
    3534333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
      333231302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
        31302928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
          2928272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
            272625242322212019181716151413121110 9 8 7 6 5 4 3 2 1
              25242322212019181716151413121110 9 8 7 6 5 4 3 2 1
                2322212019181716151413121110 9 8 7 6 5 4 3 2 1
                  212019181716151413121110 9 8 7 6 5 4 3 2 1
                    19181716151413121110 9 8 7 6 5 4 3 2 1
                      1716151413121110 9 8 7 6 5 4 3 2 1
                        151413121110 9 8 7 6 5 4 3 2 1
                          13121110 9 8 7 6 5 4 3 2 1
                            1110 9 8 7 6 5 4 3 2 1
                               9 8 7 6 5 4 3 2 1
                                 7 6 5 4 3 2 1
                                   5 4 3 2 1
                                     3 2 1
                                       1

■各文字に割り当てられたサイズは無視すると、底辺も高さも一目瞭然ですねw。。。

$ MAX=40;for count in `seq 1 2 $MAX`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`; \
    while [ $SPACE -gt 1 ];do echo -ne "  ";let SPACE--;done; \
    while [ $count -ne 0 ];do TEMP=`echo $count | awk '{printf "%02d" , $1}'`; echo -ne "$TEMP";let count--;done; \
    echo "";done; \
  MAX=36;for count in `seq $MAX -2 0`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`; \
    echo -ne "  "; \
    while [ $SPACE -gt 0 ];do echo -ne "  ";let SPACE--;done; \
    while [ $count -ge 0 ];do TEMP=`echo $count | awk '{printf "%02d" , $1+1}'`; echo -ne "$TEMP";let count--;done; \
  echo "";done
                                      01
                                    030201
                                  0504030201
                                07060504030201
                              090807060504030201
                            1110090807060504030201
                          13121110090807060504030201
                        151413121110090807060504030201
                      1716151413121110090807060504030201
                    19181716151413121110090807060504030201
                  212019181716151413121110090807060504030201
                2322212019181716151413121110090807060504030201
              25242322212019181716151413121110090807060504030201
            272625242322212019181716151413121110090807060504030201
          2928272625242322212019181716151413121110090807060504030201
        31302928272625242322212019181716151413121110090807060504030201
      333231302928272625242322212019181716151413121110090807060504030201
    3534333231302928272625242322212019181716151413121110090807060504030201
  37363534333231302928272625242322212019181716151413121110090807060504030201
393837363534333231302928272625242322212019181716151413121110090807060504030201
  37363534333231302928272625242322212019181716151413121110090807060504030201
    3534333231302928272625242322212019181716151413121110090807060504030201
      333231302928272625242322212019181716151413121110090807060504030201
        31302928272625242322212019181716151413121110090807060504030201
          2928272625242322212019181716151413121110090807060504030201
            272625242322212019181716151413121110090807060504030201
              25242322212019181716151413121110090807060504030201
                2322212019181716151413121110090807060504030201
                  212019181716151413121110090807060504030201
                    19181716151413121110090807060504030201
                      1716151413121110090807060504030201
                        151413121110090807060504030201
                          13121110090807060504030201
                            1110090807060504030201
                              090807060504030201
                                07060504030201
                                  0504030201
                                    030201
                                      01

■昔の本の挿し絵は、よく見ると、こんな感じでした。

$ MAX=40;for count in `seq 1 2 $MAX`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`; \
    while [ $SPACE -gt 1 ];do echo -ne "  ";let SPACE--;done; \
    while [ $count -ne 0 ];do echo -ne ". ";let count--;done; \
    echo "";done; \
  MAX=36;for count in `seq $MAX -2 0`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`; \
    while [ $SPACE -ge 0 ];do echo -ne "  ";let SPACE--;done; \
    while [ $count -ge 0 ];do echo -ne ". ";let count--;done; \
  echo "";done
                                      .
                                    . . .
                                  . . . . .
                                . . . . . . .
                              . . . . . . . . .
                            . . . . . . . . . . .
                          . . . . . . . . . . . . .
                        . . . . . . . . . . . . . . .
                      . . . . . . . . . . . . . . . . .
                    . . . . . . . . . . . . . . . . . . .
                  . . . . . . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . . . . . . . . .
              . . . . . . . . . . . . . . . . . . . . . . . . .
            . . . . . . . . . . . . . . . . . . . . . . . . . . .
          . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
          . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
            . . . . . . . . . . . . . . . . . . . . . . . . . . .
              . . . . . . . . . . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . . . . . . . . .
                  . . . . . . . . . . . . . . . . . . . . .
                    . . . . . . . . . . . . . . . . . . .
                      . . . . . . . . . . . . . . . . .
                        . . . . . . . . . . . . . . .
                          . . . . . . . . . . . . .
                            . . . . . . . . . . .
                              . . . . . . . . .
                                . . . . . . .
                                  . . . . .
                                    . . .
                                      .

■変数MAXの半分が意味するところ。

MAX=40;for count in `seq 1 2 $MAX`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`; \
    while [ $SPACE -gt 1 ];do echo -ne ". ";let SPACE--;done; \
    while [ $count -ne 0 ];do echo -ne "/ ";let count--;done; \
    echo "";done; \
  MAX=36;for count in `seq $MAX -2 0`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`; \
    while [ $SPACE -ge 0 ];do echo -ne ". ";let SPACE--;done; \
    while [ $count -ge 0 ];do echo -ne "/ ";let count--;done; \
  echo "";done
. . . . . . . . . . . . . . . . . . . /
. . . . . . . . . . . . . . . . . . / / /
. . . . . . . . . . . . . . . . . / / / / /
. . . . . . . . . . . . . . . . / / / / / / /
. . . . . . . . . . . . . . . / / / / / / / / /
. . . . . . . . . . . . . . / / / / / / / / / / /
. . . . . . . . . . . . . / / / / / / / / / / / / /
. . . . . . . . . . . . / / / / / / / / / / / / / / /
. . . . . . . . . . . / / / / / / / / / / / / / / / / /
. . . . . . . . . . / / / / / / / / / / / / / / / / / / /
. . . . . . . . . / / / / / / / / / / / / / / / / / / / / /
. . . . . . . . / / / / / / / / / / / / / / / / / / / / / / /
. . . . . . . / / / / / / / / / / / / / / / / / / / / / / / / /
. . . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / /
. . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
. . . . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
. . . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
. . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
. / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
. / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
. . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
. . . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
. . . . / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
. . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
. . . . . . / / / / / / / / / / / / / / / / / / / / / / / / / / /
. . . . . . . / / / / / / / / / / / / / / / / / / / / / / / / /
. . . . . . . . / / / / / / / / / / / / / / / / / / / / / / /
. . . . . . . . . / / / / / / / / / / / / / / / / / / / / /
. . . . . . . . . . / / / / / / / / / / / / / / / / / / /
. . . . . . . . . . . / / / / / / / / / / / / / / / / /
. . . . . . . . . . . . / / / / / / / / / / / / / / /
. . . . . . . . . . . . . / / / / / / / / / / / / /
. . . . . . . . . . . . . . / / / / / / / / / / /
. . . . . . . . . . . . . . . / / / / / / / / /
. . . . . . . . . . . . . . . . / / / / / / /
. . . . . . . . . . . . . . . . . / / / / /
. . . . . . . . . . . . . . . . . . / / /
. . . . . . . . . . . . . . . . . . . /


■最後にひし形は、ひし形らしくする。

$ cat new
MAX=40;for count in `seq 1 2 $MAX`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`; \
    while [ $SPACE -gt 1 ];do echo -ne "  ";let SPACE--;done; \
    while [ $count -ne 0 ];do echo -ne ". ";let count--;done; \
    echo "";done; \
  MAX=36;for count in `seq $MAX -2 0`;do \
    SPACE=`echo "${MAX} ${count}" | awk '{print ($1/2)-($2-($2%2))/2}'`; \
    while [ $SPACE -ge 0 ];do echo -ne "  ";let SPACE--;done; \
    while [ $count -ge 0 ];do echo -ne ". ";let count--;done; \
  echo "";done

$ /bin/bash new | awk '( NF%3 == 1 ) {print}'
                                      .
                                . . . . . . .
                          . . . . . . . . . . . . .
                    . . . . . . . . . . . . . . . . . . .
              . . . . . . . . . . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
              . . . . . . . . . . . . . . . . . . . . . . . . .
                    . . . . . . . . . . . . . . . . . . .
                          . . . . . . . . . . . . .
                                . . . . . . .
                                      .