« Project Euler : Problem 18 | トップページ | Project Euler : Problem 20 ~ 整数 ⇌ リスト »

2010年4月20日 (火)

Project Euler : Problem 19

 問題はこちらをご覧ください。

 

 地道に計算するのが嫌だったのでネットで調べていたら、日付から曜日を算出する「Zeller の公式」というものを見つけました。
 いくつかのバリエーションがあるようだったので Haskell のコードに落としやすそうなものを一つ選んで、関数を作ってみました。

-- Zeller の公式(の変形 ?) -- 0 : Sun, 1 : Mon, 2 : Tue .. zeller :: Int -> Int -> Int -> Int zeller y m d | m < 3 = zeller (y - 1) (m + 12) d | otherwise = rem (y + a - b + c + d + e) 7 where [a, b, c] = map (div y) [4, 100, 400] e = div (13 * m + 8) 5 problem019 :: Int problem019 = length [(y, m) | y <- [1901 .. 2000], m <- [1 .. 12], zeller y m 1 == 0] main = print problem019

 さらに調べたところ、Haskell には "Data.Time.Calendar", "Data.Time.Calendar.WeekDate" などという便利なライブラリがありました。(ただし、私の環境 (Ubuntu 9.10) では別途インストールする必要がありました)

import Data.Time.Calendar import Data.Time.Calendar.WeekDate problem019 :: Int problem019 = length sundays where years = [1901 .. 2000] days = [fromGregorian y m 1 | y <- years, m <- [1 .. 12]] sundays = [d | d <- days, let (_, _, w) = toWeekDate d, w == 7] main = print problem019

« Project Euler : Problem 18 | トップページ | Project Euler : Problem 20 ~ 整数 ⇌ リスト »

Haskell」カテゴリの記事

Project Euler」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/112020/48134999

この記事へのトラックバック一覧です: Project Euler : Problem 19:

« Project Euler : Problem 18 | トップページ | Project Euler : Problem 20 ~ 整数 ⇌ リスト »

2016年7月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
フォト

最近のトラックバック

無料ブログはココログ