Browse Source

Day 9

Leaderboard position: 124 & 365
master
Chris Smith 5 years ago
parent
commit
77a13266b1
3 changed files with 48 additions and 0 deletions
  1. 2
    0
      answers/09.txt
  2. 1
    0
      data/09.txt
  3. 45
    0
      day09.nim

+ 2
- 0
answers/09.txt View File

@@ -0,0 +1,2 @@
1
+388131
2
+3239376988

+ 1
- 0
data/09.txt View File

@@ -0,0 +1 @@
1
+459 players; last marble is worth 72103 points

+ 45
- 0
day09.nim View File

@@ -0,0 +1,45 @@
1
+import lists, math, sequtils, strscans, strutils
2
+
3
+func insertAfter(node: DoublyLinkedNode[int], value: int) =
4
+    var newNode = newDoublyLinkedNode(value)
5
+    newNode.next = node.next
6
+    newNode.prev = node
7
+    newNode.next.prev = newNode
8
+    newNode.prev.next = newNode
9
+
10
+func remove(node: DoublyLinkedNode[int]) =
11
+    node.prev.next = node.next
12
+    node.next.prev = node.prev
13
+
14
+func newSingleNode(value: int): DoublyLinkedNode[int] =
15
+    result = newDoublyLinkedNode(value)
16
+    result.next = result
17
+    result.prev = result
18
+
19
+var
20
+    input = readFile("data/09.txt").strip
21
+    players: int
22
+    marbles: int
23
+
24
+if not input.scanf("$i players; last marble is worth $i points", players, marbles):
25
+    raise newException(Defect,  "Invalid input line: " & input)
26
+
27
+var
28
+    player = 0
29
+    scores = newSeq[int](players)
30
+    current = newSingleNode(0)
31
+
32
+for i in 1..marbles*100:
33
+    if i mod 23 == 0:
34
+        current = current.prev.prev.prev.prev.prev.prev.prev
35
+        scores[player] += i + current.value
36
+        current.remove
37
+        current = current.next
38
+    else:
39
+        current.next.insertAfter(i)
40
+        current = current.next.next
41
+
42
+    player = (player + 1) mod players
43
+
44
+    if i == marbles or i == marbles * 100:
45
+        echo scores.max