Perl でうるう年判定
最近こんなツイートを見かけました。
ある日、私は引き継いだシステムのバグの対処をしていた。うるう年なのに2/29が表示されない。
— ありあ (@aria_nico) 2021年3月1日
プログラムを開くと、
If year=1992 or year=1996 or year=2000 then
という文字列があった。
百歩譲って、うるう年計算式を使わなくてもいいから、もっと長期の稼働を見越してほしい。そう思った冬の日
ってわけで、このブログでうるう年の判定とか書いてたよなぁ・・・と思って検索したら書いてなかったという。あれー?
Perl でうるう年判定
条件分岐を教えるネタというと FizzBuzz
なんですが、うるう年判定もいいかもしれないですね。
以下、wikipedia から拾ってきたうるう年判定の条件です。
- 400で割り切れる場合は閏年
- 400で割り切れず、100で割り切れる場合は平年
- 条件 1. と 2. を両方とも満たさない(400で割り切れず、かつ100でも割り切れない)場合、4で割り切れれば閏年、そうでなければ平年
素直に書いてみました。
#!/usr/bin/env perl use strict; use warnings; my $year = 1900; # 1. 400で割り切れる場合は閏年 # 2. 400で割り切れず、100で割り切れる場合は平年 # 3. 条件 1. と 2. を両方とも満たさない(400で割り切れず、かつ100でも割り切れない)場合、4で割り切れれば閏年、そうでなければ平年 if ( $year % 400 == 0 ) { print "うるう年!\n"; } elsif ( $year % 100 == 0 ) { print "平年\n"; } elsif ( $year % 4 == 0 ) { print "うるう年!\n"; } else { print "平年\n"; }
1 行でうるう年判定
検索してたら、東工大にいらっしゃる出口弘先生が神戸女学院大学にいた頃のページが出てきました。
そこにこんな一文が
isleap関数をif文を1個で実現してみよ
となると、論理演算子です。Wikipedia にも載ってるこれを使います
また、閏年の規則は次の一つだけの論理式に読み替えることもできる。
(400で割り切れる)または(100で割り切れずかつ4で割り切ることができる)ならば閏年、そうでなければ平年
if ( ( $year % 400 == 0 && $year % 100 != 0 ) || $year % 4 == 0 ) { print "うるう年!\n"; } else { print "平年\n"; }
1 個で書けというのがあるなら 1 行でかけってのもあるかなぁ、と書いてみました。三項演算子の重ねがけです。
print $year % 400 == 0 ? "うるう年" : $year % 100 == 0 ? "平年" : $year % 4 == 0 ? "うるう年" : "平年";
見やすく改行してみるとこうです。1 行じゃなくなってしまいますが・・・
print $year % 400 == 0 ? "うるう年" : $year % 100 == 0 ? "平年" : $year % 4 == 0 ? "うるう年" : "平年";
うるう年についての忘れられない話
2018年に開催された 設計Night2018 powered by Classi での @magnoria さんのこのトーク。2月29日生まれの人は平年のいつ歳を取るのか?とか知らなくてへぇ〜!ってなったトークでした。
ところで
「最近こんなツイートを見かけました」から始まるのって定型文ぽくて、昔そういう短編みたなぁ・・・ってちょっと記憶さぐったら、夏目漱石の「夢十夜」でした。
漱石先生は「こんな夢を見た。」から書き始めてますね。しっかし激エモだなぁ・・・
「死んだら、埋めて下さい。大きな真珠貝で穴を掘って。そうして天から落ちて来る星の破片を墓標に置いて下さい。そうして墓の傍に待っていて下さい。また逢いに来ますから」