2018年4月5日木曜日

うるう年

西暦が4で割り切れる年はうるう年
ただし、4で割り切れても100で割り切れる年はうるう年でない
ただし、100で割り切れても400で割り切れる年はうるう年

これがうるう年の定義です。
こう書くと複雑なようですが、具体的に考えると案外簡単です。

2001年から3000年までで考えますと
4で割り切れる年、例えば2004年、2008年はうるう年。
その合間の2001,2002,2003年等は平年。
2100,2200,2300,2400,2500,2600,2700,2800,2900,3000年は100で割り切れるので平年。
ただし2400年と2800年のみ400で割り切れるのでうるう年。

ただこれをプログラムで判定するとなると意外と大変、特にif文をネストして書くのは難しいです。
そんな時Haskellではガード節という便利な書式が用意されています。

isLeap n  
| n `mod` 4 /= 0 = False
| n `mod` 400 == 0 = True
| n `mod` 100 == 0 = False
| otherwise = True


上から順番にはじいていってくれるので間違えません。

また慣れていれば論理式ですっきり書くこともできます。

isleap n = n `mod` 4 == 0 && n `mod` 100 /= 0 || n `mod` 400 == 0


実はData.Time.Calendarモジュールには

isLeapYear :: Integer -> Bool

という関数がすでに用意されています。


晴れの特異日という言葉がありますが、
大自然は一体どんな計算をしてうるう年を算出しているのでしょうか。

0 件のコメント:

コメントを投稿