-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday18_1.hs
35 lines (28 loc) · 890 Bytes
/
day18_1.hs
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
32
33
main = do
contents <- readFile "day18_input"
--contents <- readFile "day18_input_test"
let input = lines contents
-- Part 1
res = solveTop <$> input
print $ sum res
solveTop::String -> Int
solveTop s =
let r = solveIter (0, (+)) s
in fst $ fst r
solveIter::Expr -> String -> (Expr,String)
solveIter c [] = (c,[])
solveIter c s =
if head s == ')'
then (c,tail s)
else let (newC, newS) = solve c s
in solveIter newC newS
solve::Expr -> String -> (Expr, String)
solve (num, op) (x:xs) =
case x of '+' -> ((num, (+)), xs)
'*' -> ((num, (*)), xs)
' ' -> ((num, op), xs)
'(' -> let ((r,s), ys) = solveIter (0, (+)) xs
in ((op num r, s), ys)
i -> let res = op num ((read::String->Int) [i])
in ((res, (+)), xs)
type Expr = (Int, Int->Int->Int)