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.

day13.nim 2.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import algorithm, strutils
  2. type
  3. Cart = ref object
  4. x, y, dx, dy, turn: int
  5. crashed: bool
  6. proc newCart(x, y, dx, dy: int): Cart =
  7. result = new(Cart)
  8. result.x = x
  9. result.y = y
  10. result.dx = dx
  11. result.dy = dy
  12. proc cmpCarts(x, y: Cart): int =
  13. if x.y == y.y:
  14. x.x - y.x
  15. else:
  16. x.y - y.y
  17. proc cartsAt(carts: seq[Cart], x,y: int): seq[Cart] =
  18. for cart in carts:
  19. if cart.x == x and cart.y == y and not cart.crashed:
  20. result.add(cart)
  21. proc move(cart: Cart, grid: seq[string]) =
  22. cart.x += cart.dx
  23. cart.y += cart.dy
  24. var
  25. dx = cart.dx
  26. dy = cart.dy
  27. let cell = grid[cart.y][cart.x]
  28. if cell == '/':
  29. cart.dx = -dy
  30. cart.dy = -dx
  31. if cell == '\\':
  32. cart.dx = dy
  33. cart.dy = dx
  34. elif cell == '+':
  35. if cart.turn == 0:
  36. cart.dx = dy
  37. cart.dy = -dx
  38. elif cart.turn == 2:
  39. cart.dx = -dy
  40. cart.dy = dx
  41. cart.turn = (cart.turn + 1) mod 3
  42. var
  43. lines = readFile("data/13.txt").splitlines
  44. grid: seq[string]
  45. carts: seq[Cart]
  46. for i, line in lines:
  47. var gridLine = ""
  48. for j, c in line:
  49. case c:
  50. of '>':
  51. carts.add(newCart(j, i, 1, 0))
  52. gridLine &= '-'
  53. of '<':
  54. carts.add(newCart(j, i, -1, 0))
  55. gridLine &= '-'
  56. of 'v':
  57. carts.add(newCart(j, i, 0, 1))
  58. gridLine &= '|'
  59. of '^':
  60. carts.add(newCart(j, i, 0, -1))
  61. gridLine &= '|'
  62. else:
  63. gridLine &= c
  64. grid.add(gridLine)
  65. var uncrashed = carts.len
  66. while uncrashed > 1:
  67. carts.sort(cmpCarts)
  68. for cart in carts:
  69. if not cart.crashed:
  70. cart.move(grid)
  71. var dupes = carts.cartsAt(cart.x, cart.y)
  72. if dupes.len > 1:
  73. if uncrashed == carts.len:
  74. echo cart.x, ",", cart.y
  75. for crash in dupes:
  76. crash.crashed = true
  77. uncrashed.dec
  78. for cart in carts:
  79. if not cart.crashed:
  80. echo cart.x, ",", cart.y