Day 12 Parts 1 and 2
This commit is contained in:
parent
80c393e6ba
commit
1126125b3d
5 changed files with 863 additions and 1 deletions
|
@ -2,7 +2,7 @@
|
|||
|
||||
My (attempted) solutions to [Advent of Code 2020](https://adventofcode.com/2020) in Elixir.
|
||||
|
||||
<img width="975" alt="image" src="https://user-images.githubusercontent.com/498229/101872701-0a2b3080-3bc9-11eb-97da-884b52168ecc.png">
|
||||
<img width="975" alt="image" src="https://user-images.githubusercontent.com/498229/101977622-1a5b1280-3c92-11eb-8dc5-73c0998623e0.png">
|
||||
|
||||
## Strategy
|
||||
|
||||
|
|
47
day12/README
Normal file
47
day12/README
Normal file
|
@ -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 😊
|
28
day12/day12part1.exs
Normal file
28
day12/day12part1.exs
Normal file
|
@ -0,0 +1,28 @@
|
|||
defmodule Day12Part1 do
|
||||
def run do
|
||||
File.read!("input")
|
||||
|> String.split("\n", trim: true)
|
||||
|> Enum.map(fn <<action::binary-1>> <> 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()
|
28
day12/day12part2.exs
Normal file
28
day12/day12part2.exs
Normal file
|
@ -0,0 +1,28 @@
|
|||
defmodule Day12Part2 do
|
||||
def run do
|
||||
File.read!("input")
|
||||
|> String.split("\n", trim: true)
|
||||
|> Enum.map(fn <<action::binary-1>> <> 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()
|
759
day12/input
Normal file
759
day12/input
Normal file
|
@ -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
|
Loading…
Reference in a new issue