public int[] RunProgram(int[] program) { var parameterModes = new int[2]; var infiniteLoopCheck = 0; var running = true; var instructionPointer = 0; //for (int i = 0; i < program.Length; i++) while (running && infiniteLoopCheck < int.MaxValue) { infiniteLoopCheck++; var opcode = program[instructionPointer] % 100; var parameterModeString = ((program[instructionPointer] - opcode) / 100).ToString("00"); parameterModes[0] = (int)char.GetNumericValue(parameterModeString[1]); parameterModes[1] = (int)char.GetNumericValue(parameterModeString[0]); switch (opcode) { case 1: //Add { var firstIndex = program[instructionPointer + 1]; var secondIndex = program[instructionPointer + 2]; var resultIndex = program[instructionPointer + 3]; program[resultIndex] = ReadValue(program, firstIndex, parameterModes[0]) + ReadValue(program, secondIndex, parameterModes[1]); instructionPointer += 3; break; } case 2: // Mult { var firstIndex = program[instructionPointer + 1]; var secondIndex = program[instructionPointer + 2]; var resultIndex = program[instructionPointer + 3]; program[resultIndex] = ReadValue(program, firstIndex, parameterModes[0]) * ReadValue(program, secondIndex, parameterModes[1]); instructionPointer += 3; break; } case 3: //Input { var resultIndex = program[instructionPointer + 1]; program[resultIndex] = int.Parse(_ioSystem.ReadIn()); instructionPointer += 1; break; } case 4: //Output { var resultIndex = program[instructionPointer + 1]; var val = ReadValue(program, resultIndex, parameterModes[0]); _ioSystem.WriteOut(val.ToString()); instructionPointer += 1; break; } case 5: //jump-if-true { var firstIndex = program[instructionPointer + 1]; var secondIndex = program[instructionPointer + 2]; var value1 = ReadValue(program, firstIndex, parameterModes[0]); var value2 = ReadValue(program, secondIndex, parameterModes[1]); if (value1 != 0) { instructionPointer = value2; continue; } instructionPointer += 2; break; } case 6: //jump-if-false { var firstIndex = program[instructionPointer + 1]; var secondIndex = program[instructionPointer + 2]; var value1 = ReadValue(program, firstIndex, parameterModes[0]); var value2 = ReadValue(program, secondIndex, parameterModes[1]); if (value1 == 0) { instructionPointer = value2; continue; } instructionPointer += 2; break; } case 7: //less than { var firstIndex = program[instructionPointer + 1]; var secondIndex = program[instructionPointer + 2]; var value1 = ReadValue(program, firstIndex, parameterModes[0]); var value2 = ReadValue(program, secondIndex, parameterModes[1]); var resultIndex = program[instructionPointer + 3]; program[resultIndex] = (value1 < value2) ? 1 : 0; instructionPointer += 3; break; } case 8: // Equals { var firstIndex = program[instructionPointer + 1]; var secondIndex = program[instructionPointer + 2]; var value1 = ReadValue(program, firstIndex, parameterModes[0]); var value2 = ReadValue(program, secondIndex, parameterModes[1]); var resultIndex = program[instructionPointer + 3]; program[resultIndex] = (value1 == value2) ? 1 : 0; instructionPointer += 3; break; } case 99: // Terminate running = false; continue; default: throw new Exception("Bad command"); } instructionPointer++; } return program; }
public int[] RunProgram(int[] program) { var parameterModes = new int[2]; for (int i = 0; i < program.Length; i++) { var opcode = program[i] % 100; var parameterModeString = ((program[i] - opcode) / 100).ToString("00"); parameterModes[0] = (int)char.GetNumericValue(parameterModeString[1]); parameterModes[1] = (int)char.GetNumericValue(parameterModeString[0]); //parameterModes[2] = (int)char.GetNumericValue(parameterModeString[1]); //parameterModes[3] = (int)char.GetNumericValue(parameterModeString[0]); switch (opcode) { case 1: { var firstIndex = program[i + 1]; var secondIndex = program[i + 2]; var resultIndex = program[i + 3]; program[resultIndex] = ReadValue(program, firstIndex, parameterModes[0]) + ReadValue(program, secondIndex, parameterModes[1]); i += 3; break; } case 2: { var firstIndex = program[i + 1]; var secondIndex = program[i + 2]; var resultIndex = program[i + 3]; program[resultIndex] = ReadValue(program, firstIndex, parameterModes[0]) * ReadValue(program, secondIndex, parameterModes[1]); i += 3; break; } case 3: { var resultIndex = program[i + 1]; program[resultIndex] = int.Parse(_ioSystem.ReadIn()); i += 1; break; } case 4: { var resultIndex = program[i + 1]; var val = ReadValue(program, resultIndex, parameterModes[0]); _ioSystem.WriteOut(val.ToString()); i += 1; break; } case 99: i = program.Length - 1; break; default: throw new Exception("Bad command"); } } return(program); }