File tree 2 files changed +98
-0
lines changed
2 files changed +98
-0
lines changed Original file line number Diff line number Diff line change
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 ()))
Original file line number Diff line number Diff line change
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 ()))
You can’t perform that action at this time.
0 commit comments