My Advent of Code solutions in Python.
kevinyap.ca/2019/12/going-fast-in-advent-of-code/
advent-of-code
python
1import fileinput
2from collections import deque
3
4
5def perform_dance(progs, moves):
6 for m in moves:
7 if m[0] == 's':
8 progs.rotate(int(m[1:]))
9
10 else:
11 a, b = m[1:].split('/')
12
13 if m[0] == 'x':
14 a = int(a)
15 b = int(b)
16 else:
17 # deque.index() only supported in Python 3.5+
18 progs_lst = list(progs)
19 a = progs_lst.index(a)
20 b = progs_lst.index(b)
21
22 progs[a], progs[b] = progs[b], progs[a]
23
24
25MOVES = fileinput.input()[0].strip().split(',')
26PROGS = [chr(x) for x in range(ord('a'), ord('p') + 1)]
27
28# Part 1
29progs = deque(PROGS)
30perform_dance(progs, MOVES)
31print "Order of programs after first dance:", ''.join(progs)
32
33# Part 2
34progs = deque(PROGS)
35order = ''.join(progs)
36past_orders = []
37cycle_len = 0
38
39while order not in past_orders:
40 past_orders.append(order)
41 perform_dance(progs, MOVES)
42 order = ''.join(progs)
43 cycle_len += 1
44
45# Now we know the length of the cycle, so just compute the order
46# after the billionth dance using modular arithmetic.
47idx = 1000000000 % cycle_len
48print "Order of programs after one billion dances:", past_orders[idx]