ダイヤを描く

「ASCII Starts」をやってみる - みずぴー日記 にインスパイヤされて同じように anarchy golf - ASCII Stars をやってみます。

Golf をすれば難しいのですが、普通にプログラムすると比較的簡単に書けると思います。 awk には文字列をある回数繰り返す演算子や関数がないので、AWK Users JP :: 同じ文字列のn回繰り返しを作る方法 で用いた方法を使っています。

#! /usr/local/bin/nawk -f
# ascii_stars.awk
# "*" でダイヤを描く
# usage: gawk -f ascii_stars.awk num

BEGIN {
    show_ascii_stars(ARGV[1]);
}

# show_ascii_stars():   "*" を使ってダイヤを描く
#   in:     数値 num
#   out:    none
function show_ascii_stars(num,     i, arr) {

    for (i = 1; i <= num; i++) {
        arr[i] =    repeat_str(" ", num - i) \
                    repeat_str("*", 2 * i - 1);
    }

    for (i = 1; i <= 2 * num - 1; i++) {
        print (i <= num) ? arr[i] : arr[2 * num - i];
    }

}

# repeat_str(): 文字列を繰り返す
#   in:     文字列 str
#           繰り返し数 num
#   out:    文字列 str を繰り返し数 num 繋げた文字列
function repeat_str(str, num,    result) {

    for (i = 1; i <= num; i++) {
        result = result str;
    }

    return result;
}

実際に動作させてみます。

$ nawk -f ascii_stars.awk 4
   *
  ***
 *****
*******
 *****
  ***
   *

$ nawk -f ascii_stars.awk 10
         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
*******************
 *****************
  ***************
   *************
    ***********
     *********
      *******
       *****
        ***
         *

折り返しの際に条件演算子を使って多少短縮しています。

tag_nawk.png tag_nawk.png tag_nawk.png tag_nawk.png