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.

Use deques for Day 19 Part 2

+11 -14
+11 -14
2016/day19.py
··· 13 13 14 14 15 15 def circular_elves(num_elves): 16 - seen = set() 17 - victim = num_elves // 2 16 + left = deque(range(1, (num_elves // 2) + 1)) 17 + right = deque(range((num_elves // 2) + 1, num_elves + 1)) 18 18 19 - # Start with a double jump if number of elves is odd 20 - double = (num_elves % 2) == 1 19 + while len(left) + len(right) > 1: 20 + # Remove the middle Elf in the circle 21 + right.popleft() 21 22 22 - while True: 23 - seen.add(victim) 23 + # Move an Elf from between deques 24 + right.append(left.popleft()) 24 25 25 - if len(seen) == num_elves: 26 - return victim + 1 27 - 28 - for _ in range(2 if double else 1): 29 - victim = (victim + 1) % num_elves 30 - while victim in seen: 31 - victim = (victim + 1) % num_elves 26 + # Rebalance the deques if uneven 27 + if len(right) - len(left) == 2: 28 + left.append(right.popleft()) 32 29 33 - double = not double 30 + return right[0] 34 31 35 32 36 33 if __name__ == '__main__':