関数

干支

西暦を入力すると干支を表示します。

ソースコード公開

<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
144 + 9 = 13
13 – 12 = 1
4 – 3 = 1
255 + 9 = 14
14 – 12 = 2
5 – 3 = 2
366 + 9 = 15
15 – 12 = 3
6 – 3 = 3
477 + 9 = 16
16 – 12 = 4
7 – 3 = 4
588 + 9 = 17
17 – 12 = 5
8 – 3 = 5
699 + 9 = 18
18 – 12 = 6
9 – 3 = 6
71010 + 9 = 19
19 – 12 = 7
10 – 3 = 7
81111 + 9 = 20
20 – 12 = 8
11 – 3 = 8
900 + 9 = 90 – 3 = -3
-3 + 12 = 9
1011 + 9 = 101 – 3 = -2
-2 + 12 = 10
1122 + 9 = 112 – 3 = -1
-1 + 12 = 10
1233 + 9 = 123 – 3 = 0
0 + 12 = 12

このように、神様のところに到着した順番通りに十二支を取得しようとすると、「西暦÷12の余り」の数字をシフトするひと手間が生じてしまいます。

123456789101112
45678910110123
🐭🐮🐯🐰🐉🐍🐎🐏🐵🐔🐶🐗

最初から「西暦÷12の余り」と順番が一致するような形の配列を用意しておけば、無駄な計算を省くことができます。
全体を4つずらし、申(さる)を先頭に持ってきます。インデックスは0始まりになります。

01234567891011
🐵🐔🐶🐗🐭🐮🐯🐰🐉🐍🐎🐏

曜日のインデックスを取得する関数などと同様の対処法ですね。



コメント