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 68 lines 1.4 kB view raw
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