private static int FindCorrectMutation(Instruction[] code) { var visited = new HashSet <InstructionPointer>(); var gameConsole = new HandheldGameConsole(stopFunction: ip => !visited.Add(ip) ? Termination.InfiniteLoop : Termination.None); for (var i = 0; i < code.Length; ++i) { if (code[i].Operation == Operation.Acc) { continue; } visited.Clear(); var originalInstruction = code[i]; code[i] = SwapInstruction(originalInstruction); var(result, termination) = gameConsole.Run(code); if (termination == Termination.RanToCompletion) { return(result); } code[i] = originalInstruction; } throw new InvalidOperationException(); }
public void Part1(string file, int expected) { var code = File.ReadAllLines(file).Select(ParseInstruction).ToArray(); var visited = new HashSet <InstructionPointer>(); var gameConsole = new HandheldGameConsole(stopFunction: ip => !visited.Add(ip) ? Termination.InfiniteLoop : Termination.None); var(result, _) = gameConsole.Run(code); Assert.Equal(expected, result); }