Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo

buffalo - みずぴー日記 にインスパイヤされて Buffalo を awk でやってみます。 元ネタの anarchy golf - Buffalo のように出力をすれば良いだけと考えても構わないのですが、ここでは以下のような関数を作ります。

  • 第 1 引数の文字列 str を繰り返す
  • 繰り返すルールは、第 2 引数に与えられる文字列 idx に従う
  • 文字列 idx のうち "PN" は固有名詞を表し、最初は大文字にする

方針が決まれば、後は組めば良いだけです。

#! /usr/local/bin/nawk -f
# buffalo.awk
# Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo
# usage: nawk -f buffalo.awk

BEGIN {
    print buffalo("buffalo", "PN N PN N V V PN N");
}

# buffalo():    Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo
#   in:     繰り返す文字列 (str)
#           文法の並びを示した文字列 (idx)
#   out:    文法に即した繰り返しの文字列 (ret_str)
function buffalo(str, idx,    num_idx, arr_idx, i, ret_str) {
    num_idx = split(idx, arr_idx, " ");

    for (i = 1; i <= num_idx; i++) {

        # 固有名詞 (PN) の場合
        if (arr_idx[i] == "PN") {
            ret_str = ret_str " " toupper(substr(str, 1, 1)) substr(str, 2);
        # 通常の名詞 (N) または動詞 (V) の場合
        } else {
            ret_str = ret_str " " str;
        }
    }

    sub(/^ /, "", ret_str);

    return ret_str;
}

実際には 1, 3, 7 文字目が "Buffalo" になり、それ以外は "buffalo" になります。

$ gawk -f bullalo.awk
Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo

何か、gawk (名詞、動詞) でも似た何かが作れそうですね。

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