aboutsummaryrefslogtreecommitdiff
path: root/haskell/099-largest_exponential.hs
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2019-09-05 02:40:30 +0200
committerCharles <sircharlesaze@gmail.com>2019-09-05 02:40:30 +0200
commit87f0a52d00b38198bbfa36b5febb257078080d6e (patch)
tree1ac2375d5fe33184c7b34ac8316e6d427e3d8412 /haskell/099-largest_exponential.hs
parente552bfe30c1640ed106a8dd95c3b0cbfbd3d5060 (diff)
downloadproject_euler-87f0a52d00b38198bbfa36b5febb257078080d6e.tar.gz
project_euler-87f0a52d00b38198bbfa36b5febb257078080d6e.tar.bz2
project_euler-87f0a52d00b38198bbfa36b5febb257078080d6e.zip
problem 099 haskell, wip 058
Diffstat (limited to 'haskell/099-largest_exponential.hs')
-rw-r--r--haskell/099-largest_exponential.hs30
1 files changed, 30 insertions, 0 deletions
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