Skip to content

Commit 6e03b57

Browse files
committed
Day 16, 2017 - Parts I & II
1 parent 8db90d7 commit 6e03b57

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

2017/day16.py

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import re
2+
import os
3+
from string import ascii_lowercase
4+
5+
class Dance:
6+
7+
def __init__(self, n, moves):
8+
self.n = n
9+
self.moves = moves
10+
self.programs = list(ascii_lowercase)[:n]
11+
self.end_states = []
12+
13+
def __str__(self):
14+
return ''.join(self.programs)
15+
16+
def __repr__(self):
17+
return str(self)
18+
19+
def solve_n_times(self, n):
20+
for i in range(n):
21+
if str(self) in self.end_states:
22+
return self.end_states[n % len(self.end_states)]
23+
else:
24+
self.solve()
25+
return str(self)
26+
27+
def solve(self):
28+
self.end_states.append(str(self))
29+
for m in self.moves:
30+
self.parse_move(m)
31+
return str(self)
32+
33+
def parse_move(self, move):
34+
inst = move[0]
35+
if inst == 's':
36+
return self.spin(int(move[1:]))
37+
if inst == 'x':
38+
ab = re.findall('[0-9]+', move[1:])
39+
return self.exchange(int(ab[0]), int(ab[1]))
40+
if inst == 'p':
41+
ab = re.findall('[a-z]+', move[1:])
42+
return self.partner(ab[0], ab[1])
43+
44+
def spin(self, X):
45+
progs = self.programs
46+
self.programs = progs[len(progs)-X:] + progs[:len(progs)-X]
47+
return str(self)
48+
49+
def exchange(self, A, B):
50+
p1 = self.programs[A]
51+
p2 = self.programs[B]
52+
self.programs[A] = p2
53+
self.programs[B] = p1
54+
return str(self)
55+
56+
def partner(self, A, B):
57+
a_i = self.programs.index(A)
58+
b_i = self.programs.index(B)
59+
self.programs[a_i] = B
60+
self.programs[b_i] = A
61+
return str(self)
62+
63+
if __name__ == '__main__':
64+
rel_path = os.path.dirname(os.path.abspath(__file__))
65+
file_path = os.path.join(rel_path, "inputs/day16_test.txt")
66+
test_moves = open(file_path).read().split(',')
67+
d1 = Dance(5, test_moves)
68+
print(d1.solve())
69+
70+
rel_path = os.path.dirname(os.path.abspath(__file__))
71+
file_path = os.path.join(rel_path, "inputs/day16.txt")
72+
moves = open(file_path).read().split(',')
73+
d2 = Dance(16, moves)
74+
print(d2.solve())
75+
print(d2.solve_n_times(1000000000))

2017/inputs/day16.txt

+1
Large diffs are not rendered by default.

2017/inputs/day16_test.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
s1,x3/4,pe/b

0 commit comments

Comments
 (0)