public static RailDirectionFlags ToRailDirectionFlags(RailDirection direction) { switch (direction) { case RailDirection.DownLeft: return(RailDirectionFlags.DownLeft); case RailDirection.DownRight: return(RailDirectionFlags.DownRight); case RailDirection.Horizontal: return(RailDirectionFlags.Horizontal); case RailDirection.UpLeft: return(RailDirectionFlags.UpLeft); case RailDirection.UpRight: return(RailDirectionFlags.UpRight); case RailDirection.Vertical: return(RailDirectionFlags.Vertical); default: throw new ArgumentOutOfRangeException("direction"); } }
public static IEnumerable<VehicleDirection12> ToVehicleDirections(RailDirection direction) { switch (direction) { case RailDirection.DownLeft: yield return VehicleDirection12.DownLeftDown; yield return VehicleDirection12.DownLeftLeft; break; case RailDirection.DownRight: yield return VehicleDirection12.DownRightDown; yield return VehicleDirection12.DownRightRight; break; case RailDirection.Horizontal: yield return VehicleDirection12.HorizontalLeft; yield return VehicleDirection12.HorizontalRight; break; case RailDirection.UpLeft: yield return VehicleDirection12.UpLeftLeft; yield return VehicleDirection12.UpLeftUp; break; case RailDirection.UpRight: yield return VehicleDirection12.UpRightRight; yield return VehicleDirection12.UpRightUp; break; case RailDirection.Vertical: yield return VehicleDirection12.VerticalDown; yield return VehicleDirection12.VerticalUp; break; default: throw new ArgumentOutOfRangeException("direction"); } }
public static IEnumerable<TileEnterDirection> ToTileEnterDirections(RailDirection rail_direction) { switch (rail_direction) { case RailDirection.Horizontal: yield return TileEnterDirection.Left; yield return TileEnterDirection.Right; break; case RailDirection.Vertical: yield return TileEnterDirection.Left; yield return TileEnterDirection.Right; break; case RailDirection.DownLeft: yield return TileEnterDirection.Down; yield return TileEnterDirection.Left; break; case RailDirection.DownRight: yield return TileEnterDirection.Down; yield return TileEnterDirection.Right; break; case RailDirection.UpLeft: yield return TileEnterDirection.Up; yield return TileEnterDirection.Left; break; case RailDirection.UpRight: yield return TileEnterDirection.Up; yield return TileEnterDirection.Right; break; default: throw new Exception(); } }
public static RailDirectionFlags ToRailDirectionFlags(RailDirection direction) { switch (direction) { case RailDirection.DownLeft: return RailDirectionFlags.DownLeft; case RailDirection.DownRight: return RailDirectionFlags.DownRight; case RailDirection.Horizontal: return RailDirectionFlags.Horizontal; case RailDirection.UpLeft: return RailDirectionFlags.UpLeft; case RailDirection.UpRight: return RailDirectionFlags.UpRight; case RailDirection.Vertical: return RailDirectionFlags.Vertical; default: throw new ArgumentOutOfRangeException("direction"); } }
public static int ToRailDirectionFlags(RailDirection direction) { switch (direction) { case RailDirection.DownLeft: return RailDirectionFlags.DownLeft; case RailDirection.DownRight: return RailDirectionFlags.DownRight; case RailDirection.Horizontal: return RailDirectionFlags.Horizontal; case RailDirection.UpLeft: return RailDirectionFlags.UpLeft; case RailDirection.UpRight: return RailDirectionFlags.UpRight; case RailDirection.Vertical: return RailDirectionFlags.Vertical; default: return 0; } }
static void Main(string[] args) { RailDirection[,] rails = new RailDirection[150, 150]; List <Cart> carts = new List <Cart>(); StreamReader sr = new StreamReader("input13.txt"); int j = 0; while (sr.Peek() != -1) { string line = sr.ReadLine(); for (int i = 0; i < line.Length; i++) { if (line[i] == ' ') { rails[i, j] = RailDirection.None; } else if (line[i] == '|') { rails[i, j] = RailDirection.Vertical; } else if (line[i] == '-') { rails[i, j] = RailDirection.Horizontal; } else if (line[i] == '/') { rails[i, j] = RailDirection.Right; } else if (line[i] == '\\') { rails[i, j] = RailDirection.Left; } else if (line[i] == '+') { rails[i, j] = RailDirection.Intersection; } else if (line[i] == '>') { rails[i, j] = RailDirection.Horizontal; carts.Add(new Cart(i, j, CartDirection.Right)); } else if (line[i] == '<') { rails[i, j] = RailDirection.Horizontal; carts.Add(new Cart(i, j, CartDirection.Left)); } else if (line[i] == '^') { rails[i, j] = RailDirection.Vertical; carts.Add(new Cart(i, j, CartDirection.Up)); } else if (line[i] == 'v') { rails[i, j] = RailDirection.Vertical; carts.Add(new Cart(i, j, CartDirection.Down)); } } j++; } //PART1 bool nCollision = true; bool first = false; List <Cart> toRemove = new List <Cart>(); while (nCollision) { carts.Sort(compareCarts); //by rows then from left to right for (int i = 0; i < carts.Count; i++) { if (toRemove.Contains(carts[i])) { continue; //cart removed } Cart c = carts[i]; if (c.dir == CartDirection.Left) { c.x--; } else if (c.dir == CartDirection.Right) { c.x++; } else if (c.dir == CartDirection.Up) { c.y--; } else if (c.dir == CartDirection.Down) { c.y++; } if (rails[c.x, c.y] == RailDirection.Left) // -----\----- { if (c.dir == CartDirection.Left) { c.dir = CartDirection.Up; } else if (c.dir == CartDirection.Right) { c.dir = CartDirection.Down; } else if (c.dir == CartDirection.Up) { c.dir = CartDirection.Left; } else if (c.dir == CartDirection.Down) { c.dir = CartDirection.Right; } } else if (rails[c.x, c.y] == RailDirection.Right) // ---/---- { if (c.dir == CartDirection.Left) { c.dir = CartDirection.Down; } else if (c.dir == CartDirection.Right) { c.dir = CartDirection.Up; } else if (c.dir == CartDirection.Up) { c.dir = CartDirection.Right; } else if (c.dir == CartDirection.Down) { c.dir = CartDirection.Left; } } else if (rails[c.x, c.y] == RailDirection.Intersection) // ---+---- { if (c.dir == CartDirection.Left) { if (c.lastTurn == CartDirection.Right) //turn left { c.dir = CartDirection.Down; c.lastTurn = CartDirection.Left; } else if (c.lastTurn == CartDirection.Left) //go straight { c.lastTurn = CartDirection.Up; } else if (c.lastTurn == CartDirection.Up) //turn right { c.dir = CartDirection.Up; c.lastTurn = CartDirection.Right; } } else if (c.dir == CartDirection.Right) { if (c.lastTurn == CartDirection.Right) //turn left { c.dir = CartDirection.Up; c.lastTurn = CartDirection.Left; } else if (c.lastTurn == CartDirection.Left) //go straight { c.lastTurn = CartDirection.Up; } else if (c.lastTurn == CartDirection.Up) //turn right { c.dir = CartDirection.Down; c.lastTurn = CartDirection.Right; } } else if (c.dir == CartDirection.Up) { if (c.lastTurn == CartDirection.Right) //turn left { c.dir = CartDirection.Left; c.lastTurn = CartDirection.Left; } else if (c.lastTurn == CartDirection.Left) //go straight { c.lastTurn = CartDirection.Up; } else if (c.lastTurn == CartDirection.Up) //turn right { c.dir = CartDirection.Right; c.lastTurn = CartDirection.Right; } } else if (c.dir == CartDirection.Down) { if (c.lastTurn == CartDirection.Right) //turn left { c.dir = CartDirection.Right; c.lastTurn = CartDirection.Left; } else if (c.lastTurn == CartDirection.Left) //go straight { c.lastTurn = CartDirection.Up; } else if (c.lastTurn == CartDirection.Up) //turn right { c.dir = CartDirection.Left; c.lastTurn = CartDirection.Right; } } } carts[i] = c; //update position for (int k = 0; k < carts.Count; k++) { if (carts[k].x == c.x && carts[k].y == c.y && i != k && !toRemove.Contains(carts[k])) { if (!first) { //PART1 first = true; Console.WriteLine(c.x + "," + c.y); //PART1 } toRemove.Add(carts[k]); toRemove.Add(carts[i]); } } } //PART2 if (toRemove.Count > 0) { foreach (Cart cc in toRemove) { carts.Remove(cc); } toRemove.Clear(); } if (carts.Count == 1) { Cart x = carts[0]; Console.WriteLine(x.x + "," + x.y); nCollision = false; break; } //PART2 } }