Added 2020 (python)
This commit is contained in:
BIN
2020/12/__pycache__/prog.cpython-38.pyc
Normal file
BIN
2020/12/__pycache__/prog.cpython-38.pyc
Normal file
Binary file not shown.
BIN
2020/12/__pycache__/test.cpython-38.pyc
Normal file
BIN
2020/12/__pycache__/test.cpython-38.pyc
Normal file
Binary file not shown.
760
2020/12/input
Normal file
760
2020/12/input
Normal file
@ -0,0 +1,760 @@
|
||||
F35
|
||||
L90
|
||||
S5
|
||||
F4
|
||||
R90
|
||||
F46
|
||||
W3
|
||||
N1
|
||||
L90
|
||||
F13
|
||||
S5
|
||||
E5
|
||||
R180
|
||||
S1
|
||||
F39
|
||||
N2
|
||||
R90
|
||||
S1
|
||||
F94
|
||||
R90
|
||||
F55
|
||||
L90
|
||||
S2
|
||||
R90
|
||||
W3
|
||||
S5
|
||||
E3
|
||||
R180
|
||||
S4
|
||||
L90
|
||||
F40
|
||||
N5
|
||||
W5
|
||||
N3
|
||||
F88
|
||||
L90
|
||||
W3
|
||||
F12
|
||||
W1
|
||||
N1
|
||||
F65
|
||||
L90
|
||||
E1
|
||||
N1
|
||||
L270
|
||||
E3
|
||||
F67
|
||||
R90
|
||||
R180
|
||||
N3
|
||||
W5
|
||||
N4
|
||||
R90
|
||||
F48
|
||||
R180
|
||||
F50
|
||||
E3
|
||||
S4
|
||||
F50
|
||||
N4
|
||||
L90
|
||||
N5
|
||||
F26
|
||||
L90
|
||||
F21
|
||||
N5
|
||||
L90
|
||||
R90
|
||||
F13
|
||||
R90
|
||||
S2
|
||||
E4
|
||||
F33
|
||||
N5
|
||||
R90
|
||||
F78
|
||||
L180
|
||||
N3
|
||||
E5
|
||||
N4
|
||||
L180
|
||||
N3
|
||||
F12
|
||||
E4
|
||||
L90
|
||||
N2
|
||||
F32
|
||||
L270
|
||||
F13
|
||||
L90
|
||||
S5
|
||||
F100
|
||||
N4
|
||||
W4
|
||||
L270
|
||||
N1
|
||||
L90
|
||||
E5
|
||||
F30
|
||||
W3
|
||||
S3
|
||||
E4
|
||||
F38
|
||||
E3
|
||||
E2
|
||||
L90
|
||||
N1
|
||||
L180
|
||||
F89
|
||||
E1
|
||||
R90
|
||||
F51
|
||||
R90
|
||||
F12
|
||||
E5
|
||||
L90
|
||||
S3
|
||||
E3
|
||||
S3
|
||||
L180
|
||||
F66
|
||||
L180
|
||||
N3
|
||||
F26
|
||||
W4
|
||||
E2
|
||||
N4
|
||||
F90
|
||||
S4
|
||||
R90
|
||||
W4
|
||||
F79
|
||||
R90
|
||||
F38
|
||||
W3
|
||||
F10
|
||||
R90
|
||||
W1
|
||||
L180
|
||||
F34
|
||||
E5
|
||||
N4
|
||||
F30
|
||||
S4
|
||||
W1
|
||||
L180
|
||||
N2
|
||||
W1
|
||||
F76
|
||||
S5
|
||||
L270
|
||||
N5
|
||||
W1
|
||||
L90
|
||||
F4
|
||||
N1
|
||||
R90
|
||||
F86
|
||||
N1
|
||||
L90
|
||||
N1
|
||||
F75
|
||||
S4
|
||||
F85
|
||||
N3
|
||||
L270
|
||||
N5
|
||||
F85
|
||||
S4
|
||||
F84
|
||||
R180
|
||||
W2
|
||||
F10
|
||||
R90
|
||||
F72
|
||||
L90
|
||||
F90
|
||||
W4
|
||||
L90
|
||||
F94
|
||||
R90
|
||||
E4
|
||||
R90
|
||||
S2
|
||||
L90
|
||||
W3
|
||||
F89
|
||||
W3
|
||||
S2
|
||||
R90
|
||||
E1
|
||||
S1
|
||||
E5
|
||||
N1
|
||||
F77
|
||||
L90
|
||||
N2
|
||||
F52
|
||||
S1
|
||||
W1
|
||||
N5
|
||||
R90
|
||||
S2
|
||||
L90
|
||||
F97
|
||||
N1
|
||||
F54
|
||||
L90
|
||||
F3
|
||||
S2
|
||||
W5
|
||||
F71
|
||||
W2
|
||||
F86
|
||||
E5
|
||||
N1
|
||||
F32
|
||||
R270
|
||||
F1
|
||||
E4
|
||||
F18
|
||||
R180
|
||||
R90
|
||||
E1
|
||||
S5
|
||||
S3
|
||||
W2
|
||||
F75
|
||||
W4
|
||||
N1
|
||||
F3
|
||||
E1
|
||||
F46
|
||||
R90
|
||||
N4
|
||||
W5
|
||||
L90
|
||||
F76
|
||||
W2
|
||||
F62
|
||||
N2
|
||||
F29
|
||||
E2
|
||||
N4
|
||||
F60
|
||||
L90
|
||||
N2
|
||||
L90
|
||||
F31
|
||||
R270
|
||||
F97
|
||||
S4
|
||||
F75
|
||||
L90
|
||||
S4
|
||||
F51
|
||||
L90
|
||||
W5
|
||||
L90
|
||||
F53
|
||||
R270
|
||||
N1
|
||||
L90
|
||||
E3
|
||||
R90
|
||||
W1
|
||||
F44
|
||||
N1
|
||||
F97
|
||||
R90
|
||||
N2
|
||||
W4
|
||||
F27
|
||||
L90
|
||||
F91
|
||||
E1
|
||||
S5
|
||||
R180
|
||||
W5
|
||||
N2
|
||||
L90
|
||||
E2
|
||||
N5
|
||||
F34
|
||||
F26
|
||||
R90
|
||||
N2
|
||||
E4
|
||||
S5
|
||||
F58
|
||||
W1
|
||||
F3
|
||||
N5
|
||||
E3
|
||||
S2
|
||||
W4
|
||||
N2
|
||||
W5
|
||||
F19
|
||||
L180
|
||||
W4
|
||||
F68
|
||||
L90
|
||||
N5
|
||||
R90
|
||||
F65
|
||||
S4
|
||||
R180
|
||||
S4
|
||||
L90
|
||||
F59
|
||||
R90
|
||||
E3
|
||||
R90
|
||||
F44
|
||||
L90
|
||||
E5
|
||||
F19
|
||||
W5
|
||||
N4
|
||||
F10
|
||||
N4
|
||||
L90
|
||||
S4
|
||||
L90
|
||||
W3
|
||||
F75
|
||||
R180
|
||||
E5
|
||||
F97
|
||||
E3
|
||||
F63
|
||||
S3
|
||||
F53
|
||||
W2
|
||||
F53
|
||||
N1
|
||||
L90
|
||||
F14
|
||||
S3
|
||||
E5
|
||||
L90
|
||||
N5
|
||||
F28
|
||||
L90
|
||||
F3
|
||||
L90
|
||||
S2
|
||||
F52
|
||||
S2
|
||||
F99
|
||||
S5
|
||||
W2
|
||||
L90
|
||||
S1
|
||||
W5
|
||||
L90
|
||||
S1
|
||||
F11
|
||||
R90
|
||||
W4
|
||||
R90
|
||||
F11
|
||||
N3
|
||||
W3
|
||||
N5
|
||||
F39
|
||||
W1
|
||||
F50
|
||||
N2
|
||||
L90
|
||||
W4
|
||||
F88
|
||||
S5
|
||||
W4
|
||||
R270
|
||||
W4
|
||||
F55
|
||||
R90
|
||||
E3
|
||||
R180
|
||||
S1
|
||||
E3
|
||||
F100
|
||||
E3
|
||||
F38
|
||||
N3
|
||||
F28
|
||||
E5
|
||||
R90
|
||||
F94
|
||||
R180
|
||||
F95
|
||||
R90
|
||||
W4
|
||||
R180
|
||||
F40
|
||||
N4
|
||||
R90
|
||||
S5
|
||||
F69
|
||||
E2
|
||||
F2
|
||||
N5
|
||||
W2
|
||||
F16
|
||||
S2
|
||||
F71
|
||||
W2
|
||||
N3
|
||||
L90
|
||||
F36
|
||||
W1
|
||||
F90
|
||||
N5
|
||||
R90
|
||||
F93
|
||||
E2
|
||||
F23
|
||||
N1
|
||||
L90
|
||||
F22
|
||||
R90
|
||||
L90
|
||||
N4
|
||||
L180
|
||||
F7
|
||||
L90
|
||||
W2
|
||||
F29
|
||||
N2
|
||||
L90
|
||||
E4
|
||||
R90
|
||||
N5
|
||||
F13
|
||||
R180
|
||||
F87
|
||||
L90
|
||||
S1
|
||||
L90
|
||||
E2
|
||||
R90
|
||||
F19
|
||||
S4
|
||||
F100
|
||||
L270
|
||||
W1
|
||||
L180
|
||||
F87
|
||||
N1
|
||||
F100
|
||||
R90
|
||||
S3
|
||||
L90
|
||||
W1
|
||||
N1
|
||||
L90
|
||||
W2
|
||||
F98
|
||||
L180
|
||||
S1
|
||||
W4
|
||||
S5
|
||||
F45
|
||||
S4
|
||||
L90
|
||||
E1
|
||||
S4
|
||||
F31
|
||||
E1
|
||||
S1
|
||||
E2
|
||||
R90
|
||||
S5
|
||||
L90
|
||||
F12
|
||||
R180
|
||||
W1
|
||||
L90
|
||||
N1
|
||||
L90
|
||||
F23
|
||||
E4
|
||||
S2
|
||||
L90
|
||||
E5
|
||||
S4
|
||||
F21
|
||||
N3
|
||||
R90
|
||||
W4
|
||||
E5
|
||||
F32
|
||||
S1
|
||||
E2
|
||||
L90
|
||||
F45
|
||||
L90
|
||||
W3
|
||||
L180
|
||||
F100
|
||||
S5
|
||||
F88
|
||||
S5
|
||||
F29
|
||||
E1
|
||||
L180
|
||||
F12
|
||||
S5
|
||||
F52
|
||||
N2
|
||||
F31
|
||||
R90
|
||||
E1
|
||||
L90
|
||||
F64
|
||||
W3
|
||||
L90
|
||||
N1
|
||||
R90
|
||||
F60
|
||||
E2
|
||||
F4
|
||||
S1
|
||||
F97
|
||||
F62
|
||||
L180
|
||||
F66
|
||||
R90
|
||||
E1
|
||||
S5
|
||||
R90
|
||||
S3
|
||||
F96
|
||||
W1
|
||||
N2
|
||||
F95
|
||||
R90
|
||||
E3
|
||||
R90
|
||||
E2
|
||||
S2
|
||||
E4
|
||||
F42
|
||||
S4
|
||||
E4
|
||||
L90
|
||||
E1
|
||||
F73
|
||||
L90
|
||||
N3
|
||||
L90
|
||||
F82
|
||||
S3
|
||||
R270
|
||||
S5
|
||||
W1
|
||||
R90
|
||||
W2
|
||||
S1
|
||||
S3
|
||||
L90
|
||||
F74
|
||||
S3
|
||||
F13
|
||||
R180
|
||||
F32
|
||||
E2
|
||||
S2
|
||||
F93
|
||||
N1
|
||||
R270
|
||||
F4
|
||||
E5
|
||||
F63
|
||||
W2
|
||||
L180
|
||||
F26
|
||||
E3
|
||||
N5
|
||||
R90
|
||||
N3
|
||||
L270
|
||||
F22
|
||||
N1
|
||||
W5
|
||||
F29
|
||||
S5
|
||||
R90
|
||||
S1
|
||||
F3
|
||||
N4
|
||||
R90
|
||||
E3
|
||||
R90
|
||||
N2
|
||||
L90
|
||||
N3
|
||||
F42
|
||||
W4
|
||||
F37
|
||||
L90
|
||||
F15
|
||||
W3
|
||||
N5
|
||||
F25
|
||||
E2
|
||||
F33
|
||||
E2
|
||||
S1
|
||||
L90
|
||||
F55
|
||||
E4
|
||||
L90
|
||||
W1
|
||||
N1
|
||||
F30
|
||||
E2
|
||||
R90
|
||||
E2
|
||||
F80
|
||||
L90
|
||||
W2
|
||||
S1
|
||||
F9
|
||||
L270
|
||||
W2
|
||||
F82
|
||||
L90
|
||||
F94
|
||||
N5
|
||||
F16
|
||||
W5
|
||||
F74
|
||||
R180
|
||||
N3
|
||||
F58
|
||||
W5
|
||||
F95
|
||||
R270
|
||||
S4
|
||||
F55
|
||||
L90
|
||||
N1
|
||||
L180
|
||||
F85
|
||||
N2
|
||||
R90
|
||||
E1
|
||||
L90
|
||||
F57
|
||||
S2
|
||||
L90
|
||||
F31
|
||||
L180
|
||||
S3
|
||||
L90
|
||||
F58
|
||||
N3
|
||||
L270
|
||||
N3
|
||||
R270
|
||||
F15
|
||||
L180
|
||||
N4
|
||||
L90
|
||||
N5
|
||||
R180
|
||||
E1
|
||||
S4
|
||||
F11
|
||||
L90
|
||||
E5
|
||||
N4
|
||||
E3
|
||||
L90
|
||||
E4
|
||||
F71
|
||||
R90
|
||||
S2
|
||||
E3
|
||||
L90
|
||||
S3
|
||||
F90
|
||||
W4
|
||||
F8
|
||||
R180
|
||||
N3
|
||||
W4
|
||||
S4
|
||||
F58
|
||||
N4
|
||||
E1
|
||||
L180
|
||||
S4
|
||||
W1
|
||||
R180
|
||||
F47
|
||||
S1
|
||||
L90
|
||||
R90
|
||||
N1
|
||||
E1
|
||||
N4
|
||||
R180
|
||||
N2
|
||||
E1
|
||||
R90
|
||||
E3
|
||||
L90
|
||||
F67
|
||||
N3
|
||||
F51
|
||||
N1
|
||||
F41
|
||||
L180
|
||||
R90
|
||||
F5
|
||||
E2
|
||||
S5
|
||||
W1
|
||||
F51
|
||||
R180
|
||||
N1
|
||||
E1
|
||||
F91
|
||||
R90
|
||||
N2
|
||||
L90
|
||||
F66
|
||||
L90
|
||||
S3
|
||||
L90
|
||||
F52
|
||||
E2
|
||||
S1
|
||||
F66
|
||||
R180
|
||||
F18
|
||||
W5
|
||||
L90
|
||||
W1
|
||||
F88
|
||||
S1
|
||||
R180
|
||||
F92
|
||||
L90
|
||||
S5
|
||||
F19
|
||||
L90
|
||||
E3
|
||||
S3
|
||||
E3
|
||||
N5
|
||||
W3
|
||||
F8
|
||||
E2
|
||||
S4
|
||||
F3
|
67
2020/12/prog.py
Normal file
67
2020/12/prog.py
Normal file
@ -0,0 +1,67 @@
|
||||
def get_input(sample = False):
|
||||
with open("sample" if sample else "input") as f:
|
||||
return [(line[:1], int(line[1:])) for line in f.readlines()]
|
||||
|
||||
def new_dir_after_rotate(cur_dir: str, L_or_R: str, amount: int):
|
||||
orientations = ["N", "E", "S", "W"]
|
||||
cur_dir_i = orientations.index(cur_dir)
|
||||
return orientations[(cur_dir_i + (1 if L_or_R == "R" else -1) * amount // 90) % len(orientations)]
|
||||
|
||||
def new_waypoint_after_rotate(cur_wp: list, L_or_R: str, amount: int):
|
||||
ret = [0, 0]
|
||||
|
||||
rot = amount // 90 % 4
|
||||
if (rot, L_or_R) == (1, "L") or (rot, L_or_R) == (3, "R"):
|
||||
ret[0] = -cur_wp[1]
|
||||
ret[1] = cur_wp[0]
|
||||
elif rot == 2:
|
||||
ret[0] = -cur_wp[0]
|
||||
ret[1] = -cur_wp[1]
|
||||
elif (rot, L_or_R) == (3, "L") or (rot, L_or_R) == (1, "R"):
|
||||
ret[0] = cur_wp[1]
|
||||
ret[1] = -cur_wp[0]
|
||||
|
||||
return ret
|
||||
|
||||
def get_result(instructions: dict, part = 1):
|
||||
position = [0, 0]
|
||||
waypoint = [10, 1]
|
||||
cur_dir = "E"
|
||||
|
||||
|
||||
add_to_vertical = lambda dir, x: (1 if dir == "N" else -1) * x
|
||||
add_to_horizontal = lambda dir, x: (1 if dir == "E" else -1) * x
|
||||
|
||||
for cmd, amount in instructions:
|
||||
if part == 1:
|
||||
if cmd == "F":
|
||||
if cur_dir in ["N", "S"]:
|
||||
position[1] += add_to_vertical(cur_dir, amount)
|
||||
elif cur_dir in ["E", "W"]:
|
||||
position[0] += add_to_horizontal(cur_dir, amount)
|
||||
elif cmd in ["L", "R"]:
|
||||
cur_dir = new_dir_after_rotate(cur_dir, cmd, amount)
|
||||
elif cmd in ["N", "E", "S", "W"]:
|
||||
if cmd in ["N", "S"]:
|
||||
position[1] += add_to_vertical(cmd, amount)
|
||||
elif cmd in ["E", "W"]:
|
||||
position[0] += add_to_horizontal(cmd, amount)
|
||||
else:
|
||||
if cmd == "F":
|
||||
position[0] += waypoint[0] * amount
|
||||
position[1] += waypoint[1] * amount
|
||||
elif cmd in ["L", "R"]:
|
||||
waypoint = new_waypoint_after_rotate(waypoint, cmd, amount)
|
||||
elif cmd in ["N", "E", "S", "W"]:
|
||||
if cmd in ["N", "S"]:
|
||||
waypoint[1] += add_to_vertical(cmd, amount)
|
||||
elif cmd in ["E", "W"]:
|
||||
waypoint[0] += add_to_horizontal(cmd, amount)
|
||||
|
||||
|
||||
return sum(map(lambda x: abs(x), position))
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(get_result(get_input(), part = 2))
|
||||
|
||||
|
5
2020/12/sample
Normal file
5
2020/12/sample
Normal file
@ -0,0 +1,5 @@
|
||||
F10
|
||||
N3
|
||||
F7
|
||||
R90
|
||||
F11
|
64
2020/12/test.py
Normal file
64
2020/12/test.py
Normal file
@ -0,0 +1,64 @@
|
||||
import unittest
|
||||
from prog import *
|
||||
|
||||
class Rotate(unittest.TestCase):
|
||||
def test_rotate_L90(self):
|
||||
self.assertEqual(new_dir_after_rotate("N", "L", 90), "W")
|
||||
self.assertEqual(new_dir_after_rotate("E", "L", 90), "N")
|
||||
self.assertEqual(new_dir_after_rotate("S", "L", 90), "E")
|
||||
self.assertEqual(new_dir_after_rotate("W", "L", 90), "S")
|
||||
|
||||
def test_rotate_R90(self):
|
||||
self.assertEqual(new_dir_after_rotate("N", "R", 90), "E")
|
||||
self.assertEqual(new_dir_after_rotate("E", "R", 90), "S")
|
||||
self.assertEqual(new_dir_after_rotate("S", "R", 90), "W")
|
||||
self.assertEqual(new_dir_after_rotate("W", "R", 90), "N")
|
||||
|
||||
def test_rotate_L180(self):
|
||||
self.assertEqual(new_dir_after_rotate("N", "L", 180), "S")
|
||||
self.assertEqual(new_dir_after_rotate("E", "L", 180), "W")
|
||||
self.assertEqual(new_dir_after_rotate("S", "L", 180), "N")
|
||||
self.assertEqual(new_dir_after_rotate("W", "L", 180), "E")
|
||||
|
||||
def test_rotate_R180(self):
|
||||
self.assertEqual(new_dir_after_rotate("N", "R", 180), "S")
|
||||
self.assertEqual(new_dir_after_rotate("E", "R", 180), "W")
|
||||
self.assertEqual(new_dir_after_rotate("S", "R", 180), "N")
|
||||
self.assertEqual(new_dir_after_rotate("W", "R", 180), "E")
|
||||
|
||||
def test_rotate_L270(self):
|
||||
self.assertEqual(new_dir_after_rotate("N", "L", 270), "E")
|
||||
self.assertEqual(new_dir_after_rotate("E", "L", 270), "S")
|
||||
self.assertEqual(new_dir_after_rotate("S", "L", 270), "W")
|
||||
self.assertEqual(new_dir_after_rotate("W", "L", 270), "N")
|
||||
|
||||
def test_rotate_R270(self):
|
||||
self.assertEqual(new_dir_after_rotate("N", "R", 270), "W")
|
||||
self.assertEqual(new_dir_after_rotate("E", "R", 270), "N")
|
||||
self.assertEqual(new_dir_after_rotate("S", "R", 270), "E")
|
||||
self.assertEqual(new_dir_after_rotate("W", "R", 270), "S")
|
||||
|
||||
def test_rotate_L360(self):
|
||||
self.assertEqual(new_dir_after_rotate("N", "L", 360), "N")
|
||||
self.assertEqual(new_dir_after_rotate("E", "L", 360), "E")
|
||||
self.assertEqual(new_dir_after_rotate("S", "L", 360), "S")
|
||||
self.assertEqual(new_dir_after_rotate("W", "L", 360), "W")
|
||||
|
||||
def test_rotate_R360(self):
|
||||
self.assertEqual(new_dir_after_rotate("N", "R", 360), "N")
|
||||
self.assertEqual(new_dir_after_rotate("E", "R", 360), "E")
|
||||
self.assertEqual(new_dir_after_rotate("S", "R", 360), "S")
|
||||
self.assertEqual(new_dir_after_rotate("W", "R", 360), "W")
|
||||
|
||||
class Result(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.inp = get_input(sample = True)
|
||||
|
||||
def test_part_1(self):
|
||||
result = get_result(self.inp)
|
||||
self.assertEqual(result, 25)
|
||||
|
||||
def test_part_2(self):
|
||||
result = get_result(self.inp, part = 2)
|
||||
self.assertEqual(result, 286)
|
||||
|
Reference in New Issue
Block a user