|
@@ -8,17 +8,18 @@ import strscans
|
8
|
8
|
type
|
9
|
9
|
Marble = ptr object
|
10
|
10
|
next: Marble
|
11
|
|
- value: int32
|
12
|
11
|
|
13
|
12
|
const
|
14
|
|
- MarbleSize = sizeof(uint) + sizeof(int32)
|
|
13
|
+ MarbleSize = sizeof(pointer)
|
15
|
14
|
|
16
|
15
|
proc addressOf(memory: pointer, marbleNumber: int): Marble {.inline.} =
|
17
|
16
|
cast[Marble](cast[uint](memory) + cast[uint](marbleNumber * MarbleSize))
|
18
|
17
|
|
|
18
|
+proc valueOf(memory: pointer, marble: Marble): int {.inline.} =
|
|
19
|
+ cast[int](cast[uint](marble) - cast[uint](memory)) div MarbleSize
|
|
20
|
+
|
19
|
21
|
proc insertAfter(node: Marble, memory: pointer, value: int): Marble {.inline.} =
|
20
|
22
|
var newNode = memory.addressOf(value)
|
21
|
|
- newNode.value = cast[int32](value)
|
22
|
23
|
newNode.next = node.next
|
23
|
24
|
node.next = newNode
|
24
|
25
|
newNode
|
|
@@ -28,7 +29,6 @@ proc removeNext(node: Marble) {.inline.} =
|
28
|
29
|
|
29
|
30
|
proc newSingleNode(memory: pointer, value: int): Marble =
|
30
|
31
|
result = memory.addressOf(value)
|
31
|
|
- result.value = cast[int32](value)
|
32
|
32
|
result.next = result
|
33
|
33
|
|
34
|
34
|
var
|
|
@@ -66,7 +66,7 @@ for i in 1 .. hundredMarbles:
|
66
|
66
|
# The current player is only relevant when a 23nth marble is played, so
|
67
|
67
|
# we can just update the player here instead of every turn.
|
68
|
68
|
player = (player + 23) mod players
|
69
|
|
- scores[player] += i + currentTrail.next.value
|
|
69
|
+ scores[player] += i + memory.valueOf(currentTrail.next)
|
70
|
70
|
currentTrail.removeNext
|
71
|
71
|
current = currentTrail.next
|
72
|
72
|
currentTrail = current
|