74 lines
1.9 KiB
Python
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()
|