public static int ResolveProgram(int[] program, Action <int> HandleOutput, Func <int> HandleInput) { var pointer = 0; var diagnosticCode = 0; OpcodeInstruction instruction = null; do { var jump = false; instruction = ParseProgramInstruction(program[pointer]); var firstParameterMode = instruction.ModesOfParameter.Count > 0 ? instruction.ModesOfParameter[0] : ParameterMode.Positional; var secondParameterMode = instruction.ModesOfParameter.Count > 1 ? instruction.ModesOfParameter[1] : ParameterMode.Positional; switch (instruction.Opcode) { case Opcode.Addition: program[program[pointer + 3]] = GetParameter(program, firstParameterMode, pointer + 1) + GetParameter(program, secondParameterMode, pointer + 2); break; case Opcode.Multiplication: program[program[pointer + 3]] = GetParameter(program, firstParameterMode, pointer + 1) * GetParameter(program, secondParameterMode, pointer + 2); break; case Opcode.GetInput: program[program[pointer + 1]] = HandleInput(); break; case Opcode.GetOutput: diagnosticCode = GetParameter(program, firstParameterMode, pointer + 1); HandleOutput(diagnosticCode); break; case Opcode.JumpIfTrue: if (GetParameter(program, firstParameterMode, pointer + 1) != 0) { pointer = GetParameter(program, secondParameterMode, pointer + 2); jump = true; } break; case Opcode.JumpIfFalse: if (GetParameter(program, firstParameterMode, pointer + 1) == 0) { pointer = GetParameter(program, secondParameterMode, pointer + 2); jump = true; } break; case Opcode.LessThan: program[program[pointer + 3]] = GetParameter(program, firstParameterMode, pointer + 1) < GetParameter(program, secondParameterMode, pointer + 2) ? 1 : 0; break; case Opcode.Equals: program[program[pointer + 3]] = GetParameter(program, firstParameterMode, pointer + 1) == GetParameter(program, secondParameterMode, pointer + 2) ? 1 : 0; break; case Opcode.Exit: return(diagnosticCode); } if (!jump) { pointer += GetPointerMoveAmount(instruction.Opcode); } }while (pointer < program.Length); return(diagnosticCode); }
public RegisterSample(RegisterValues initialValues, OpcodeInstruction opcodeInstruction, RegisterValues updatedValues) { InitialValues = initialValues; OpcodeInstruction = opcodeInstruction; UpdatedValues = updatedValues; }