aboutsummaryrefslogtreecommitdiff
path: root/haskell
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2019-08-18 16:20:54 +0200
committerCharles <sircharlesaze@gmail.com>2019-08-18 16:20:54 +0200
commit5f0ae4934ddec8ecab663e5702e1c0c4b1c50b6f (patch)
tree62dc51eb2f52080da0ad704aa5da3ac5eaeadbb5 /haskell
parent3b6b65b08b16cde07a4d8870e829a8c4b5e5d773 (diff)
downloadproject_euler-5f0ae4934ddec8ecab663e5702e1c0c4b1c50b6f.tar.gz
project_euler-5f0ae4934ddec8ecab663e5702e1c0c4b1c50b6f.tar.bz2
project_euler-5f0ae4934ddec8ecab663e5702e1c0c4b1c50b6f.zip
haskell problem 67
Diffstat (limited to 'haskell')
-rw-r--r--haskell/067-maximum_path_sum_II.hs38
1 files changed, 38 insertions, 0 deletions
diff --git a/haskell/067-maximum_path_sum_II.hs b/haskell/067-maximum_path_sum_II.hs
new file mode 100644
index 0000000..7e27424
--- /dev/null
+++ b/haskell/067-maximum_path_sum_II.hs
@@ -0,0 +1,38 @@
+-- Maximum path sum II
+--
+-- Problem 67
+-- By starting at the top of the triangle below and moving to adjacent
+-- numbers on the row below, the maximum total from top to bottom is 23.
+--
+-- 3
+-- 7 4
+-- 2 4 6
+-- 8 5 9 3
+--
+-- That is, 3 + 7 + 4 + 9 = 23.
+--
+-- Find the maximum total from top to bottom in triangle.txt
+-- (right click and 'Save Link/Target As...'), a 15K text file containing a triangle
+-- with one-hundred rows.
+--
+-- NOTE: This is a much more difficult version of Problem 18. It is not possible to
+-- try every route to solve this problem, as there are 299 altogether! If
+-- you could check one trillion (1012) routes every second it would take over
+-- twenty billion years to check them all. There is an efficient algorithm to solve it. ;o)
+
+
+main = do
+ content <- readFile "../data/067_triangle.txt"
+ print (head $ maxPath $ parseTriangle content)
+
+-- recursion is beautiful (always)
+maxPath :: [[Int]] -> [Int]
+maxPath [r] = r
+maxPath (top : bottom) = zipWith (+) top (maxRow $ maxPath bottom)
+
+maxRow :: [Int] -> [Int]
+maxRow [x] = []
+maxRow r = max (head r) (r !! 1) : maxRow (tail r)
+
+parseTriangle :: String -> [[Int]]
+parseTriangle str = map (\l -> map (\n -> read n :: Int) (words l)) (lines str)