|
|
@@ -5,7 +5,7 @@ using System.IO;
|
|
|
namespace D13._1
|
|
|
{
|
|
|
class Track : Dictionary<(int x, int y), char> { };
|
|
|
- class Carts : List<(int x, int y, int vx, int vy)> { };
|
|
|
+ class Carts : List<(int x, int y, int vx, int vy, int t)> { };
|
|
|
|
|
|
class Program
|
|
|
{
|
|
|
@@ -31,7 +31,7 @@ namespace D13._1
|
|
|
|
|
|
if (isCart(c))
|
|
|
{
|
|
|
-
|
|
|
+ carts.Add(getCart(c, x, y));
|
|
|
c = '|';
|
|
|
}
|
|
|
|
|
|
@@ -41,6 +41,43 @@ namespace D13._1
|
|
|
y++;
|
|
|
|
|
|
} while (true);
|
|
|
+
|
|
|
+ (int x, int y)? coord = null;
|
|
|
+ do
|
|
|
+ {
|
|
|
+
|
|
|
+ for (var i = 0; i < carts.Count; ++i)
|
|
|
+ {
|
|
|
+ var cart = carts[i];
|
|
|
+
|
|
|
+ cart.x += cart.vx;
|
|
|
+ cart.y += cart.vy;
|
|
|
+
|
|
|
+ var c = track[(cart.x, cart.y)];
|
|
|
+ var ncart = getCart(c, cart);
|
|
|
+
|
|
|
+ carts[i] = ncart;
|
|
|
+ }
|
|
|
+ coord = inter(carts);
|
|
|
+
|
|
|
+ } while (coord == null);
|
|
|
+
|
|
|
+ Console.WriteLine($"The answer is \"{coord?.x},{coord?.y}\"");
|
|
|
+ }
|
|
|
+
|
|
|
+ static (int x, int y)? inter(Carts carts)
|
|
|
+ {
|
|
|
+ for (var i = 0; i < carts.Count; ++i)
|
|
|
+ {
|
|
|
+ for (var j = i + 1; j < carts.Count; ++j)
|
|
|
+ {
|
|
|
+ var ci = carts[i];
|
|
|
+ var cj = carts[j];
|
|
|
+
|
|
|
+ if (ci.x == cj.x && ci.y == cj.y) return (ci.x, ci.y);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
static bool isCart(char c)
|
|
|
@@ -48,14 +85,60 @@ namespace D13._1
|
|
|
return c == '>' || c == '<' || c == '^' || c == 'v';
|
|
|
}
|
|
|
|
|
|
- static (int x, int y, int vx, int vy) getCart(char c, int x, int y)
|
|
|
+ static (int x, int y, int vx, int vy, int t) getCart(char c, int x, int y)
|
|
|
{
|
|
|
switch (c)
|
|
|
{
|
|
|
- case '>': return (x, y, +1, +0);
|
|
|
- case '<': return (x, y, -1, +0);
|
|
|
- case '^': return (x, y, +0, -1);
|
|
|
- case 'v': return (x, y, +0, +1);
|
|
|
+ case '>': return (x, y, +1, +0, 0);
|
|
|
+ case '<': return (x, y, -1, +0, 0);
|
|
|
+ case '^': return (x, y, +0, -1, 0);
|
|
|
+ case 'v': return (x, y, +0, +1, 0);
|
|
|
+ }
|
|
|
+ return default;
|
|
|
+ }
|
|
|
+
|
|
|
+ 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)
|
|
|
+ {
|
|
|
+ if (c == '|' || c == '-') return cart;
|
|
|
+ if (c == '+' && cart.t == 1)
|
|
|
+ {
|
|
|
+ cart.t++;
|
|
|
+ return cart;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (cart)
|
|
|
+ {
|
|
|
+ case var t when t.vx == 1 && t.vy == 0:
|
|
|
+
|
|
|
+ if (c == '/') return (cart.x, cart.y, +0, -1, cart.t);
|
|
|
+ if (c == '\\') return (cart.x, cart.y, +0, +1, cart.t);
|
|
|
+ if (c == '+' && cart.t == 0) return (cart.x, cart.y, +0, -1, 1);
|
|
|
+ if (c == '+' && cart.t == 2) return (cart.x, cart.y, +0, +1, 0);
|
|
|
+ return default;
|
|
|
+
|
|
|
+ case var t when t.vx == -1 && t.vy == 0:
|
|
|
+
|
|
|
+ if (c == '/') return (cart.x, cart.y, +0, +1, cart.t);
|
|
|
+ if (c == '\\') return (cart.x, cart.y, +0, -1, cart.t);
|
|
|
+ if (c == '+' && cart.t == 0) return (cart.x, cart.y, +0, +1, 1);
|
|
|
+ if (c == '+' && cart.t == 2) return (cart.x, cart.y, +0, -1, 0);
|
|
|
+ return default;
|
|
|
+
|
|
|
+ case var t when t.vx == 0 && t.vy == 1:
|
|
|
+
|
|
|
+ if (c == '/') return (cart.x, cart.y, -1, +0, cart.t);
|
|
|
+ if (c == '\\') return (cart.x, cart.y, +1, +0, cart.t);
|
|
|
+ if (c == '+' && cart.t == 0) return (cart.x, cart.y, +1, +0, 1);
|
|
|
+ if (c == '+' && cart.t == 2) return (cart.x, cart.y, -1, +0, 0);
|
|
|
+ return default;
|
|
|
+
|
|
|
+ case var t when t.vx == 0 && t.vy == -1:
|
|
|
+
|
|
|
+ if (c == '/') return (cart.x, cart.y, +1, +0, cart.t);
|
|
|
+ if (c == '\\') return (cart.x, cart.y, -1, +0, cart.t);
|
|
|
+ if (c == '+' && cart.t == 0) return (cart.x, cart.y, -1, +0, 1);
|
|
|
+ if (c == '+' && cart.t == 2) return (cart.x, cart.y, +1, +0, 0);
|
|
|
+ return default;
|
|
|
}
|
|
|
return default;
|
|
|
}
|