-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay25.hs
56 lines (48 loc) · 1.45 KB
/
Day25.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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
{-# LANGUAGE LambdaCase #-}
module Day25 (solve) where
import Data.Function ( (&) )
solve input lines = do
putStrLn $ foldl1 add lines
putStrLn "Merry Christmas"
-- 'Tis the season for symbilic manipulation
add numA numB = do
let len = max (length numA) (length numB)
let zeros = repeat '0'
let prep n = reverse n ++ zeros & take len
let (a, b) = (prep numA, prep numB)
foldl
(\ (acc, carry) (digA, digB) -> do
let [digCarry, digSum] = addDigits digA digB
let [carCarry, carSum] = addDigits digSum carry
let [_, carry'] = addDigits digCarry carCarry
(carSum : acc, carry'))
("", '0')
(zip a b)
& \ case (acc, '0') -> acc; (acc, c) -> c : acc
addDigits a b =
case (a, b) of
('2', '2') -> "1-"
('2', '1') -> "1="
('2', '0') -> "02"
('2', '-') -> "01"
('2', '=') -> "00"
('1', '2') -> "1="
('1', '1') -> "02"
('1', '0') -> "01"
('1', '-') -> "00"
('1', '=') -> "0-"
('0', '2') -> "02"
('0', '1') -> "01"
('0', '0') -> "00"
('0', '-') -> "0-"
('0', '=') -> "0="
('-', '2') -> "01"
('-', '1') -> "00"
('-', '0') -> "0-"
('-', '-') -> "0="
('-', '=') -> "-2"
('=', '2') -> "00"
('=', '1') -> "0-"
('=', '0') -> "0="
('=', '-') -> "-2"
('=', '=') -> "-1"