Program.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. namespace D13._1
  5. {
  6. class Track : Dictionary<(int x, int y), char> { };
  7. class Carts : List<(int x, int y, int vx, int vy, int t)> { };
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. if (args.Length < 1) return;
  13. if (File.Exists(args[0]) == false) return;
  14. var file = File.OpenText(args[0]);
  15. var track = new Track();
  16. var carts = new Carts();
  17. int y = 0;
  18. do
  19. {
  20. var line = file.ReadLine();
  21. if (line == null) break;
  22. for (int x = 0; x < line.Length; ++x)
  23. {
  24. char c = line[x];
  25. if (c == ' ') continue;
  26. if (isCart(c))
  27. {
  28. carts.Add(getCart(c, x, y));
  29. c = '|';
  30. }
  31. track[(x, y)] = c;
  32. }
  33. y++;
  34. } while (true);
  35. (int x, int y)? coord = null;
  36. do
  37. {
  38. for (var i = 0; i < carts.Count; ++i)
  39. {
  40. var cart = carts[i];
  41. cart.x += cart.vx;
  42. cart.y += cart.vy;
  43. var c = track[(cart.x, cart.y)];
  44. var ncart = getCart(c, cart);
  45. carts[i] = ncart;
  46. }
  47. coord = inter(carts);
  48. } while (coord == null);
  49. Console.WriteLine($"The answer is \"{coord?.x},{coord?.y}\"");
  50. }
  51. static (int x, int y)? inter(Carts carts)
  52. {
  53. for (var i = 0; i < carts.Count; ++i)
  54. {
  55. for (var j = i + 1; j < carts.Count; ++j)
  56. {
  57. var ci = carts[i];
  58. var cj = carts[j];
  59. if (ci.x == cj.x && ci.y == cj.y) return (ci.x, ci.y);
  60. }
  61. }
  62. return null;
  63. }
  64. static bool isCart(char c)
  65. {
  66. return c == '>' || c == '<' || c == '^' || c == 'v';
  67. }
  68. static (int x, int y, int vx, int vy, int t) getCart(char c, int x, int y)
  69. {
  70. switch (c)
  71. {
  72. case '>': return (x, y, +1, +0, 0);
  73. case '<': return (x, y, -1, +0, 0);
  74. case '^': return (x, y, +0, -1, 0);
  75. case 'v': return (x, y, +0, +1, 0);
  76. }
  77. return default;
  78. }
  79. static (int x, int y, int vx, int vy, int t) getCart(char c, (int x, int y, int vx, int vy, int t) cart)
  80. {
  81. if (c == '|' || c == '-') return cart;
  82. if (c == '+' && cart.t == 1)
  83. {
  84. cart.t++;
  85. return cart;
  86. }
  87. switch (cart)
  88. {
  89. case var t when t.vx == 1 && t.vy == 0:
  90. if (c == '/') return (cart.x, cart.y, +0, -1, cart.t);
  91. if (c == '\\') return (cart.x, cart.y, +0, +1, cart.t);
  92. if (c == '+' && cart.t == 0) return (cart.x, cart.y, +0, -1, 1);
  93. if (c == '+' && cart.t == 2) return (cart.x, cart.y, +0, +1, 0);
  94. return default;
  95. case var t when t.vx == -1 && t.vy == 0:
  96. if (c == '/') return (cart.x, cart.y, +0, +1, cart.t);
  97. if (c == '\\') return (cart.x, cart.y, +0, -1, cart.t);
  98. if (c == '+' && cart.t == 0) return (cart.x, cart.y, +0, +1, 1);
  99. if (c == '+' && cart.t == 2) return (cart.x, cart.y, +0, -1, 0);
  100. return default;
  101. case var t when t.vx == 0 && t.vy == 1:
  102. if (c == '/') return (cart.x, cart.y, -1, +0, cart.t);
  103. if (c == '\\') return (cart.x, cart.y, +1, +0, cart.t);
  104. if (c == '+' && cart.t == 0) return (cart.x, cart.y, +1, +0, 1);
  105. if (c == '+' && cart.t == 2) return (cart.x, cart.y, -1, +0, 0);
  106. return default;
  107. case var t when t.vx == 0 && t.vy == -1:
  108. if (c == '/') return (cart.x, cart.y, +1, +0, cart.t);
  109. if (c == '\\') return (cart.x, cart.y, -1, +0, cart.t);
  110. if (c == '+' && cart.t == 0) return (cart.x, cart.y, -1, +0, 1);
  111. if (c == '+' && cart.t == 2) return (cart.x, cart.y, +1, +0, 0);
  112. return default;
  113. }
  114. return default;
  115. }
  116. }
  117. }