LL Golf Hole 3 - 13日の金曜日を数え上げる

LL Future の前哨戦として、LL Golf Hole 3 - 13日の金曜日を数え上げるというお題が出題されています。

今回は普通に解いてみましょう。 gawk は時間関数に関して大幅な拡張がなされていますので、mktime() 関数と strftime() 関数を使って比較的簡単に解くことができます。

#! /usr/bin/gawk -f
# 13fri.awk
# usage: gawk -f 13fri.awk

BEGIN {

    from = systime();           # 現在時刻
    to   = mktime("2013 12 31 0 0 0");
    day  = 60 * 60 * 24;        # 1 日の秒数

    for (i = from; i <= to; i += day) {

        if (strftime("%d", i) == 13 && strftime("%u", i) == 5) {
            count++;

            print strftime("%F(%a)", i);
        }
    }

    print count " times";
}

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

$ gawk -f 13fri.awk
2009-02-13(Fri)
2009-03-13(Fri)
2009-11-13(Fri)
2010-08-13(Fri)
2011-05-13(Fri)
2012-01-13(Fri)
2012-04-13(Fri)
2012-07-13(Fri)
2013-09-13(Fri)
2013-12-13(Fri)
10 times

多いと見るか少ないと見るか、13 日の金曜日は 10 回あります。

さすがプロゴルファー

LL Golf #3 からですが、cal 使うといいんじゃないですかねぇ。とかなかなかトリッキーでいいですね。 そういう発想はなかなか思い浮かばないないものです。

tag_gawk.pngtag_gawk.png