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.4KB

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