2014年3月12日水曜日

プロジェクトオイラー問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日)中に月の初めが日曜日になるのは何回あるか?

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2019



解法
zellerの公式で一発

mon(1,13):-!.
mon(2,14):-!.
mon(MM,MM):-!.
zeller(YY,MM,DD,H):-
       mon(MM,M),
       (12<M->YY1 is YY-1;YY1 is YY),
       Y is YY1 mod 100,
       C is YY1//100,
       H is (DD+(26*M+26)//10+Y+Y//4-2*C+C//4) mod 7.

week2(1):-
       between(1900,2000,YY),
       between(1,12,MM),
       zeller(YY,MM,1,K),
       K=:=2.

main19:-
       findall(C,week2(C),Count),
       length(Count,Ans),
       write(Ans).

0 件のコメント:

コメントを投稿