九九

九九は私の世代では小学校 2 年生の時に覚えさせられた記憶がありますが、記憶に頼ってしまっているがために、九九のプログラムを書けと言われると少々考えてみたりすることもあります。 ここでは、九九気が済むまで九九スクリプトを参考にして作ってみました。 ただし、awk なので比較的普通の方法で作成します。

頭の中をダンプせよ

まず、頭の中を整理してみましょう。 小学校の時には 1 の段から 9 の段まで縦に覚えていきましたよね。 ということは縦に 1 から 9 まで数え上げるループと横に 1 から 9 まで数えるループが必要ということが分かります。 コンピュータに表示する際に、横に繋げて表示することは簡単ですが、縦に繋げて表示することは難しいので、縦のループの中に横のループを入れて作ります。 数字の間をタブで区切るとすると、これを連接で繋げれば良いことも分かります。

では実際にプログラムを書いてみます。

#! /usr/bin/gawk -f
# 9x9.awk

BEGIN {

    # 縦の列
    for (i = 1; i <= 9; i++) {

        # 横の行
        for (j = 1; j <= 9; j++) {
            str = str "\t" i * j;
        }

        print str;
        str = "";                   # 初期化
    }
}

縦のループが外になっていて、横のループが縦のループの中に入っていることが分かります。

さて「初期化」と書かれているのが、最も最後の命令になっているのは少し変かもしれませんが、awk では変数を最初に使う場合には空の文字列または 0 が代入されていますので、最初に初期化をする必要がないために印字後に空の文字列を代入しています。

さて、実際に実行してみましょう。

$ gawk -f 9x9.awk
        1       2       3       4       5       6       7       8       9
        2       4       6       8       10      12      14      16      18
        3       6       9       12      15      18      21      24      27
        4       8       12      16      20      24      28      32      36
        5       10      15      20      25      30      35      40      45
        6       12      18      24      30      36      42      48      54
        7       14      21      28      35      42      49      56      63
        8       16      24      32      40      48      56      64      72
        9       18      27      36      45      54      63      72      81

行頭にタブが含まれてしまうのは、連接で繋いでいるところで発生しています。

拡張せよ

簡単な問題を自分の分かりやすい方法で解くことで容易に拡張をすることができます。 ここでは引数 (n) がある場合には n x n を解き、引数がない場合には九九を表示してみることにします。

#! /usr/bin/gawk -f
# nxn.awk

BEGIN {

    # 引数が何もない場合は九九
    # それ以外は n x n
    if (ARGV[1] == "") {
        num = 9;
    } else {
        num = ARGV[1];
    }

    # 縦の列
    for (i = 1; i <= num; i++) {

        # 横の行
        for (j = 1; j <= num; j++) {
            str = str "\t" i * j;
        }

        print str;
        str = "";                   # 初期化
    }
}

実際に引数に 5 を与えて実行してみます。

$ gawk -f nxn.awk 5
        1       2       3       4       5
        2       4       6       8       10
        3       6       9       12      15
        4       8       12      16      20
        5       10      15      20      25

簡単に拡張することができました。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png