ソースを参照

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年前
コミット
8e0bb8b3ab
1個のファイルの変更5行の追加5行の削除
  1. 5
    5
      day09.nim

+ 5
- 5
day09.nim ファイルの表示

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