From 87f0a52d00b38198bbfa36b5febb257078080d6e Mon Sep 17 00:00:00 2001 From: Charles Date: Thu, 5 Sep 2019 02:40:30 +0200 Subject: problem 099 haskell, wip 058 --- haskell/099-largest_exponential.hs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 haskell/099-largest_exponential.hs (limited to 'haskell/099-largest_exponential.hs') diff --git a/haskell/099-largest_exponential.hs b/haskell/099-largest_exponential.hs new file mode 100644 index 0000000..68fcc00 --- /dev/null +++ b/haskell/099-largest_exponential.hs @@ -0,0 +1,30 @@ +------ +-- Largest exponential +-- Problem 99 +-- +-- Comparing two numbers written in index form like 211 and 37 is not difficult, +-- as any calculator would confirm that 211 = 2048 < 37 = 2187. +-- However, confirming that 632382518061 > 519432525806 would be much more difficult, +-- as both numbers contain over three million digits. +-- Using base_exp.txt (right click and 'Save Link/Target As...'), a 22K text file +-- containing one thousand lines with a base/exponent pair on each line, determine which +-- line number has the greatest numerical value. +-- NOTE: The first two lines in the file represent the numbers in the example given above. +------ + + +import Data.List(elemIndex, maximumBy) +import Data.Maybe(fromJust) + +main = do + content <- readFile "../data/099_base_exp.txt" + let base_exp = map (map (\s -> read s :: Integer) . split ',') $ lines content + print (fst $ maximumBy (\(i, be1) (j, be2) -> compare be1 be2) + $ map (\(i, be) -> (i, head be ^ last be)) $ zip [1..] base_exp) + +split :: Eq a => a -> [a] -> [[a]] +split _ [] = [[]] +split delim str = + let (before, remainder) = span (/= delim) str + in before : case remainder of [] -> [] + x -> split delim $ tail x -- cgit