|
@@ -1,23 +1,30 @@
|
1
|
|
-import lists, strscans, strutils
|
|
1
|
+import strscans
|
2
|
2
|
|
3
|
|
-func insertAfter(node: DoublyLinkedNode[int], value: int) =
|
4
|
|
- var newNode = newDoublyLinkedNode(value)
|
|
3
|
+type
|
|
4
|
+ Marble = ref object
|
|
5
|
+ next, prev: Marble
|
|
6
|
+ value: int
|
|
7
|
+
|
|
8
|
+func insertAfter(node: Marble, value: int) {.inline.} =
|
|
9
|
+ var newNode = new(Marble)
|
|
10
|
+ newNode.value = value
|
5
|
11
|
newNode.next = node.next
|
6
|
12
|
newNode.prev = node
|
7
|
13
|
newNode.next.prev = newNode
|
8
|
14
|
newNode.prev.next = newNode
|
9
|
15
|
|
10
|
|
-func remove(node: DoublyLinkedNode[int]) =
|
|
16
|
+func remove(node: Marble) {.inline.} =
|
11
|
17
|
node.prev.next = node.next
|
12
|
18
|
node.next.prev = node.prev
|
13
|
19
|
|
14
|
|
-func newSingleNode(value: int): DoublyLinkedNode[int] =
|
15
|
|
- result = newDoublyLinkedNode(value)
|
|
20
|
+func newSingleNode(value: int): Marble =
|
|
21
|
+ result = new(Marble)
|
|
22
|
+ result.value = value
|
16
|
23
|
result.next = result
|
17
|
24
|
result.prev = result
|
18
|
25
|
|
19
|
26
|
var
|
20
|
|
- input = readFile("data/09.txt").strip
|
|
27
|
+ input = readFile("data/09.txt")
|
21
|
28
|
players: int
|
22
|
29
|
marbles: int
|
23
|
30
|
|
|
@@ -28,9 +35,14 @@ var
|
28
|
35
|
player = 0
|
29
|
36
|
scores = newSeq[int](players)
|
30
|
37
|
current = newSingleNode(0)
|
31
|
|
-
|
32
|
|
-for i in 1..marbles*100:
|
33
|
|
- if i mod 23 == 0:
|
|
38
|
+ specialCountdown = 23
|
|
39
|
+ hundredMarbles = marbles * 100
|
|
40
|
+
|
|
41
|
+for i in 1 .. hundredMarbles:
|
|
42
|
+ specialCountdown.dec
|
|
43
|
+ if specialCountdown == 0:
|
|
44
|
+ specialCountdown = 23
|
|
45
|
+ player = (player + 23) mod players
|
34
|
46
|
current = current.prev.prev.prev.prev.prev.prev.prev
|
35
|
47
|
scores[player] += i + current.value
|
36
|
48
|
current.remove
|
|
@@ -39,7 +51,5 @@ for i in 1..marbles*100:
|
39
|
51
|
current.next.insertAfter(i)
|
40
|
52
|
current = current.next.next
|
41
|
53
|
|
42
|
|
- player = (player + 1) mod players
|
43
|
|
-
|
44
|
|
- if i == marbles or i == marbles * 100:
|
|
54
|
+ if i == marbles or i == hundredMarbles:
|
45
|
55
|
echo scores.max
|