0 | module Years.Y2015.Day1
 1 |
 2 | import Control.Eff
 3 |
 4 | import Runner
 5 |
 6 | %default total
 7 |
 8 | trackFloor : (start : Integer) -> (xs : List Char) -> Integer
 9 | trackFloor start [] = start
10 | trackFloor start ('(' :: xs) = trackFloor (start + 1) xs
11 | trackFloor start (')' :: xs) = trackFloor (start - 1) xs
12 | trackFloor start (x :: xs) = trackFloor start xs
13 |
14 | findBasement : (position : Nat) -> (currentFloor : Integer) -> (xs : List Char)
15 |   -> Nat
16 | findBasement position currentFloor [] = position
17 | findBasement position currentFloor ('(' :: xs) =
18 |   findBasement (position + 1) (currentFloor + 1) xs
19 | findBasement position currentFloor (')' :: xs) =
20 |   if currentFloor <= 0
21 |     then position
22 |     else findBasement (position + 1) (currentFloor - 1) xs
23 | findBasement position currentFloor (x :: xs) =
24 |   findBasement (position + 1) currentFloor xs
25 |
26 | part1 : Eff (PartEff String) (Integer, ())
27 | part1 = do
28 |   input <- map unpack $ askAt "input"
29 |   let output = trackFloor 0 input
30 |   pure (output, ())
31 |
32 | part2 : () -> Eff (PartEff String) Nat
33 | part2 x = do
34 |   input <- map unpack $ askAt "input"
35 |   pure $ findBasement 1 0 input
36 |
37 | public export
38 | day1 : Day
39 | day1 = Both 1 part1 part2
40 |