123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- import lists, math, sequtils, strscans, strutils
-
- func insertAfter(node: DoublyLinkedNode[int], value: int) =
- var newNode = newDoublyLinkedNode(value)
- newNode.next = node.next
- newNode.prev = node
- newNode.next.prev = newNode
- newNode.prev.next = newNode
-
- func remove(node: DoublyLinkedNode[int]) =
- node.prev.next = node.next
- node.next.prev = node.prev
-
- func newSingleNode(value: int): DoublyLinkedNode[int] =
- result = newDoublyLinkedNode(value)
- result.next = result
- result.prev = result
-
- var
- input = readFile("data/09.txt").strip
- players: int
- marbles: int
-
- if not input.scanf("$i players; last marble is worth $i points", players, marbles):
- raise newException(Defect, "Invalid input line: " & input)
-
- var
- player = 0
- scores = newSeq[int](players)
- current = newSingleNode(0)
-
- for i in 1..marbles*100:
- if i mod 23 == 0:
- current = current.prev.prev.prev.prev.prev.prev.prev
- scores[player] += i + current.value
- current.remove
- current = current.next
- else:
- current.next.insertAfter(i)
- current = current.next.next
-
- player = (player + 1) mod players
-
- if i == marbles or i == marbles * 100:
- echo scores.max
|