Skip to content

Commit 1f8c491

Browse files
committed
2018 Day 9
1 parent d48d204 commit 1f8c491

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

2018/9a.py

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import collections
2+
3+
PLAYERS = 400
4+
LAST_MARBLE = 7186400 # points
5+
6+
7+
class MarbleDesk(collections.UserList):
8+
def __getitem__(self, x):
9+
return self.data[x % len(self)]
10+
11+
# def insert(self, i, x):
12+
# " Insert before the i-th element "
13+
# return self.data.insert(i % len(self), x)
14+
15+
# def pop(self, i):
16+
# return self.data.pop(i % len(self))
17+
18+
19+
m = collections.deque([0])
20+
current = 0
21+
# I index players from zero, in the text they start at 1
22+
player = 0
23+
scoreboard = collections.defaultdict(int)
24+
25+
for next_marble in range(1, LAST_MARBLE + 1):
26+
if next_marble % 23:
27+
# normal run
28+
insert_index = (current + 2) % len(m)
29+
m.insert(insert_index, next_marble)
30+
current = insert_index
31+
else:
32+
# special case
33+
scoreboard[player] += next_marble
34+
pop_index = (current - 7) % len(m)
35+
scoreboard[player] += m.pop(pop_index)
36+
current = (pop_index) % len(m)
37+
player = (player + 1) % PLAYERS
38+
39+
print(max(scoreboard.values()))

2018/9b.py

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import collections
2+
3+
PLAYERS = 400
4+
LAST_MARBLE = 7186400 # points
5+
6+
7+
class Node:
8+
def __init__(self, num):
9+
self.num = num
10+
self.prev = None
11+
self.next = None
12+
13+
def insert_after(self, n, new_node):
14+
node = self
15+
for i in range(n):
16+
node = node.next
17+
old_next = node.next
18+
node.next = new_node
19+
old_next.prev = new_node
20+
new_node.next = old_next
21+
new_node.prev = node
22+
23+
def prev_n(self, n):
24+
node = self
25+
for i in range(n):
26+
node = node.prev
27+
return node
28+
29+
def remove(self):
30+
self.prev.next = self.next
31+
self.next.prev = self.prev
32+
after_this = self.next
33+
self.next = None
34+
self.prev = None
35+
return self.num, after_this
36+
37+
38+
m = Node(0)
39+
m.prev = m
40+
m.next = m
41+
current = m
42+
# I index players from zero, in the text they start at 1
43+
player = 0
44+
scoreboard = collections.defaultdict(int)
45+
46+
for next_marble in range(1, LAST_MARBLE + 1):
47+
if next_marble % 23:
48+
# normal run
49+
n = Node(next_marble)
50+
current.insert_after(1, n)
51+
current = n
52+
else:
53+
# special case
54+
scoreboard[player] += next_marble
55+
score, current = current.prev_n(7).remove()
56+
scoreboard[player] += score
57+
player = (player + 1) % PLAYERS
58+
59+
print(max(scoreboard.values()))

0 commit comments

Comments
 (0)