Browse Source

Some attempts at day 9 performance improvements

master
Chris Smith 5 years ago
parent
commit
baf4de4200
1 changed files with 23 additions and 13 deletions
  1. 23
    13
      day09.nim

+ 23
- 13
day09.nim View File

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