From b76bb1c284b8a711782949d4a9377584dc48f67d Mon Sep 17 00:00:00 2001 From: cupcakearmy Date: Sat, 12 Dec 2020 12:55:35 +0100 Subject: [PATCH] 12 --- solutions/12/README.md | 13 + solutions/12/data.txt | 773 ++++++++++++++++++++++++++++++++++++ solutions/12/python/main.py | 83 ++++ solutions/12/test.txt | 5 + 4 files changed, 874 insertions(+) create mode 100644 solutions/12/README.md create mode 100644 solutions/12/data.txt create mode 100644 solutions/12/python/main.py create mode 100644 solutions/12/test.txt diff --git a/solutions/12/README.md b/solutions/12/README.md new file mode 100644 index 0000000..598cefb --- /dev/null +++ b/solutions/12/README.md @@ -0,0 +1,13 @@ +# 12 + +Let's navigate! + +Reminded me that I had to refresh trigonometry a bit xD + +
+ Solutions +
    +
  1. 796
  2. +
  3. 39446
  4. +
+
diff --git a/solutions/12/data.txt b/solutions/12/data.txt new file mode 100644 index 0000000..4ae11ff --- /dev/null +++ b/solutions/12/data.txt @@ -0,0 +1,773 @@ +R180 +S1 +F44 +R90 +E5 +N3 +E5 +S4 +W1 +F68 +E2 +L90 +F40 +W3 +N2 +L180 +S3 +R90 +R90 +W5 +F45 +L90 +F9 +W5 +N1 +E1 +F39 +R90 +F6 +E3 +N1 +E2 +N3 +L180 +N5 +L90 +L90 +S2 +F72 +L90 +E5 +L90 +S2 +F79 +N3 +R90 +F25 +R90 +F16 +W2 +L90 +F81 +W5 +L90 +E5 +S3 +W5 +N1 +L180 +F73 +N1 +F60 +S3 +E1 +F65 +W1 +R90 +F36 +S4 +W1 +R90 +S2 +F33 +S5 +L90 +E3 +F11 +S4 +W2 +L90 +F57 +W4 +N1 +R180 +S2 +F87 +N2 +E2 +S2 +F89 +L90 +W1 +N3 +F63 +R270 +W4 +N1 +R90 +F67 +L90 +F74 +N5 +W5 +S3 +L90 +N1 +L180 +W4 +S4 +E1 +L90 +S1 +E4 +S3 +F95 +S4 +F32 +L90 +F9 +R180 +N4 +W3 +R90 +W4 +F10 +W5 +F21 +L180 +F17 +S4 +L90 +F24 +R90 +F1 +E5 +R180 +F63 +N5 +N4 +E1 +F73 +S2 +S5 +W1 +N1 +R90 +F77 +W4 +N4 +F74 +W5 +F82 +W4 +F8 +E4 +N2 +R90 +R90 +E3 +F44 +F42 +L90 +W5 +R90 +W5 +F45 +W5 +F35 +W1 +L90 +S1 +L90 +N5 +R90 +F4 +R180 +F19 +R180 +F16 +W5 +S1 +R90 +S2 +W3 +F44 +S4 +W4 +F95 +R180 +F1 +R90 +F36 +N4 +F12 +R90 +F26 +F14 +R90 +E5 +N1 +W2 +F88 +N5 +R180 +S2 +E4 +R90 +N4 +E4 +S2 +F9 +N2 +E3 +N5 +F28 +N4 +E3 +N3 +W3 +F93 +N2 +R180 +E2 +F9 +W1 +F28 +R90 +S1 +F82 +W4 +S1 +F59 +S2 +F7 +E2 +R180 +E5 +F19 +S3 +E4 +F53 +L270 +E1 +L90 +W3 +F2 +S3 +F40 +E3 +S1 +F94 +W3 +L90 +F87 +W3 +F37 +S5 +E2 +N2 +R270 +F55 +R90 +S1 +W2 +N1 +L90 +F21 +W5 +N4 +L90 +N3 +F50 +F18 +N2 +F3 +W5 +F68 +N5 +L90 +R270 +F31 +L90 +F90 +R90 +E3 +N3 +L90 +F97 +S1 +W2 +N2 +F10 +E1 +W3 +S4 +F56 +R270 +F70 +S1 +L90 +E1 +F89 +W2 +F94 +L180 +F94 +R90 +N4 +F89 +R180 +W5 +F81 +R90 +N3 +F61 +W3 +W5 +W2 +F90 +F66 +N5 +R90 +E2 +F31 +L90 +E4 +E1 +R180 +W5 +F8 +W3 +R90 +F92 +R90 +E1 +R90 +E2 +F66 +E5 +R90 +S2 +R90 +W5 +R90 +F52 +S5 +E2 +N1 +F57 +W1 +F30 +W5 +F51 +N3 +F82 +L90 +S1 +W4 +R90 +W5 +N5 +E5 +N5 +F41 +N3 +R90 +S3 +E1 +R90 +W2 +N5 +W5 +F45 +L270 +F93 +E4 +R270 +F95 +S3 +W2 +N3 +R90 +W2 +E2 +F56 +R90 +N4 +E3 +R90 +W3 +N4 +F54 +R90 +E5 +F86 +E3 +R90 +F8 +N1 +F79 +S3 +E1 +N2 +F90 +L90 +E2 +R90 +W2 +F95 +E2 +L90 +E1 +F47 +W3 +L90 +F78 +L90 +W3 +R90 +N1 +F34 +W2 +L90 +W4 +R90 +W2 +R180 +E3 +S5 +W2 +F61 +W3 +R90 +E5 +F30 +S3 +F11 +W4 +S2 +F33 +R270 +F94 +L270 +S3 +L90 +F48 +R180 +S4 +F17 +N4 +F64 +L90 +N5 +R90 +S3 +N4 +F53 +S5 +W5 +L180 +E3 +F96 +R90 +F48 +R180 +F84 +E4 +R270 +F48 +F32 +R90 +F79 +S2 +R90 +E5 +S4 +L90 +S5 +F5 +W4 +F30 +R180 +S2 +E3 +N4 +F80 +E1 +F75 +E5 +L90 +S2 +W3 +F87 +L90 +F57 +S5 +F78 +N5 +E2 +E2 +F53 +N5 +F58 +E4 +R90 +N3 +E1 +S4 +W2 +N3 +R180 +W4 +S1 +F17 +R90 +N4 +W4 +S3 +W1 +R90 +S4 +R90 +N1 +W4 +N2 +F17 +R90 +N1 +L90 +S3 +E4 +S3 +R90 +F66 +E2 +N4 +W4 +S1 +L90 +F56 +R180 +S5 +F43 +E5 +F44 +E5 +S2 +E2 +R180 +F64 +N4 +W5 +L180 +E2 +L90 +N4 +E5 +F75 +L90 +E3 +L90 +F79 +R180 +E2 +L90 +F88 +S4 +W3 +R90 +E3 +F43 +E3 +F43 +N1 +W4 +S3 +F55 +N4 +F52 +E3 +L180 +E2 +N2 +F80 +R180 +S5 +F92 +N3 +W2 +R90 +E2 +L90 +W3 +S4 +L90 +N5 +E1 +L180 +F25 +W4 +F65 +E1 +S5 +R90 +N4 +F4 +E4 +F70 +F26 +N2 +N4 +W2 +F3 +R90 +N5 +F84 +W1 +R90 +N4 +W4 +F43 +R270 +S2 +F2 +S4 +L90 +F59 +L90 +F59 +R90 +S5 +F88 +L90 +N5 +E2 +F7 +S2 +W5 +L90 +S4 +R270 +F5 +L90 +E1 +F25 +E1 +S5 +F84 +L180 +F10 +W3 +L180 +S4 +F51 +N1 +W2 +L90 +F23 +W4 +N1 +E2 +F40 +W5 +N3 +F93 +R180 +E5 +S1 +E5 +F11 +S1 +E2 +L90 +E2 +F11 +R270 +W4 +L180 +N3 +R90 +F5 +L90 +R90 +N2 +F50 +R180 +S1 +E2 +S4 +E3 +N4 +W2 +F69 +E1 +N1 +W4 +R90 +F68 +W3 +S2 +F5 +W2 +S2 +S4 +R180 +W1 +R90 +F14 +E5 +S3 +W2 +F84 +E1 +L90 +F99 +S4 +S4 +W1 +F31 +E4 +F77 +S4 +F75 +R90 +W3 +R90 +L90 +E5 +N4 +W3 +L90 +E2 +L90 +W1 +F91 +L90 +E2 +L90 +N1 +E1 +R180 +S1 +L90 +F72 +W2 +R270 +F18 +N5 +F7 +E3 +F83 +W5 +E1 +S3 +E3 +F76 +S5 +L90 +S4 +E2 +S1 +R270 +F52 +R270 +F51 +N2 +F41 +N1 +E5 +S3 +R90 +W4 +F53 diff --git a/solutions/12/python/main.py b/solutions/12/python/main.py new file mode 100644 index 0000000..615a609 --- /dev/null +++ b/solutions/12/python/main.py @@ -0,0 +1,83 @@ +from os.path import join, dirname +from typing import List, Optional +from math import cos, sin, radians, atan2, degrees, sqrt + +directions = { + 'N': 0, + 'E': 90, + 'S': 180, + 'W': 270, +} + + +class Ship: + + def __init__(self, waypoint=False) -> None: + self.x: float = 0 + self.y: float = 0 + self.d: int = directions['E'] + + self.waypoint = waypoint + self.wx: float = 10 + self.wy: float = 1 + + @property + def distance(self) -> int: + return round(abs(self.x) + abs(self.y)) + + def __str__(self) -> str: + return f'⛓ X={round(self.x)} Y={round(self.y)} š’Ž“={round(self.d)}\tšŸ“ā€ā˜ ļø X={round(self.wx)} Y={round(self.wy)}' + + def navigate(self, amount: int, degree: Optional[int] = None) -> None: + if degree == None: + if self.waypoint: + self.x += self.wx * amount + self.y += self.wy * amount + return + degree = self.d + dx = amount * sin(radians(degree)) + dy = amount * cos(radians(degree)) + if self.waypoint: + self.wx += dx + self.wy += dy + else: + self.x += dx + self.y += dy + + def move(self, instruction: str) -> None: + cmd: str = instruction[0] + amount: int = int(instruction[1:]) + if cmd in directions: + self.navigate(amount, degree=directions[cmd]) + elif cmd == 'F': + self.navigate(amount) + else: + diff = amount if cmd == 'R' else -amount + if self.waypoint: + size = sqrt(self.wx**2 + self.wy**2) + d = degrees(atan2(self.wy, self.wx)) + d -= diff + self.wx = size * cos(radians(d)) + self.wy = size * sin(radians(d)) + else: + self.d = (self.d + diff) % 360 + + def follow(self, file: str) -> None: + instructions = file.strip().split('\n') + for instruction in instructions: + self.move(instruction) + + +data = join(dirname(__file__), '../data.txt') +with open(data) as f: + txt = f.read() + + ship = Ship() + ship.follow(txt) + print(ship) + print(ship.distance) + + ship = Ship(waypoint=True) + ship.follow(txt) + print(ship) + print(ship.distance) diff --git a/solutions/12/test.txt b/solutions/12/test.txt new file mode 100644 index 0000000..d382291 --- /dev/null +++ b/solutions/12/test.txt @@ -0,0 +1,5 @@ +F10 +N3 +F7 +R90 +F11