1
[aoc20.git] / 12 / one.icl
1 module one
2
3 import StdEnv
4 import Data.Func
5 import Data.Tuple
6
7 read :: *File -> [(Char, Int)]
8 read f
9 # (l, f) = freadline f
10 | l.[size l - 1] <> '\n' = []
11 = [(l.[0], toInt (l % (1, size l - 2))):read f]
12
13 Start w
14 # (io, w) = stdio w
15 # ls = read io
16 = (\s->abs s.x+abs s.y) $ foldl move {x=0,y=0,dirs=dirs} ls
17
18 dirs = [(1, 0),(0,-1),(-1,0),(0,1):dirs]
19
20 :: Ship = {x :: Int, y :: Int, dirs :: [(Int, Int)]}
21
22 move s ('N', n) = {s & y=s.y+n}
23 move s ('S', n) = {s & y=s.y-n}
24 move s ('E', n) = {s & x=s.x+n}
25 move s ('W', n) = {s & x=s.x-n}
26 move s=:{dirs=[(dx, dy):_]} ('F', n) = {s & x=s.x+dx*n, y=s.y+dy*n}
27 move s ('R', n) = {s & dirs=drop (n/90) s.dirs}
28 move s ('L', n) = {s & dirs=drop (3*(n/90)) s.dirs}