Browse Source

Shave another 10ms off of day 9.

We don't need to store values as we can figure them out from
the memory location.
master
Chris Smith 5 years ago
parent
commit
8e0bb8b3ab
1 changed files with 5 additions and 5 deletions
  1. 5
    5
      day09.nim

+ 5
- 5
day09.nim View File

@@ -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