« Haskell の fibonacci が遅い理由が分かった | トップページ | Project Euler : Problem 48 »

2010年9月13日 (月)

Project Euler : Problem 47

 問題はこちらをご覧ください。
 また、自作の "ForEuler module" に関してはこちらをご覧ください。

 

 私が Haskell のコードを書く場合、関数を使って「データをどう加工していくか」を中心に考えていることが多いようです。(『「Lisp脳」の謎に迫る - Schemeプログラマの発想』の影響が大きいのかもしれません)
 例えば今回の問題の場合、まず『ある数』とその数の『素因数の数』の集合を作ってみようと考えました。

ns1 = [(n, length $ factorize n) | n <- [2 * 3 * 5 * 7 ..]]
 次にこの "ns1" を加工して 1 個ずつずれた 4 個ずつの塊にしていきました。
ns2 = map (take 4) $ tails ns1
 この "ns2" は "[[(210,4),(211,1),(212,2),(213,2)],[(211,1),(212,2),(213,2),(214,2)] ..]" といった構造になっています。
 その次に "ns2" の要素の中で「素因数の数がすべて 4 であるもの」だけを抽出しました。
ns3 = filter check ns2 check xs = and [x == 4 | (_, x) <- xs]
 最後に "ns3" の先頭の先頭の要素だけを取り出せば、それが求める答えのはず……。
problem047 = fst $ head $ head ns3
 "ns1", "ns2", "ns3", "check" などはトップレベルに置いておく必要もない(置いておくべきではない)と思ったので、最終的にはこうなりました。
import ForEuler (factorize) import Data.List (tails) problem047 :: Integer problem047 = fst $ head $ head ns3 where ns1 = [(n, length $ factorize n) | n <- [2 * 3 * 5 * 7 ..]] ns2 = map (take 4) $ tails ns1 ns3 = filter check ns2 check xs = and [x == 4 | (_, x) <- xs] main :: IO () main = print problem047

« Haskell の fibonacci が遅い理由が分かった | トップページ | Project Euler : Problem 48 »

Haskell」カテゴリの記事

Project Euler」カテゴリの記事

コメント

コメントを書く

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

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

トラックバック

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

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

« Haskell の fibonacci が遅い理由が分かった | トップページ | Project Euler : Problem 48 »

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            
フォト

最近のトラックバック

無料ブログはココログ