クリスマスツリーを作る

unite-xmas-tree - C++でゲームプログラミング, treeコマンドでターミナルにクリスマスツリーを飾る - じゃ、ま、いっか などでクリスマスツリーを作るのが流行っている (?) ようなので、awk でクリスマスツリーを作ってみます。

作り方としては以下のような順番です。

  • ツリーの元になる連続したスペースでできた文字列を作ります。
  • 文字列の一部を飾りとなる文字で置換します。
  • 両サイドにツリーの形となる斜め線を加えます。
  • センタリングしてできあがり。
#! /bin/awk -f
# xmas_tree.awk

BEGIN {
    width = 76;

    decoration_list = "J * # A";

    for (i = 2; i <= width; i += 2) {
        leaf = repeat(" ", i);

        for (j = 1; j <= 5; j++) {
            leaf = add_decoration(leaf, decoration_list);
        }

        leaf = add_edge(leaf);

        leaf = centering(leaf, width);

        print leaf;
    }
}

function repeat(str, num,     i, repeat_str) {
    for (i = 1; i <= num; i++) {
        repeat_str = repeat_str str;
    }

    return repeat_str;
}

function add_decoration(str, list,
            len, num, decorations, position, pattern) {
    len = length(str);

    num = split(list, decorations);

    position    = int(rand() * length(str)) + 1;
    pattern     = decorations[int(rand() * length(decorations)) + 1];

    return substr(str, 1, position - 1) pattern substr(str, position + 1);
}

function add_edge(str) {
    return "/" str "\\";
}

function centering(str, width) {
    return repeat(" ", int((width - length(str)) / 2)) str;
}

実行すると以下のようになります。

$ awk -f xmas_tree.awk
                                    /JJ\
                                   / J#J\
                                  /*  # J\
                                 /  #  A A\
                                / J J   # #\
                               /* *   #*    \
                              / J*   *  *    \
                             / J A   A       A\
                            /       A  #    AA \
                           /  J   *  J      # J \
                          /  *      *   #   *   A\
                         /     *A        #   J  # \
                        /         *    J     * A  J\
                       /     *     * A      J   A   \
                      /          #  A     *      A   \
                     /           * J     A           *\
                    /    A       J       #  A    *     \
                   /               #    J  #         AA \
                  /                     #    *#J       * \
                 / A                 *     J  *    J      \
                / *  *         A     *   A                 \
               /          A  # A                  *     *   \
              /#                      *  #  J             J  \
             /             #   J  *          J        J       \
            /  A   A          *     J                  A       \
           /           *   J       J    J *                     \
          /         J  * A                    A  J               \
         / *     A        #                                  J    \
        /             A  J    A        J      #                    \
       /     JA  #               A       J                          \
      /           #*     *                     *         A           \
     /                 # A                 J      J       *           \
    /         *                   #            A             J        #\
   /                  J     *                       # A            #    \
  /      *      #                                    A    *J             \
 /                      A#      #        #   A                            \
/J   *                  #   J                        #                     \

てっぺんに星がないとか、幹がないとか、そういうのは無視してください。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png