Files
aocpy/2018/d9.py

74 lines
1.9 KiB
Python

from lib import str_to_ints
from collections import defaultdict
def part_1(data):
scores = defaultdict(int)
n_players, worth = str_to_ints(data)
current_player = 0
circle = [0]
current = 1
for n in range(1, worth + 1):
if n % 23 == 0:
scores[current_player] += n
current = (current - 7) % len(circle)
scores[current_player] += circle.pop(current)
else:
current = (current + 2) % len(circle)
circle.insert(current, n)
current_player = (current_player + 1) % n_players
print(max(scores.values()))
class Node:
def __init__(self, value, prev=None, next=None):
self.value = value
if prev is None:
self.prev = self
else:
self.prev = prev
if next is None:
self.next = self
else:
self.next = next
def part_2(data):
scores = defaultdict(int)
n_players, worth = str_to_ints(data)
current_player = 0
first = Node(0)
current = first
current.next = current
current.prev = current
for n in range(1, (worth * 100) + 1):
if n % 23 == 0:
scores[current_player] += n
for _ in range(7):
current = current.prev
scores[current_player] += current.value
current.prev.next = current.next
current.next.prev = current.prev
current = current.next
else:
new_current = Node(n, current.next, current.next.next)
current.next.next.prev = new_current
current.next.next = new_current
current = new_current
current_player = (current_player + 1) % n_players
print(max(scores.values()))
def main():
input_file = __file__.replace(".py", ".txt")
with open(input_file) as f:
data = f.read()
part_1(data)
part_2(data)
if __name__ == "__main__":
main()