「プロジェクトオイラー問19」の編集履歴(バックアップ)一覧はこちら
「プロジェクトオイラー問19」(2014/02/13 (木) 16:51:18) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
http://projecteuler.net/problem=19
Problem 19 「日曜日の数え上げ」 †
次の情報が与えられている.
1900年1月1日は月曜日である.
9月, 4月, 6月, 11月は30日まであり, 2月を除く他の月は31日まである.
2月は28日まであるが, うるう年のときは29日である.
うるう年は西暦が4で割り切れる年に起こる. しかし, 西暦が400で割り切れず100で割り切れる年はうるう年でない.
20世紀(1901年1月1日から2000年12月31日)中に月の初めが日曜日になるのは何回あるか?
解法
問題のほうで日数計算に必要なデータが提示されているので、出題の意図を読んでそれをつかって計算するのが正しいと思いますが。
ツェラーの公式で手抜きしました。
zellers(Y,M,D,Result):-
(M<3 -> M1 is M+12,Y1 is (Y-1) mod 100;M1 is M,Y1 is Y mod 100),
C is Y1//100,
Result is (D+(26*M1+26)//10+Y1+Y1//4-2*C+C//4) mod 7.
search(1):-
between(1901,2000,Y),
between(1,12,M),
zellers(Y,M,1,W),
W=:=2.
main19:-
findall(W,search(W),Ws),
length(Ws,Len),
write(Len).