My solutions to 2018's advent of code
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
Ce dépôt est archivé. Vous pouvez voir les fichiers et le cloner, mais vous ne pouvez pas pousser ni ouvrir de ticket/demande d'ajout.

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