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.

Add 2021/21

+101
+101
2021/day21.py
··· 1 + import fileinput 2 + from collections import Counter 3 + from itertools import product 4 + 5 + from utils import parse_nums 6 + 7 + 8 + # Read problem input. 9 + start_pos = {} 10 + for line in fileinput.input(): 11 + nums = parse_nums(line) 12 + start_pos[nums[0]] = nums[1] 13 + 14 + 15 + # Solve part 1. 16 + curr_die = 1 17 + total_rolls = 0 18 + 19 + p1_score = 0 20 + p2_score = 0 21 + 22 + p1 = start_pos[1] 23 + p2 = start_pos[2] 24 + 25 + while p1_score < 1000 and p2_score < 1000: 26 + p1 -= 1 27 + for i in range(3): 28 + total_rolls += 1 29 + p1 += curr_die 30 + curr_die += 1 31 + if curr_die == 101: 32 + curr_die = 1 33 + p1 = p1 % 10 34 + p1 += 1 35 + 36 + p1_score += p1 37 + 38 + if p1_score >= 1000: 39 + break 40 + 41 + p2 -= 1 42 + for i in range(3): 43 + total_rolls += 1 44 + p2 += curr_die 45 + curr_die += 1 46 + if curr_die == 101: 47 + curr_die = 1 48 + p2 = p2 % 10 49 + p2 += 1 50 + 51 + p2_score += p2 52 + 53 + print "Part 1:", total_rolls * min(p1_score, p2_score) 54 + 55 + 56 + # Solve part 2. 57 + 58 + # All possible roll totals of the quantum dice for a given turn. 59 + rolls = [sum(p) for p in product([1, 2, 3], repeat=3)] 60 + 61 + p1 = start_pos[1] 62 + p2 = start_pos[2] 63 + 64 + # Each universe is represented by (p1_pos, p2_pos, p1_score, p2_score). 65 + universes = Counter([(p1, p2, 0, 0)]) 66 + 67 + while not all(s1 >= 21 or s2 >= 21 for p1, p2, s1, s2 in universes): 68 + next_universes = Counter() 69 + for (p1, p2, s1, s2), count in universes.items(): 70 + if s1 >= 21 or s2 >= 21: 71 + next_universes[p1, p2, s1, s2] += count 72 + continue 73 + 74 + for r in rolls: 75 + np = (((p1 + r) - 1) % 10) + 1 76 + next_universes[(np, p2, s1 + np, s2)] += count 77 + 78 + universes = next_universes 79 + 80 + next_universes = Counter() 81 + for (p1, p2, s1, s2), count in universes.items(): 82 + if s1 >= 21 or s2 >= 21: 83 + next_universes[p1, p2, s1, s2] += count 84 + continue 85 + 86 + for r in rolls: 87 + np = (((p2 + r) - 1) % 10) + 1 88 + next_universes[(p1, np, s1, s2 + np)] += count 89 + 90 + universes = next_universes 91 + 92 + p1_wins = 0 93 + p2_wins = 0 94 + 95 + for (p1, p2, s1, s2), v in universes.items(): 96 + if s1 >= 21: 97 + p1_wins += v 98 + else: 99 + p2_wins += v 100 + 101 + print "Part 2:", max(p1_wins, p2_wins)