public void ExecuteIntcodeProgram_HappyPath_ReturnsExpectedResult(IntcodeProgramState program, IntcodeProgramState expectedResult) { var result = IntcodeProgramExecutor.ExecuteIntcodeProgram(program); result.Codes.Should().BeEquivalentTo(expectedResult.Codes); result.CurrentInstruction.Should().Be(expectedResult.CurrentInstruction); }
private static IntcodeProgramState ExecuteIntcodeProgramStep(IntcodeProgramState program) { var current = program.CurrentInstruction; var opCode = program.Codes[current++]; if (opCode == 99) { return(program); } Func <int, int, int> op = opCode switch { 1 => (a, b) => a + b, 2 => (a, b) => a * b, _ => throw new Exception($"Unknown op code {opCode}") }; var a = program.Codes[program.Codes[current++]]; var b = program.Codes[program.Codes[current++]]; var resultIndex = program.Codes[current++]; var result = op(a, b); var newCodes = program.Codes.SetItem(resultIndex, result); return(new IntcodeProgramState() { Codes = newCodes, CurrentInstruction = current }); } }
public static IntcodeProgramState ExecuteIntcodeProgram(IntcodeProgramState program) { while (!Done(program)) { program = ExecuteIntcodeProgramStep(program); } return(program); }
private static bool Done(IntcodeProgramState program) => program.Codes[program.CurrentInstruction] == 99;