当メモは2012-08-01に投稿されたものを加筆修正し、再掲したものです。
みなさまもお好きな言語で解いてみてくださいね。
目次
お題
うるう年チェックを行うプログラムを作成せよ。 うるう年の定義は以下とする: ・西暦年が4で割り切れる年は(原則として)うるう年。 ・ただし、西暦年が100で割り切れる年は(原則として)平年。 ・ただし、西暦年が400で割り切れる年は必ずうるう年。
Groovyで解いてみた
2023-09-06 更新java.util.Calendar#getActualMaximum(Calendar.DAY_OF_YEAR)
を利用してGroovyで解いてみました。DAY_OF_YEAR
は年の日数で、これが366
であればうるう年として判定するという作戦です。- Groovyからは簡単にJavaが呼べるので、Javaで解いてみたの方と同様に
java.time.Year
のisLeap
を使うことも可能ですが、敢えてここでは違う方法で解いています。2023-09-06 更新
// Integerに閏年判定メソッドを追加 Integer.metaClass { isLeapYear = { Date.parse('yyyy-MM-dd', "${delegate}-12-31")[Calendar.DAY_OF_YEAR] == 366 } } assert 2012.leapYear, '4で割り切れるの年は閏年' assert !2100.leapYear, 'でも100で割り切れる年は閏年ではない' assert !2200.leapYear, 'でも100で割り切れる年は閏年ではない' assert !2300.leapYear, 'でも100で割り切れる年は閏年ではない' assert !2500.leapYear, 'でも100で割り切れる年は閏年ではない' assert 2000.leapYear, 'でもでも400で割り切れる年はやっぱり閏年' assert 2400.leapYear, 'でもでも400で割り切れる年はやっぱり閏年'
- Groovyらしく、IntegerにisLeapYearメソッドを追加定義してみました
- getActualMaximum使うのも面倒だったので、12/31のDAY_OF_YEARを取得する戦略にしています
- 使い方は 2012.leapYear とかでOK(2012.leapYear は 2012.isLeapYear() の略記法で、プロパティとしてアクセスしています。)
参考サイト
Javaで解いてみた
2023-09-06 更新Javaであれば、java.time.Year
のisLeap
を使うことでチェック可能です。
package sample; import java.time.Year; public class Main { public static void main(String[] args) { System.out.println("2020 " + Year.isLeap(2020)); // => true 4で割り切れるの年は閏年 System.out.println("2100 " + Year.isLeap(2100)); // => false でも100で割り切れる年は閏年ではない System.out.println("2400 " + Year.isLeap(2400)); // => true でもでも400で割り切れる年はやっぱり閏年 } }
実行結果
2020 true 2100 false 2400 true