今回解いたProjectEulerの問題は45番のこちら!
三角数、五角数、六角数のうち40755の次に共通する数を求める問題。
わたしのコードはこちら!
三角数、五角数、六角数の無限リストを定義。
あるリストの第一要素を他の2つのリストの第一要素を比べて、どちらかよりも値が小さかったらそのリストを前に進め、前に進めたリスト・2つのリストに対してもう一回調べる、という再帰的なgetCommon関数を定義。説明が下手😭
45.hs
triangles :: [Int]
triangles = [n*(n + 1) `div` 2 | n <- [1..] ]
pentagonals :: [Int]
pentagonals = [n*(3*n - 1) `div` 2 | n <- [1..] ]
hexagonals :: [Int]
hexagonals = [n*(2*n - 1) | n <- [1..] ]
getCommon :: [Int] -> [Int] -> [Int] -> [Int]
getCommon (x:xs) (y:ys) (z:zs)
| x == y && y == z = x : getCommon xs ys zs
| x < y = getCommon xs (y:ys) (z:zs)
| y < z = getCommon (x:xs) ys (z:zs)
| otherwise = getCommon (x:xs) (y:ys) zs
main :: IO ()
main = do
let common = take 3 $ getCommon triangles pentagonals hexagonals
print common
(ちなみに解答は1533776805)
=> [1,40755,1533776805]
必要な値が参照されたときに初めて計算されるという特徴 遅延評価を活かして、効率良く解を求められている!😳(他の言語だと無限リスト作れなかったり、全部計算する必要があるから計算効率が悪かったりする)
すごい!!!!個人的革命😳❤️🔥