private void DumpCarts() { foreach (var c in AllCarts.GroupBy(x => x.Coordinates.X).OrderBy(x => x.Key)) { foreach (var ca in c.OrderBy(x => x.Coordinates.Y)) { ca.WhereAmI(); } } }
private void initGrid(string path) { var input = File.ReadAllLines(path); var indexCounter = 0; var grid = File.ReadAllLines(path).Select(x => x.ToCharArray()).ToArray(); initTracks(grid); foreach (var t in Tracks) { foreach (var c in t.CartsOnTrack) { AllCarts.Add(c); } } }
public void StartMoving(int delay = 0, bool dumpGrid = false) { var tickCount = 0; while (true) { var cartsToRemove = new List <Cart>(); var cartsByRow = AllCarts.GroupBy(x => x.Coordinates.X).OrderBy(x => x.Key); foreach (var g in cartsByRow) { foreach (var c in g.OrderBy(x => x.Coordinates.Y)) { if (cartsToRemove.Contains(c)) { continue; } c.Move(IntersectionMap); var collidingCarts = AllCarts.Where(x => x.Coordinates.Equals(c.Coordinates)).ToList(); if (collidingCarts.Count() > 1) { Console.WriteLine($"{collidingCarts[0].CurrentDirection} " + $"crashed into {collidingCarts[1].CurrentDirection} " + $"at {collidingCarts[0].Coordinates.Y}, {collidingCarts[0].Coordinates.X} " + $"on tick {tickCount + 1}. {AllCarts.Count - 2} carts left."); cartsToRemove.AddRange(collidingCarts); } } } foreach (var cartToRemove in cartsToRemove) { AllCarts.Remove(cartToRemove); } foreach (var t in Tracks) { t.CartsOnTrack.Clear(); var newCarts = AllCarts.Where(x => x.OnTrack.TrackId == t.TrackId).ToList(); t.CartsOnTrack.AddRange(newCarts); } if (dumpGrid) { DumpGrid(); } foreach (var c in AllCarts) { c.ResetMovement(); } tickCount++; if (AllCarts.Count <= 1) { break; } if (delay > 0) { Thread.Sleep(delay); } } if (AllCarts.Count == 0) { Console.WriteLine("No Carts left! Finished Moving!"); } else { Console.WriteLine($"{AllCarts[0].Coordinates.Y}, {AllCarts[0].Coordinates.X}"); } }