| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- using System;
- using System.Collections.Generic;
- 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, int t)> { };
- class Program
- {
- static void Main(string[] args)
- {
- if (args.Length < 1) return;
- if (File.Exists(args[0]) == false) return;
- var file = File.OpenText(args[0]);
- var track = new Track();
- var carts = new Carts();
- int y = 0;
- do
- {
- var line = file.ReadLine();
- if (line == null) break;
- for (int x = 0; x < line.Length; ++x)
- {
- char c = line[x];
- if (c == ' ') continue;
- if (isCart(c))
- {
- carts.Add(getCart(c, x, y));
- c = '|';
- }
- track[(x, y)] = c;
- }
- 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)
- {
- return c == '>' || c == '<' || c == '^' || c == 'v';
- }
- 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, 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;
- }
- }
- }
|