private static Map Investigate(long[] memory) { var droid = new Droid(memory); droid.OnMove = () => { if (droid.Map.IsOxygenPathInvestigated()) { droid.Halt(); } foreach (var direction in new[] { Direction.Up, Direction.Right, Direction.Left, Direction.Down }) { var next = droid.Location + direction; if (!droid.Map.IsVisitedOrWall(next)) { return(direction); } } return(new[] { Direction.Down, Direction.Left, Direction.Right, Direction.Up } .Where(i => !droid.Map.IsWall(droid.Location + i)) .OrderBy(i => droid.Map.GetVisitedCount(droid.Location + i)) .First()); }; droid.Run(); return(droid.Map); }
public static int Solve(IEnumerable <string> input) { var memory = input .First() .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .Select(i => long.Parse(i, CultureInfo.InvariantCulture)) .ToArray(); var droid = new Droid(memory); droid.OnMove = () => { if (droid.Map.IsOxygenPathInvestigated()) { droid.Halt(); } foreach (var direction in new[] { Direction.Up, Direction.Right, Direction.Left, Direction.Down }) { var next = droid.Location + direction; if (!droid.Map.IsVisitedOrWall(next)) { return(direction); } } return(new[] { Direction.Down, Direction.Left, Direction.Right, Direction.Up } .Where(i => !droid.Map.IsWall(droid.Location + i)) .OrderBy(i => droid.Map.GetVisitedCount(droid.Location + i)) .First()); }; droid.Run(); var path = new PathResolver(droid.Map).FindPath(default, droid.Map.OxygenSystem);
static void Main(string[] args) { var inputFile = Environment.CurrentDirectory + "//input.txt"; // Input file should be a single line string line = System.IO.File.ReadAllLines(inputFile)[0]; IntcodeInterpreter discoveryInterpreter = new IntcodeInterpreter(line, isInterractiveMode: false); Droid mazeDiscoveryDroid = new Droid(0, 0, discoveryInterpreter); var solver = new DroidMazeSolver(line); solver.DiscoverMaze(mazeDiscoveryDroid); var start = (0, 0); var end = solver.OxygenSystemLocation; solver.FindShortestPathUsingBFS(start, end); solver.PrintMaze(); }