干支
今年の干支はなんでしょう?
「巳」という回答は誤りではありませんが正確ではありません。干支とは「十干十二支」の略であり、「巳年」だけでは後半の十二支しか答えていないからです。「干支」を答えるには前半の十干も必要となります。
今年の十干は乙(きのと)なので、干支は乙と巳を併せた「乙巳」となります。「そもそも十干ってなに?」という疑問は Wikipedia でも見ていただくとして、ここでは十干の仕組みを簡単に説明します。
十干は 木(き)・火(ひ)・土(つち)・金(か)・水(みず) の5つの要素(いわゆる五行です)それぞれに兄(え)・弟(と)をかけた 10 個で成り立っています。具体的には 木の兄(きのえ) → 木の弟(きのと) → 火の兄 → 火の弟 → … → 水の兄(みずのえ) → 水の弟(みずのと) で一周します。それぞれに漢字が一文字づつ割り当てられ、甲・乙・丙・丁・戊・己・庚・辛・壬・癸 と表記されます。
昨年 2024 年は十干の最初の年である甲でした(余談ですが甲子園球場は甲(きのえ)子(ね)の 1924 年の開場です)。十干は 10 年で一周するので、次の甲は 2034 年となります。言い換えれば「10 で割って 4 余る西暦年」が甲となります。同様に 乙(きのと)は 10 で割った余りが 5 の年、丙(ひのえ)は 10 で割った余りが 6 の年、… 癸(みずのと)は 10 で割った余りが 3 の年となります。
ここでやっとプログラムの話になります。プログラムで「西暦 y 年の十干を求める」場合はどのように書けば良いでしょう?まずは格好悪い例から。
function yearToJikkan(int: y): string {
switch (y % 10) {
case 4: return "甲";
case 5: return "乙";
(中略)
case 2: return "壬";
case 3: return "癸";
}
}
y % 10 は「y を 10 で割った余り」を計算する 剰余演算子 です。余談ですが、この剰余演算子はかなり便利なのですが、初心者には便利さに気付いてない人もたまにいて剰余演算子を使えばもっと短くなるコードをたまに見かけたりします。これからプログラムを書く人は是非とも使いこなしてください。
上に挙げた方法は解りやすいけどかなり冗長な書き方です。ある程度慣れた人なら、
function yearToJikkan(int: y): string {
let jikkanList: string[] = ['庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己'];
return jikkanList[y % 10];
}
と書くでしょう。あるいは、
function yearToJikkan(int: y): string {
let jikkanList: string[] = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'];
return jikkanList[(y + 6) % 10];
}
でも良いかもしれません。後者は「十干は 甲 から始まる」ことを意識した書き方ですが、プログラムを実行する上ではこう書くことにあまり意味がありません。どちらを選んでも良いと思います。トリッキーな書き方を好む人は一行にまとめたがるかもしれません。
ここでは省略しますが「西暦 y 年の十二支を求める」ことも十干と同様に書けます。両者を組み合わせて「西暦 y 年の “十干十二支” を求める」処理をコンパクトに書く方法を考えるのもプログラムの課題として面白いかもしれません。
最後にもうひとつ。十干と十二支の組み合わせは 10 x 12 = 120 通りあるかというとそうではなく、その半分の 60 通りだけで残りの半分は存在しません。60 年で干支が一周するので 60 歳のことを「還暦」と呼ぶのは有名ですね。私も去年一周しました。
なぜ半分しか存在しないのか?その理由は数学的に証明することができます。難しい知識は必要としませんので、お時間のある方は「十干と十二支の組み合わせは 60 通りしか存在しない」ことを証明してみてください。
(担当:六度七分)