-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathDay19.hs
51 lines (40 loc) · 1.2 KB
/
Day19.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
module Main where
import Utilities
import Data.Sequence (Seq, ViewL(..), ViewR(..), (|>), (><))
import qualified Data.Sequence as Seq
-- original positions only -- number of presents is unused
type State = Seq Int
initState :: Int -> State
initState n = Seq.fromList $ [1..n]
play :: State -> Int
play elves = case Seq.viewl elves of
EmptyL -> error "empty list"
e :< elves' -> case Seq.viewl elves' of
EmptyL -> e
_ :< elves'' -> play (elves'' |> e)
solve1 :: Int -> Int
solve1 = play . initState
tests1 :: [(Int, Int)]
tests1 = [(5, 3)]
-- Part Two --
play2 :: State -> Int
play2 elves = case Seq.viewl elves of
EmptyL -> error "empty list"
e :< elves' -> case Seq.viewr left of
EmptyR -> e
left' :> _ -> play2 ((left' >< right) |> e)
where
n = Seq.length elves'
(left, right) = Seq.splitAt ((n+1) `div` 2) elves'
solve2 :: Int -> Int
solve2 = play2 . initState
tests2 :: [(Int, Int)]
tests2 = [(5, 2)]
main :: IO ()
main = do
s <- readFile "input/19.txt"
let input = read s
putStr (unlines (failures "solve1" solve1 tests1))
print (solve1 input)
putStr (unlines (failures "solve2" solve2 tests2))
print (solve2 input)