private static (CharMap, int) BuildMapAndFindOxygen(string intcode) { var map = new CharMap(); var movements = new MoveGenerator(); map[movements.Current.Position] = MapSpace; var stepsToOxygen = 0; var debug = false; var engine2 = new Engine() .WithMemory(intcode) .OnInput(engine => { var movement = movements.NextProposal(map); if (movement == MoveNone) { engine.Halt = true; } if (debug) { Console.Clear(); Console.WriteLine($"Moves: {movements}"); foreach (var line in map.Render(MapOverlay)) { Console.WriteLine(line); } Console.ReadKey(); } engine.Input.Add(movement); }) .OnOutput(engine => { var status = engine.Output.Take(); switch (status) { case StatusHitTheWall: map[movements.ProposedPosition] = MapWall; break; case StatusMoved: movements.ApproveMove(); map[movements.Current.Position] = MapSpace; break; case StatusFoundOxygen: movements.ApproveMove(); map[movements.Current.Position] = MapOxygen; stepsToOxygen = movements.Moves; break; } }) .Execute(); return(map, stepsToOxygen); // Draw Droid on top of map char MapOverlay(Point p, char val) { var droid = movements.Current?.Position; return(p == droid ? MapDroid : val); } }