« Project Euler : Problem 37 ~ 左右から切り詰め可能な素数 | トップページ | Project Euler : Problem 39 ~ ピタゴラス数 その2 »

2010年7月23日 (金)

Project Euler : Problem 38 ~ Pandigital な連結積

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

 

 今回も「Ruby 版」と同じ方法なので、解説はこちらをご覧ください。

import ForEuler (dexToList, listToDex, permutation, isPandigitalList) -- n の連結積を文字列の形で返す。 concatList :: [Int] -> [Int] concatList ns = iter ns $ map (dexToList . (* listToDex ns)) [2 ..] where iter prd (s : ss) | length prd < 9 = iter (prd ++ s) ss | otherwise = prd -- d 桁の数の連結積の中で最大の Pandigital 数を求める。 maxPNum :: Int -> Int maxPNum d = head $ pNums ++ [0] where pNums = [listToDex x | x <- [concatList y | y <- ys], isPandigitalList x] ys = permutation [9, 8 .. 1] d problem038 :: Int problem038 = maximum $ map maxPNum [1 .. 4] main :: IO () main = print problem038
 Haskell は遅延評価をしてくれるので、pNums の先頭の要素(つまり最大値)が見つかった時点で勝手に処理を終わらせてくれるので、それ以上無駄な計算をしません。
 ちなみに 13 行目の "++ [0]" は "pNums" が空リストだった時にエラーが出ないようにするためのものです。

« Project Euler : Problem 37 ~ 左右から切り詰め可能な素数 | トップページ | Project Euler : Problem 39 ~ ピタゴラス数 その2 »

Haskell」カテゴリの記事

Project Euler」カテゴリの記事

コメント

コメントを書く

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

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

トラックバック

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

この記事へのトラックバック一覧です: Project Euler : Problem 38 ~ Pandigital な連結積:

« Project Euler : Problem 37 ~ 左右から切り詰め可能な素数 | トップページ | Project Euler : Problem 39 ~ ピタゴラス数 その2 »

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

最近のトラックバック

無料ブログはココログ