diff --git a/README.md b/README.md index e5410ac..bb03303 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ My (attempted) solutions to [Advent of Code 2020](https://adventofcode.com/2020) in Elixir. -image +image ## Strategy diff --git a/day12/README b/day12/README new file mode 100644 index 0000000..2f72caa --- /dev/null +++ b/day12/README @@ -0,0 +1,47 @@ +Day 12 Notes + ++--------+ +| Part 1 | ++--------+ + +$ elixir day12part1.exs +923 + +Thoughts: + +This was pretty fun :-) + +I spent ages fixing stupid typos and didn't realise I'd forgotten to take account for the fact that +a rotation command could contain more than 90 degrees. I submitted so many wrong answers I had to +wait 3 minutes to submit the correct one... oops. + +Decided to store the direction as an {x, y} vector, and handle rotations as just flipping the +values as required. Use recursion to do it repetedly for rotations of more than 90 degrees. + +NSEW operations are just simply adjusting the coordinates as required. + +For F, apply the vector to the boat's current position. + ++--------+ +| Part 2 | ++--------+ + +$ elixir day12part2.exs +24769 + +Thoughts: + +Interesting. The fact that the waypoint moves when the boat moves makes this part very simple. + +Thankfully I stored the rotation as a vector in part 1, which is basically the waypoint +fixed at a distance of 1. So for this part, can just adjust the NSEW commands to move the +waypoint/vector instead of the boat. + +The rest of the commands are the same. + ++------------------+ +| Overall Thoughts | ++------------------+ + +I liked this one. Figuring out how to do the rotation efficiently probably took the most time, +but I'm pretty happy with the results 😊 diff --git a/day12/day12part1.exs b/day12/day12part1.exs new file mode 100644 index 0000000..b7e38ae --- /dev/null +++ b/day12/day12part1.exs @@ -0,0 +1,28 @@ +defmodule Day12Part1 do + def run do + File.read!("input") + |> String.split("\n", trim: true) + |> Enum.map(fn <> <> value -> {action, String.to_integer(value)} end) + |> Enum.reduce({0, 0, {1, 0}}, &process/2) + |> manhattan_distance() + |> IO.puts() + end + + def process({"N", value}, {x, y, direction}), do: {x, y + value, direction} + def process({"S", value}, {x, y, direction}), do: {x, y - value, direction} + def process({"E", value}, {x, y, direction}), do: {x + value, y, direction} + def process({"W", value}, {x, y, direction}), do: {x - value, y, direction} + def process({"L", value}, {x, y, direction}), do: {x, y, turn_left(direction, value)} + def process({"R", value}, {x, y, direction}), do: {x, y, turn_right(direction, value)} + def process({"F", value}, {x, y, {vx, vy}}), do: {x + vx * value, y + vy * value, {vx, vy}} + + def turn_left(direction, 0), do: direction + def turn_left({vx, vy}, degrees), do: turn_left({-vy, vx}, degrees - 90) + + def turn_right(direction, 0), do: direction + def turn_right({vx, vy}, degrees), do: turn_right({vy, -vx}, degrees - 90) + + def manhattan_distance({x, y, _}), do: abs(x) + abs(y) +end + +Day12Part1.run() diff --git a/day12/day12part2.exs b/day12/day12part2.exs new file mode 100644 index 0000000..11c6dad --- /dev/null +++ b/day12/day12part2.exs @@ -0,0 +1,28 @@ +defmodule Day12Part2 do + def run do + File.read!("input") + |> String.split("\n", trim: true) + |> Enum.map(fn <> <> value -> {action, String.to_integer(value)} end) + |> Enum.reduce({{0, 0}, {10, 1}}, &process/2) + |> manhattan_distance() + |> IO.puts() + end + + def process({"N", value}, {boat, {vx, vy}}), do: {boat, {vx, vy + value}} + def process({"S", value}, {boat, {vx, vy}}), do: {boat, {vx, vy - value}} + def process({"E", value}, {boat, {vx, vy}}), do: {boat, {vx + value, vy}} + def process({"W", value}, {boat, {vx, vy}}), do: {boat, {vx - value, vy}} + def process({"L", value}, {boat, waypoint}), do: {boat, rotate_left(waypoint, value)} + def process({"R", value}, {boat, waypoint}), do: {boat, rotate_right(waypoint, value)} + def process({"F", value}, {{x, y}, {vx, vy}}), do: {{x + vx * value, y + vy * value}, {vx, vy}} + + def rotate_left(waypoint, 0), do: waypoint + def rotate_left({vx, vy}, degrees), do: rotate_left({-vy, vx}, degrees - 90) + + def rotate_right(waypoint, 0), do: waypoint + def rotate_right({vx, vy}, degrees), do: rotate_right({vy, -vx}, degrees - 90) + + def manhattan_distance({{x, y}, _}), do: abs(x) + abs(y) +end + +Day12Part2.run() diff --git a/day12/input b/day12/input new file mode 100644 index 0000000..ed8be96 --- /dev/null +++ b/day12/input @@ -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