13, blurp
[aoc20.git] / 13 / one.icl
1 module one
2
3 import StdEnv
4 import Data.Func
5
6 inp :: (Int, [?Int])
7 inp = (1000067, [?Just 17,?None,?None,?None,?None,?None,?None,?None,?None,?None,?None,?Just 37,?None,?None,?None,?None,?None,?Just 439,?None,?Just 29,?None,?None,?None,?None,?None,?None,?None,?None,?None,?None,?Just 13,?None,?None,?None,?None,?None,?None,?None,?None,?None,?Just 23,?None,?None,?None,?None,?None,?None,?None,?Just 787,?None,?None,?None,?None,?None,?None,?None,?None,?None,?Just 41,?None,?None,?None,?None,?None,?None,?None,?None,?Just 19])
8
9 Start = (one inp, two inp)
10
11 one (cur, bs) = uncurry (*) $ hd $ sort [(b - cur rem b, b)\\(?Just b)<-bs]
12
13 two (start, busses)
14 # b=:[(_, mbo):_] = sortBy (>) [(b, i)\\(?Just b)<-busses & i<-[0..]]
15 = snd (foldl (crt mbo) (1, start) b) - mbo
16 where
17 crt max_bus_offset (max_bus, startpoint) (next_biggest_bus, next_offset)
18 # startpoint = while
19 (\sp->(sp+next_offset-max_bus_offset) rem next_biggest_bus <> 0)
20 (\sp->sp + max_bus)
21 startpoint
22 = (max_bus*next_biggest_bus, startpoint)