7 read :: *File -> [(Char, Int)]
10 | l.[size l - 1] <> '\n' = []
11 = [(l.[0], toInt (l % (1, size l - 2))):read f]
16 = (\s->abs s.sx+abs s.sy)
17 $ foldl move {sx=0,sy=0,wx=10,wy=1} ls
19 :: Ship = { sx :: Int, sy :: Int, wx :: Int, wy :: Int }
21 move s ('N', n) = {s & wy=s.wy+n}
22 move s ('S', n) = {s & wy=s.wy-n}
23 move s ('E', n) = {s & wx=s.wx+n}
24 move s ('W', n) = {s & wx=s.wx-n}
28 # s = {s & sx=s.sx+dx*n, sy=s.sy+dy*n}
29 = {s & wx=s.sx+dx, wy=s.sy+dy}
30 move s ('R', n) = rot (n/90) s
31 move s ('L', n) = rot (3*(n/90)) s
33 //https://stackoverflow.com/questions/2259476/rotating-a-point-about-another-point-2d/25196651#25196651
34 rot :: Int Ship -> Ship
36 rot n ship=:{sx, sy, wx, wy}
37 # s = toInt (sin 90.0)
38 # c = toInt (cos 90.0)
39 # nx = sx + ( (wx-sx) * c + (wy-sy) * s)
40 # ny = sy + (~(wx-sx) * s + (wy-sy) * c)
41 = rot (n-1) {ship & wx=nx, wy=ny}