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