月齢を求める

月齢 - Wikipedia の中にグレゴリオ歴からの月齢計算というところがありますが、これに沿って計算してみます。 プログラム自体は難しいものではありませんが、日付を扱うため、gawk 限定のプログラムになっています。

#! /usr/local/bin/gawk -f
# moon.awk
# 月齢を計算します。
# Ref: http://ja.wikipedia.org/wiki/%E6%9C%88%E9%BD%A2
# usage: gawk -f moon.awk [YYYY-MM-DD]

BEGIN {
    date = ARGV[1] ? ARGV[1] : strftime("%Y-%m-%d");

    split(date, arr_date, /-/);
    year    = arr_date[1] + 0;
    month   = arr_date[2] + 0;
    day     = arr_date[3] + 0;

    c[1]    = 0;
    c[2]    = 2;
    c[3]    = 0;
    c[4]    = 2;
    c[5]    = 2;
    c[6]    = 4;
    c[7]    = 5;
    c[8]    = 6;
    c[9]    = 7;
    c[10]   = 8;
    c[11]   = 9;
    c[12]   = 10;

    phase = (((year - 11) % 19) * 11 + c[month] + day) % 30;

    print year " 年 " month " 月 " day " 日の月齢は " phase " です。";
}

このような比較的簡単な式で計算することができるようです。

$ gawk -f moon.awk
2009 年 9 月 5 日の月齢は 15 です。

$ gawk -f moon.awk 2009-09-06
2009 年 9 月 6 日の月齢は 16 です。

上記 URL の下の方に月名が載っていますので、こうした名前に変換するのも面白いと思います。

tag_gawk.pngtag_gawk.png