My Advent of Code solutions in Python. kevinyap.ca/2019/12/going-fast-in-advent-of-code/
advent-of-code python
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 48 lines 1.2 kB view raw
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]