diff --git a/2020/12/README.md b/2020/12/README.md new file mode 100644 index 0000000..24fc8a0 --- /dev/null +++ b/2020/12/README.md @@ -0,0 +1,70 @@ +# 2020 Day 12: Rain Risk +#### [Direct Link](https://adventofcode.com/2020/day/12) + +## Part 1 + +Your ferry made decent progress toward the island, but the storm came in faster than anyone expected. The ferry needs to take **evasive actions**! + +Unfortunately, the ship's navigation computer seems to be malfunctioning; rather than giving a route directly to safety, it produced extremely circuitous instructions. When the captain uses the [PA system](https://en.wikipedia.org/wiki/Public_address_system) to ask if anyone can help, you quickly volunteer. + +The navigation instructions (your puzzle input) consists of a sequence of single-character **actions** paired with integer input **values**. After staring at them for a few minutes, you work out what they probably mean: + +- Action **`N`** means to move **north** by the given value. +- Action **`S`** means to move **south** by the given value. +- Action **`E`** means to move **east** by the given value. +- Action **`W`** means to move **west** by the given value. +- Action **`L`** means to turn **left** the given number of degrees. +- Action **`R`** means to turn **right** the given number of degrees. +- Action **`F`** means to move **forward** by the given value in the direction the ship is currently facing. + +The ship starts by facing **east**. Only the `L` and `R` actions change the direction the ship is facing. (That is, if the ship is facing east and the next instruction is `N10`, the ship would move north 10 units, but would still move east if the following action were `F`.) + +For example: + +``` +F10 +N3 +F7 +R90 +F11 +``` + +These instructions would be handled as follows: + +- `F10` would move the ship 10 units east (because the ship starts by facing east) to **east 10, north 0**. +- `N3` would move the ship 3 units north to **east 10, north 3**. +- `F7` would move the ship another 7 units east (because the ship is still facing east) to **east 17, north 3**. +- `R90` would cause the ship to turn right by 90 degrees and face south; it remains at **east 17, north 3**. +- `F11` would move the ship 11 units south to **east 17, south 8**. + +At the end of these instructions, the ship's [Manhattan distance](https://en.wikipedia.org/wiki/Manhattan_distance) (sum of the absolute values of its east/west position and its north/south position) from its starting position is `17 + 8` = **`25`**. + +Figure out where the navigation instructions lead. **What is the Manhattan distance between that location and the ship's starting position?** + +## Part 2 + +Before you can give the destination to the captain, you realize that the actual action meanings were printed on the back of the instructions the whole time. + +Almost all of the actions indicate how to move a **waypoint** which is relative to the ship's position: + +- Action **`N`** means to move the waypoint **north** by the given value. +- Action **`S`** means to move the waypoint **south** by the given value. +- Action **`E`** means to move the waypoint **east** by the given value. +- Action **`W`** means to move the waypoint **west** by the given value. +- Action **`L`** means to rotate the waypoint around the ship **left** (**counter-clockwise**) the given number of degrees. +- Action **`R`** means to rotate the waypoint around the ship **right** (**clockwise**) the given number of degrees. +- Action **`F`** means to move **forward** to the waypoint a number of times equal to the given value. + +The waypoint starts **10 units east and 1 unit north** relative to the ship. The waypoint is relative to the ship; that is, if the ship moves, the waypoint moves with it. + +For example, using the same instructions as above: + +- `F10` moves the ship to the waypoint 10 times (a total of **100 units east and 10 units north**), leaving the ship at **east 100, north 10**. The waypoint stays 10 units east and 1 unit north of the ship. +- `N3` moves the waypoint 3 units north to **10 units east and 4 units north of the ship**. The ship remains at **east 100, north 10**. +- `F7` moves the ship to the waypoint 7 times (a total of **70 units east and 28 units north**), leaving the ship at **east 170, north 38**. The waypoint stays 10 units east and 4 units north of the ship. +- `R90` rotates the waypoint around the ship clockwise 90 degrees, moving it to **4 units east and 10 units south of the ship**. The ship remains at **east 170, north 38**. +- `F11` moves the ship to the waypoint 11 times (a total of **44 units east and 110 units south**), leaving the ship at **east 214, south 72**. The waypoint stays 4 units east and 10 units south of the ship. + +After these operations, the ship's Manhattan distance from its starting position is `214 + 72` = **`286`**. + +Figure out where the navigation instructions actually lead. **What is the Manhattan distance between that location and the ship's starting position?** \ No newline at end of file diff --git a/2020/12/code.py b/2020/12/code.py new file mode 100644 index 0000000..45138e2 --- /dev/null +++ b/2020/12/code.py @@ -0,0 +1,63 @@ +# SPDX-License-Identifier: MIT +# Copyright (c) 2020 Akumatic +# +#https://adventofcode.com/2020/day/12 + +def readFile() -> list: + with open(f"{__file__.rstrip('code.py')}input.txt", "r") as f: + return [line.strip() for line in f.readlines()] + +def part1(input: list) -> int: + x, y = 0, 0 + dirs = ((1,0), (0, 1), (-1, 0), (0, -1)) + idx = 0 + for instruction in input: + action = instruction[0] + value = int(instruction[1:]) + if action == "N": + y += value + elif action == "S": + y -= value + elif action == "E": + x += value + elif action == "W": + x -= value + elif action == "F": + x += dirs[idx][0] * value + y += dirs[idx][1] * value + else: # action in ("R", "L") + sig = 1 if action == "L" else -1 + idx = (idx + sig * value // 90) % 4 + return abs(x) + abs(y) + +def part2(input: list) -> int: + x, y, wx, wy = 0, 0, 10, 1 + dirs = ((1,1), (-1, 1), (-1, -1), (1, -1)) + idx = 0 + for instruction in input: + action = instruction[0] + value = int(instruction[1:]) + if action == "N": + wy += value + elif action == "S": + wy -= value + elif action == "E": + wx += value + elif action == "W": + wx -= value + elif action == "F": + x += wx * value + y += wy * value + else: # action in ("R", "L") + sig = 1 if action == "L" else -1 + for _ in range(value // 90): + idx_prev, idx = idx, (idx + sig) % 4 + tmp_wx = wx + wx = wy * dirs[idx_prev][1] * dirs[idx][0] + wy = tmp_wx * dirs[idx_prev][0] * dirs[idx][1] + return abs(x) + abs(y) + +if __name__ == "__main__": + input = readFile() + print(f"Part 1: {part1(input)}") + print(f"Part 2: {part2(input)}") \ No newline at end of file diff --git a/2020/12/input.txt b/2020/12/input.txt new file mode 100644 index 0000000..4d805f8 --- /dev/null +++ b/2020/12/input.txt @@ -0,0 +1,776 @@ +R180 +E1 +N1 +R90 +E4 +F84 +W3 +F19 +E5 +N1 +W5 +W4 +R90 +S1 +F70 +R90 +W2 +S3 +L180 +E2 +R90 +E1 +R90 +N2 +E3 +F55 +W3 +R90 +S2 +E4 +L90 +F33 +W4 +S3 +F11 +N4 +W4 +F88 +W3 +F62 +L90 +S3 +W3 +N1 +E3 +E2 +N1 +E3 +S3 +E5 +S4 +W5 +L90 +W5 +R90 +E4 +F36 +N4 +E4 +E5 +F47 +R90 +N3 +E3 +L180 +S5 +R90 +S5 +W2 +S3 +F43 +W2 +R180 +W2 +S2 +L180 +E2 +F49 +L90 +F77 +S5 +E1 +S2 +F39 +L180 +F12 +W1 +L90 +F60 +S2 +E3 +N1 +E5 +R90 +E1 +N4 +W4 +S4 +E2 +L90 +F100 +E3 +F58 +S2 +E4 +F83 +W3 +N1 +R90 +F99 +W5 +W4 +F19 +N3 +W1 +W5 +F70 +R180 +R90 +F58 +E5 +N3 +R90 +N4 +F86 +N4 +F70 +L90 +F36 +R90 +S4 +R180 +N5 +F81 +W5 +R90 +E5 +L90 +F73 +S5 +E3 +N1 +F27 +E2 +N3 +L180 +W2 +F24 +N2 +L90 +F69 +N2 +E3 +F49 +L90 +S4 +W5 +F18 +R180 +F62 +S2 +F65 +E3 +F100 +N1 +F96 +W1 +F75 +L180 +W2 +S2 +F93 +E5 +S3 +R90 +S2 +F34 +R90 +F83 +S1 +W1 +F58 +L180 +N4 +E1 +R90 +W2 +F93 +S3 +F20 +R90 +N3 +E3 +N3 +L90 +F8 +S3 +F18 +S3 +N2 +F6 +L270 +F70 +W5 +S3 +F54 +E2 +F75 +E3 +R90 +N2 +W3 +L90 +E4 +F58 +N5 +F97 +W2 +L90 +W5 +S2 +W1 +S5 +F85 +N1 +E1 +N4 +E4 +L90 +E1 +R90 +S5 +L180 +R270 +N1 +L90 +E4 +N3 +F45 +N2 +F68 +R90 +F36 +N5 +F82 +S5 +E4 +R180 +S2 +L180 +N3 +R270 +W5 +F70 +L90 +W5 +F80 +W4 +N2 +R90 +S3 +W1 +F23 +N1 +W1 +N4 +F70 +S3 +L180 +F57 +R90 +L90 +F55 +L90 +N4 +F87 +L90 +F1 +L270 +F17 +N5 +R180 +F84 +R90 +W5 +F7 +W1 +S1 +E3 +F46 +S5 +E2 +F23 +R90 +E4 +W2 +F96 +E5 +L90 +F65 +F3 +S5 +E5 +N3 +W4 +L90 +S2 +F57 +E1 +R90 +F68 +E3 +L90 +W1 +F29 +N5 +W5 +N1 +F95 +N1 +L90 +F31 +S5 +L180 +N2 +W5 +R90 +F27 +E1 +R90 +E3 +S5 +F10 +R90 +N4 +E2 +F25 +S4 +E5 +F51 +N3 +W2 +L90 +S3 +L180 +F17 +E4 +F93 +E3 +L90 +F41 +L90 +S5 +L90 +W5 +N1 +F81 +L90 +E4 +W2 +R90 +W1 +S5 +R90 +F39 +W3 +R90 +N5 +E1 +L90 +F82 +S3 +R90 +W4 +F66 +F4 +L90 +F77 +R90 +E1 +L90 +F53 +S4 +F35 +W1 +F64 +R90 +F9 +S1 +E1 +L90 +W4 +R90 +S2 +W5 +R90 +S4 +L90 +N3 +F8 +L180 +N5 +E5 +N4 +F35 +N5 +W1 +N1 +E5 +F15 +R180 +F92 +W3 +L90 +F4 +L90 +E1 +S3 +W3 +R90 +F37 +N5 +F19 +S2 +F98 +L90 +F24 +W3 +F68 +N5 +R90 +W3 +L90 +W3 +L90 +S1 +L90 +S4 +W3 +F56 +N4 +R90 +E3 +W1 +L90 +E4 +N3 +R180 +E1 +S1 +W2 +R90 +N3 +F82 +N2 +F37 +S3 +L180 +E2 +L180 +F6 +N2 +F96 +E2 +R180 +E2 +W3 +R90 +E2 +S5 +S1 +F23 +R90 +W5 +F75 +S1 +L90 +S3 +E1 +F83 +W4 +L180 +W5 +L90 +N1 +E1 +S2 +F17 +L90 +S2 +F53 +R90 +S3 +N3 +W1 +N4 +L180 +L90 +E3 +F9 +S5 +F24 +W3 +E5 +N2 +F73 +N1 +F28 +N2 +W4 +N3 +F53 +E5 +F47 +W2 +F60 +L90 +E2 +F19 +S1 +F63 +W5 +F100 +N3 +L180 +F83 +N4 +W5 +F37 +S1 +F50 +E1 +N2 +W3 +R90 +F85 +S4 +F72 +N4 +L90 +F48 +R90 +F99 +R90 +F58 +W3 +W4 +F64 +E1 +R90 +F74 +L90 +F23 +N3 +N3 +E1 +S1 +W5 +L180 +F98 +L90 +F36 +W4 +S2 +W3 +F9 +F72 +W5 +F78 +N2 +F65 +S3 +F47 +S5 +R90 +F68 +L180 +W2 +F7 +E2 +E3 +S4 +R90 +N2 +L180 +W2 +R180 +E4 +R90 +W3 +L90 +E4 +F54 +L180 +E2 +F6 +W5 +F82 +E4 +R90 +E4 +F25 +N2 +R270 +N4 +F18 +N5 +R90 +S3 +R90 +F38 +R90 +F97 +W4 +F85 +S4 +F56 +E4 +S1 +F40 +W3 +F52 +L90 +F76 +N4 +F15 +S2 +F22 +S5 +L180 +F91 +L180 +F8 +L90 +E4 +N4 +F67 +L90 +S3 +R180 +R90 +N4 +F71 +W3 +F34 +E2 +N1 +F43 +W5 +L180 +N5 +W2 +F42 +R90 +W3 +F39 +E1 +S2 +L180 +N5 +E3 +N5 +F28 +E1 +R90 +S3 +F40 +L90 +S2 +S2 +L90 +W5 +L90 +F93 +R180 +W4 +S4 +W4 +F100 +S3 +R90 +E2 +L180 +W1 +E3 +S5 +L90 +F87 +N1 +R90 +F3 +R90 +E5 +R90 +S3 +F45 +L90 +S2 +F42 +R90 +F95 +L90 +E1 +N3 +R90 +F73 +S3 +E1 +L90 +S2 +E3 +L90 +L270 +F38 +S5 +R90 +F42 +L90 +N1 +F7 +S3 +F65 +N2 +F42 +L180 +W5 +S4 +E4 +F65 +S4 +E5 +F51 +E4 +R180 +F70 +R90 +F28 +N5 +W5 +N1 +F96 +L90 +W4 +S3 +W3 +F89 +W1 +L90 +F75 +L270 +S3 +R90 +L90 +F7 +E2 +F24 +R180 +S2 +L180 +F48 +R90 +F37 +W2 +R90 +W4 +L90 +W3 +F81 +E4 +N2 +F39 +E4 +N1 +W1 +L90 +F59 diff --git a/2020/12/solution.txt b/2020/12/solution.txt new file mode 100644 index 0000000..d6364a6 --- /dev/null +++ b/2020/12/solution.txt @@ -0,0 +1,2 @@ +Part 1: 1424 +Part 2: 63447 \ No newline at end of file diff --git a/2020/12/test_code.py b/2020/12/test_code.py new file mode 100644 index 0000000..26dbe8e --- /dev/null +++ b/2020/12/test_code.py @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: MIT +# Copyright (c) 2020 Akumatic + +from code import part1, part2 + +def test(): + input = ["F10","N3","F7","R90","F11"] + assert part1(input) == 25 + assert part2(input) == 286 + print("Passed tests for", input) + +if __name__ == "__main__": + test() \ No newline at end of file diff --git a/2020/README.md b/2020/README.md index 5881c73..77f8927 100644 --- a/2020/README.md +++ b/2020/README.md @@ -20,7 +20,7 @@ Collect stars by solving puzzles. Two puzzles will be made available on each day | 05 | :white_check_mark: | :white_check_mark: || 06 | :white_check_mark: | :white_check_mark: | | 07 | :white_check_mark: | :white_check_mark: || 08 | :white_check_mark: | :white_check_mark: | | 09 | :white_check_mark: | :white_check_mark: || 10 | :white_check_mark: | :white_check_mark: | -| 11 | :white_check_mark: | :white_check_mark: || 12 | | | +| 11 | :white_check_mark: | :white_check_mark: || 12 | :white_check_mark: | :white_check_mark: | | 13 | | || 14 | | | | 15 | | || 16 | | | | 17 | | || 18 | | |