sironekotoroの日記

Perl で楽をしたい

Perl でうるう年判定

最近こんなツイートを見かけました。

ってわけで、このブログでうるう年の判定とか書いてたよなぁ・・・と思って検索したら書いてなかったという。あれー?

Perl でうるう年判定

条件分岐を教えるネタというと FizzBuzz なんですが、うるう年判定もいいかもしれないですね。

以下、wikipedia から拾ってきたうるう年判定の条件です。

  1. 400で割り切れる場合は閏年
  2. 400で割り切れず、100で割り切れる場合は平年
  3. 条件 1. と 2. を両方とも満たさない(400で割り切れず、かつ100でも割り切れない)場合、4で割り切れれば閏年、そうでなければ平年

ja.wikipedia.org

素直に書いてみました。

#!/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 行でうるう年判定

検索してたら、東工大にいらっしゃる出口弘先生が神戸女学院大学にいた頃のページが出てきました。

wwws.kobe-c.ac.jp

C言語で解くうるう年の問題(閏年の判定)がのってます。

そこにこんな一文が

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日生まれの人は平年のいつ歳を取るのか?とか知らなくてへぇ〜!ってなったトークでした。

logmi.jp

ところで

「最近こんなツイートを見かけました」から始まるのって定型文ぽくて、昔そういう短編みたなぁ・・・ってちょっと記憶さぐったら、夏目漱石の「夢十夜」でした。

漱石先生は「こんな夢を見た。」から書き始めてますね。しっかし激エモだなぁ・・・

「死んだら、埋めて下さい。大きな真珠貝で穴を掘って。そうして天から落ちて来る星の破片を墓標に置いて下さい。そうして墓の傍に待っていて下さい。また逢いに来ますから」

www.aozora.gr.jp