アルファベットの循環表示

実際にこういう類の問題が実際の問題解決に繋がったということはあまりないのですが、よくある練習問題として「循環表示」というものがあります。 アルファベットの循環表示は元々表示の仕方からの問題となっています。

以下に示す方法はあくまで一例であり、awk でももっといろいろな方法がありますが、ここでは nawk などでも動作するもので記述しています。 文字を 1 文字づつずらして表示していくのですが、溢れた部分を条件演算子 (三項演算子) を用いて再定義しています。

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

BEGIN {
    str = "abcdefghijklmnopqrstuvwxyz";
    num_str = split(str, each_str, "");

    for (i = 1; i <= num_str; i++) {
        for (j = i; j < num_str + i; j++) {
            printf("%s", each_str[(j <= num_str) ? j : j - num_str]);
        }
        print "";
    }
}

実行してみましょう。

$ gawk -f alpha_rot.awk
abcdefghijklmnopqrstuvwxyz
bcdefghijklmnopqrstuvwxyza
cdefghijklmnopqrstuvwxyzab
defghijklmnopqrstuvwxyzabc
efghijklmnopqrstuvwxyzabcd
fghijklmnopqrstuvwxyzabcde
ghijklmnopqrstuvwxyzabcdef
hijklmnopqrstuvwxyzabcdefg
ijklmnopqrstuvwxyzabcdefgh
jklmnopqrstuvwxyzabcdefghi
klmnopqrstuvwxyzabcdefghij
lmnopqrstuvwxyzabcdefghijk
mnopqrstuvwxyzabcdefghijkl
nopqrstuvwxyzabcdefghijklm
opqrstuvwxyzabcdefghijklmn
pqrstuvwxyzabcdefghijklmno
qrstuvwxyzabcdefghijklmnop
rstuvwxyzabcdefghijklmnopq
stuvwxyzabcdefghijklmnopqr
tuvwxyzabcdefghijklmnopqrs
uvwxyzabcdefghijklmnopqrst
vwxyzabcdefghijklmnopqrstu
wxyzabcdefghijklmnopqrstuv
xyzabcdefghijklmnopqrstuvw
yzabcdefghijklmnopqrstuvwx
zabcdefghijklmnopqrstuvwxy

プログラム的には for 文を 2 回使っているのと、条件演算子として if 文を使っているだけですから、プログラムを勉強し始めたばかりでも、頭をひねれば書けるのではないでしょうか。

このプログラムの性質上以下のようなものもできます。

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

BEGIN {
    str = "一二三四五六七八九十";
    num_str = split(str, each_str, "");

    for (i = 1; i <= num_str; i++) {
        for (j = i; j < num_str + i; j++) {
            printf("%s", each_str[(j <= num_str) ? j : j - num_str]);
        }
        print "";
    }
}

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

$ gawk -f num_rot.awk
一二三四五六七八九十
二三四五六七八九十一
三四五六七八九十一二
四五六七八九十一二三
五六七八九十一二三四
六七八九十一二三四五
七八九十一二三四五六
八九十一二三四五六七
九十一二三四五六七八
十一二三四五六七八九

いかがでしょうか。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png