My solutions to 2018's advent of code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

day09.nim 1.3KB

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