-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDay03.hs
More file actions
35 lines (25 loc) · 1.05 KB
/
Day03.hs
File metadata and controls
35 lines (25 loc) · 1.05 KB
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
module Day03 (task01, task02) where
import Data.Char
-- import Debug.Trace (trace)
type Bank = [Int]
type Digits = [Int]
task01 :: String -> String
task01 content = show $ sum $ map ( (`toJoltage` 2) . toBank) (lines content)
task02 :: String -> String
task02 content = show $ sum $ map ( (`toJoltage` 12) . toBank) (lines content)
toJoltage :: Bank -> Int -> Int
toJoltage bank n = digitsToJoltage $ toJoltageDigits bank n
toJoltageDigits :: Bank -> Int -> [Int]
toJoltageDigits _ 0 = []
toJoltageDigits bank n =
let candidates = take (length bank - new_n) bank
new_n = n - 1
(digit, digit_idx) = idxMax candidates
remaining_bank = drop (digit_idx + 1) bank
in digit:toJoltageDigits remaining_bank new_n
idxMax :: Bank -> (Int, Int)
idxMax bank = foldl (\(max_battery, max_idx) (battery, curr_idx) -> if battery > max_battery then (battery, curr_idx) else (max_battery, max_idx)) (0, 0) (zip bank [0..])
digitsToJoltage :: Digits -> Int
digitsToJoltage = foldl (\acc d -> acc * 10 + d) 0
toBank :: String -> [Int]
toBank = map digitToInt