diff --git a/haskellAoC/inputs/2020/12 b/haskellAoC/inputs/2020/12 new file mode 100644 index 0000000..ed8be96 --- /dev/null +++ b/haskellAoC/inputs/2020/12 @@ -0,0 +1,759 @@ +F70 +S4 +E3 +S4 +L90 +N4 +R90 +W3 +F75 +S5 +L90 +E1 +S4 +F98 +N4 +R90 +S3 +L90 +W1 +F39 +W2 +L90 +E1 +F99 +S3 +E5 +F63 +N4 +F26 +E1 +R180 +F58 +N3 +F4 +E1 +F45 +E4 +R90 +E3 +F76 +S1 +F22 +R90 +N1 +W1 +F76 +W1 +N5 +E3 +L180 +S5 +F87 +W4 +L90 +F9 +S2 +F11 +N4 +L180 +S3 +R90 +F92 +L90 +S1 +E4 +R90 +W1 +F1 +S2 +L90 +F27 +N3 +E1 +N1 +E3 +L180 +S1 +S5 +R180 +W5 +W5 +F60 +S5 +W5 +L270 +N3 +R90 +F65 +S5 +F53 +W5 +L90 +N1 +W5 +L180 +F87 +W2 +R180 +S2 +F77 +N1 +F81 +L180 +E5 +N5 +W4 +L90 +W4 +L90 +E3 +N2 +L90 +W2 +S1 +F19 +W1 +F82 +N4 +R270 +E5 +L90 +N3 +R90 +F81 +L270 +W3 +R90 +L270 +N3 +F53 +E2 +F84 +R90 +S2 +F39 +R180 +N1 +L90 +F11 +S2 +W5 +F20 +W1 +N4 +R90 +F76 +E3 +S5 +E3 +S5 +W5 +S2 +L90 +N3 +E3 +S5 +F27 +W1 +L90 +F65 +W3 +R180 +F84 +W2 +N5 +F43 +L180 +W3 +F11 +W2 +R90 +N1 +R90 +N5 +W1 +S4 +N4 +F88 +N3 +F87 +W3 +L90 +F77 +S5 +F18 +N4 +F97 +E5 +S5 +R90 +F94 +N5 +L180 +F8 +N4 +R90 +W2 +N2 +L180 +F4 +R90 +W4 +S3 +R90 +F38 +S3 +E1 +N5 +F4 +E3 +R90 +S4 +F95 +E5 +F77 +F32 +W5 +F3 +R90 +N1 +W3 +F96 +L270 +N2 +E2 +F30 +S3 +W2 +R90 +F57 +R90 +E1 +R90 +N5 +E1 +N4 +W4 +N1 +W2 +F47 +N5 +W3 +L90 +N4 +F50 +E3 +R90 +F27 +N3 +F78 +N2 +R90 +F100 +S3 +F67 +R90 +N4 +R90 +N4 +F88 +S4 +E2 +S2 +F31 +S5 +R90 +W3 +R180 +W2 +F97 +F31 +N1 +L90 +S4 +F50 +N3 +W2 +L180 +F85 +L180 +E3 +L90 +F95 +N4 +L90 +E1 +S2 +R180 +N2 +F19 +N5 +E5 +S1 +W5 +R90 +N1 +L180 +F76 +S4 +E5 +S2 +S5 +E3 +F53 +L90 +S3 +E4 +S1 +E1 +L90 +F54 +W1 +S1 +E2 +N1 +R90 +S3 +R90 +F63 +L90 +W4 +L90 +F47 +L90 +E5 +F23 +W2 +F97 +E3 +L90 +N4 +F54 +W3 +S4 +W3 +S2 +F67 +W1 +S4 +R90 +S5 +R90 +W4 +L180 +L90 +S4 +F19 +F42 +S4 +F91 +R90 +L180 +F64 +L180 +W4 +R90 +F32 +N3 +F18 +E2 +L180 +N4 +E2 +N1 +E4 +N4 +F54 +W5 +F50 +N3 +L90 +N5 +R90 +F100 +E4 +N1 +E3 +L90 +F8 +L90 +E4 +L270 +F95 +L90 +F44 +E5 +R90 +F79 +N5 +F61 +S2 +F71 +L90 +F4 +N3 +F25 +L180 +F7 +W4 +F96 +R90 +S1 +R90 +W1 +F9 +N2 +W5 +F1 +R90 +N2 +F36 +W4 +R90 +F96 +W2 +F26 +S2 +F28 +E4 +N1 +F33 +N5 +F51 +W2 +S1 +F40 +N3 +F67 +E3 +S2 +R90 +W1 +S3 +E3 +L90 +F75 +E3 +N5 +E2 +F52 +E3 +F7 +N4 +F4 +S4 +L90 +S2 +W5 +F85 +F7 +L180 +E1 +L90 +E2 +S3 +R180 +N3 +E2 +R90 +N5 +F6 +N2 +L90 +W1 +R90 +R90 +F91 +E2 +N4 +R90 +S2 +E3 +S3 +L90 +W3 +F61 +S1 +L90 +W3 +N2 +E1 +R180 +E2 +W5 +R90 +F65 +N4 +W3 +F54 +E1 +N3 +E5 +L180 +S4 +N3 +E5 +R90 +S3 +R90 +S4 +W4 +F31 +S5 +R90 +N2 +E3 +F49 +F47 +W3 +F79 +R270 +W2 +F90 +S3 +F73 +L180 +F14 +W4 +F27 +R90 +F75 +L90 +N5 +R90 +N4 +L90 +N4 +E2 +S1 +W1 +S4 +W5 +W1 +F7 +W5 +L180 +E1 +S1 +F82 +F36 +N2 +L90 +E1 +L90 +S4 +L180 +N2 +W3 +F21 +R270 +F18 +R180 +F93 +L90 +W2 +F4 +E1 +R90 +E2 +S3 +W4 +F30 +E1 +F69 +W5 +R90 +E2 +L180 +S4 +W1 +N1 +E3 +L90 +E3 +R90 +F69 +R90 +S2 +L90 +N4 +F13 +L90 +E2 +L90 +N2 +W2 +N5 +S4 +F70 +R90 +F67 +E4 +F62 +L270 +F98 +L90 +E5 +F15 +E5 +R90 +W3 +E2 +F25 +R180 +F7 +L180 +W4 +S3 +F42 +R180 +R270 +N1 +R180 +S2 +F37 +E2 +F72 +N5 +W5 +F61 +F43 +W3 +R90 +R270 +N5 +R270 +E4 +L90 +W4 +F31 +F43 +L180 +S3 +W4 +R90 +F20 +E2 +S5 +L90 +F75 +R90 +F52 +W3 +L90 +N5 +W5 +N4 +R90 +F52 +W3 +F91 +E1 +N2 +F81 +R90 +E2 +L90 +F24 +E2 +L180 +E1 +F55 +E1 +L90 +E5 +R90 +F23 +S3 +R180 +S3 +F8 +L180 +S1 +N3 +F90 +N5 +W3 +N4 +L90 +N3 +W5 +R90 +E4 +S4 +F89 +W3 +N2 +R90 +F18 +R180 +W5 +E4 +F100 +N4 +F40 +E3 +S2 +E2 +F16 +R90 +S2 +L180 +F58 +W1 +F70 +S1 +R90 +W3 +L90 +S4 +F48 +R90 +W1 +N5 +E3 +R90 +E1 +L90 +F1 +R90 +N1 +E3 +F39 +W3 +R90 +E3 +L90 +N5 +R90 +S3 +W4 +R180 +E1 +S3 +F56 +L90 +F98 +N2 +W4 +F67 +R90 +W3 +S1 +F33 +R90 +F42 +L90 +R90 +E4 +R90 +E3 +F74 +E4 +R270 +F62 +S5 +L90 +E4 +F21 diff --git a/haskellAoC/src/Y2020/Day12.hs b/haskellAoC/src/Y2020/Day12.hs new file mode 100644 index 0000000..81ecdbb --- /dev/null +++ b/haskellAoC/src/Y2020/Day12.hs @@ -0,0 +1,73 @@ +module Y2020.Day12 (y20day12) where + +data Instruction = + GoNorth Int | + GoSouth Int | + GoWest Int | + GoEast Int | + TurnLeft | + TurnRight | + TurnAround | + Forward Int deriving (Show) + +-- Orientations +-- Right = 0 +-- Bottom = 1 +-- Left = 2 +-- Top = 3 +data State = State { + pos :: (Int, Int) + , turn :: Int + } deriving (Show) + +data StateP2 = StateP2 { + shipPos :: (Int, Int) + , waypointPos :: (Int, Int) + } deriving (Show) + +parseInput :: String -> Instruction +parseInput ('N':n) = GoNorth (read n) +parseInput ('S':n) = GoSouth (read n) +parseInput ('W':n) = GoWest (read n) +parseInput ('E':n) = GoEast (read n) +parseInput ('F':n) = Forward (read n) +parseInput "L90" = TurnLeft +parseInput "L270" = TurnRight +parseInput "R90" = TurnRight +parseInput "R270" = TurnLeft +parseInput (_:"180") = TurnAround +parseInput _ = error "Wrong instruction" + +applyInstruction :: State -> Instruction -> State +applyInstruction (State (x, y) t) (GoNorth n) = State (x, y + n) t +applyInstruction (State (x, y) t) (GoSouth n) = State (x, y -n) t +applyInstruction (State (x, y) t) (GoWest n) = State (x - n, y) t +applyInstruction (State (x, y) t) (GoEast n) = State (x + n, y) t +applyInstruction (State p t) TurnRight = State p $ (t + 1) `mod` 4 +applyInstruction (State p t) TurnAround = State p $ (t + 2) `mod` 4 +applyInstruction (State p t) TurnLeft = State p $ (t + 3) `mod` 4 +applyInstruction (State (x, y) t) (Forward n) = State (moveForward t) t + where moveForward 0 = (x + n, y) + moveForward 1 = (x, y - n) + moveForward 2 = (x - n, y) + moveForward 3 = (x, y + n) + +applyInstructionP2 :: StateP2 -> Instruction -> StateP2 +applyInstructionP2 (StateP2 sp (x, y)) (GoNorth n) = StateP2 sp (x, y + n) +applyInstructionP2 (StateP2 sp (x, y)) (GoSouth n) = StateP2 sp (x, y - n) +applyInstructionP2 (StateP2 sp (x, y)) (GoWest n) = StateP2 sp (x - n, y) +applyInstructionP2 (StateP2 sp (x, y)) (GoEast n) = StateP2 sp (x + n, y) +applyInstructionP2 (StateP2 sp (x, y)) TurnLeft = StateP2 sp (-y, x) +applyInstructionP2 (StateP2 sp (x, y)) TurnRight = StateP2 sp (y, -x) +applyInstructionP2 (StateP2 sp (x, y)) TurnAround = StateP2 sp (-x, -y) +applyInstructionP2 (StateP2 (x, y) wp@(x', y')) (Forward n) = StateP2 (x + (n * x'), y + (n * y')) wp + +y20day12 :: [String] -> (String, String) +y20day12 input = (part1, part2) + where part1 = show $ sum $ map abs $ [fst endposP1, snd endposP1] + part2 = show $ sum $ map abs $ [fst endposP2, snd endposP2] + start = State (0, 0) 0 + startP2 = StateP2 (0, 0) (10, 1) + journey = map parseInput input + (State endposP1 _) = foldl applyInstruction start journey + (StateP2 endposP2 _) = foldl applyInstructionP2 startP2 journey diff --git a/haskellAoC/src/Y2020/Days.hs b/haskellAoC/src/Y2020/Days.hs index 6bb7894..acc7875 100644 --- a/haskellAoC/src/Y2020/Days.hs +++ b/haskellAoC/src/Y2020/Days.hs @@ -11,6 +11,7 @@ import Y2020.Day08 import Y2020.Day09 import Y2020.Day10 import Y2020.Day11 +import Y2020.Day12 year2020 :: String -> [String] -> (String, String) year2020 "01" = y20day01 @@ -24,3 +25,4 @@ year2020 "08" = y20day08 year2020 "09" = y20day09 year2020 "10" = y20day10 year2020 "11" = y20day11 +year2020 "12" = y20day12