My Advent of Code solutions in Python.
kevinyap.ca/2019/12/going-fast-in-advent-of-code/
advent-of-code
python
1NUM_CUPS = 1000000
2ITERS = 10000000
3
4class Cup:
5 def __init__(self, n):
6 self.n = n
7
8 def __repr__(self):
9 return "{} -> ({}) -> {}".format(self.prev.n, self.n, self.next.n)
10
11labeling = [int(x) for x in raw_input()]
12cup_ptrs = {}
13
14for i in range(1, NUM_CUPS + 1):
15 cup_ptrs[i] = Cup(i)
16
17curr_cup = None
18prev = None
19for n in labeling:
20 if curr_cup is None:
21 curr_cup = cup_ptrs[n]
22 prev = curr_cup
23 else:
24 cup_ptrs[n].prev = prev
25 prev.next = cup_ptrs[n]
26 prev = cup_ptrs[n]
27
28for n in range(len(labeling) + 1, NUM_CUPS + 1):
29 cup_ptrs[n].prev = prev
30 prev.next = cup_ptrs[n]
31 prev = cup_ptrs[n]
32
33curr_cup.prev = prev
34prev.next = curr_cup
35
36for move in range(ITERS):
37 curr = curr_cup.n
38
39 # Pick up three cups
40 a = curr_cup.next
41 b = a.next
42 c = b.next
43
44 # Cup spacing adjusted
45 a.prev.next = c.next
46 c.next.prev = a.prev
47
48 dval = curr - 1
49 if dval == 0:
50 dval = NUM_CUPS
51 while dval == a.n or dval == b.n or dval == c.n:
52 dval -= 1
53 if dval == 0:
54 dval = NUM_CUPS
55
56 dest_cup = cup_ptrs[dval]
57 tmp_cup = dest_cup.next
58
59 dest_cup.next = a
60 a.prev = dest_cup
61
62 c.next = tmp_cup
63 tmp_cup.prev = c
64
65 # Move current cup to the next cup.
66 curr_cup = curr_cup.next
67
68print cup_ptrs[1].next.n * cup_ptrs[1].next.next.n