西暦を入力すると干支を表示します。
ソースコード公開
<form>
<input type="number" id="year" placeholder="西暦">
<input type="text" id="eto" placeholder="干支" readonly>
</form>
<script>
const year = document.getElementById('year');
year.addEventListener('input', function() {
document.getElementById('eto').value = eto(this.value);
});
/// <summary>
/// 干支
/// </summary>
/// </params name="year">西暦</params>
/// <returns>干支</returns>
function eto(year) {
const etos = [
'申(さる)'
, '酉(とり・にわとり)'
, '戌(いぬ)'
, '亥(い・いのしし)'
, '子(ね・ねずみ)'
, '丑(うし)'
, '寅(とら)'
, '卯(う・うさぎ)'
, '辰(たつ・りゅう)'
, '巳(み・へび)'
, '午(うま)'
, '未(ひつじ)'
];
return etos[year % 12];
}
</script>
アルゴリズムの解説
干支を求める計算方法は何通りかあります。
- 計算式A:①西暦÷12の余りを求める。②9を足す。③解が4以上なら12を引く。
- 計算式B:①西暦÷12の余りを求める。②3を引く。③解が0以下なら12を足す。
まず最初に「西暦÷12の余り」を求めるところはどの計算式でも共通です。無駄が少ないのは計算式Bでしょうか。計算式Aの亜種として、8を足して11を引く、と解説しているサイトもあります(同じことですね)。
順番 | 干支 | 西暦÷12の余 | 計算式A | 計算式B |
---|---|---|---|---|
1 | 子 | 4 | 4 + 9 = 13 13 – 12 = 1 | 4 – 3 = 1 |
2 | 丑 | 5 | 5 + 9 = 14 14 – 12 = 2 | 5 – 3 = 2 |
3 | 寅 | 6 | 6 + 9 = 15 15 – 12 = 3 | 6 – 3 = 3 |
4 | 卯 | 7 | 7 + 9 = 16 16 – 12 = 4 | 7 – 3 = 4 |
5 | 辰 | 8 | 8 + 9 = 17 17 – 12 = 5 | 8 – 3 = 5 |
6 | 巳 | 9 | 9 + 9 = 18 18 – 12 = 6 | 9 – 3 = 6 |
7 | 馬 | 10 | 10 + 9 = 19 19 – 12 = 7 | 10 – 3 = 7 |
8 | 未 | 11 | 11 + 9 = 20 20 – 12 = 8 | 11 – 3 = 8 |
9 | 申 | 0 | 0 + 9 = 9 | 0 – 3 = -3 -3 + 12 = 9 |
10 | 酉 | 1 | 1 + 9 = 10 | 1 – 3 = -2 -2 + 12 = 10 |
11 | 戌 | 2 | 2 + 9 = 11 | 2 – 3 = -1 -1 + 12 = 10 |
12 | 亥 | 3 | 3 + 9 = 12 | 3 – 3 = 0 0 + 12 = 12 |
このように、神様のところに到着した順番通りに十二支を取得しようとすると、「西暦÷12の余り」の数字をシフトするひと手間が生じてしまいます。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|
4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 0 | 1 | 2 | 3 |
🐭 | 🐮 | 🐯 | 🐰 | 🐉 | 🐍 | 🐎 | 🐏 | 🐵 | 🐔 | 🐶 | 🐗 |
最初から「西暦÷12の余り」と順番が一致するような形の配列を用意しておけば、無駄な計算を省くことができます。
全体を4つずらし、申(さる)を先頭に持ってきます。インデックスは0始まりになります。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|
🐵 | 🐔 | 🐶 | 🐗 | 🐭 | 🐮 | 🐯 | 🐰 | 🐉 | 🐍 | 🐎 | 🐏 |
曜日のインデックスを取得する関数などと同様の対処法ですね。
コメント