public Queue <long> Run(Queue <long> input) { _state = IntCodeProgramState.RUNNING; _output = new Queue <long>(); while (_iteratorPos < _data.Count() && _data[_iteratorPos] != 99 && _state == IntCodeProgramState.RUNNING) { //Console.WriteLine($"opcode: {_data[_iteratorPos]}"); long[] codes = new long[] { 0, 0, 0, 0, 0 }; long[] parsedCodes = NumToArray(_data[_iteratorPos]); parsedCodes = parsedCodes.Reverse().ToArray(); for (int j = 0; j < parsedCodes.Length; j++) { codes[j] = parsedCodes[j]; } long opcode = codes[0]; long mode1 = codes[2]; long mode2 = codes[3]; long mode3 = codes[4]; long value1 = 0; switch (mode1) { case 0: value1 = GetData((int)GetData(_iteratorPos + 1)); break; case 1: value1 = GetData(_iteratorPos + 1); break; case 2: value1 = GetData((int)GetData(_iteratorPos + 1) + _relativeBase); break; } long value2 = 0; int value3 = 0; if (opcode != 4 && opcode != 3 && opcode != 9) { switch (mode2) { case 0: value2 = GetData((int)GetData(_iteratorPos + 2)); break; case 1: value2 = GetData(_iteratorPos + 2); break; case 2: value2 = GetData((int)GetData(_iteratorPos + 2) + _relativeBase); break; } if (opcode == 1 || opcode == 2 || opcode == 7 || opcode == 8) { switch (mode3) { case 0: value3 = (int)GetData(_iteratorPos + 3); break; case 1: value3 = _iteratorPos + 3; break; case 2: value3 = (int)GetData(_iteratorPos + 3) + _relativeBase; break; } } } if (opcode == 1) { SetData(value3, value1 + value2); _iteratorPos += 4; } else if (opcode == 2) { SetData(value3, value1 * value2); _iteratorPos += 4; } else if (opcode == 3) { if (input.Count > 0) { long currentInput = input.Dequeue(); switch (mode1) { case 0: value1 = (int)GetData(_iteratorPos + 1); break; case 1: value1 = _iteratorPos + 1; break; case 2: value1 = (int)GetData(_iteratorPos + 1) + _relativeBase; break; } int tmpPos = (int)value1; SetData(tmpPos, currentInput); _iteratorPos += 2; } else { _state = IntCodeProgramState.PAUSED; } } else if (opcode == 4) { _output.Enqueue(value1); //Console.WriteLine(value1); _iteratorPos += 2; } else if (opcode == 5) { if (value1 != 0) { _iteratorPos = (int)value2; } else { _iteratorPos += 3; } } else if (opcode == 6) { if (value1 == 0) { _iteratorPos = (int)value2; } else { _iteratorPos += 3; } } else if (opcode == 7) { SetData(value3, value1 < value2 ? 1 : 0); _iteratorPos += 4; } else if (opcode == 8) { SetData(value3, value1 == value2 ? 1 : 0); _iteratorPos += 4; } else if (opcode == 9) { _relativeBase += (int)value1; _iteratorPos += 2; } } if (_data[_iteratorPos] == 99) { _state = IntCodeProgramState.FINISHED; } return(this._output); }
public int Run(Queue <int> input) { _state = IntCodeProgramState.RUNNING; Output = 0; while (_iteratorPos < _data.Count() && _data[_iteratorPos] != 99 && _state == IntCodeProgramState.RUNNING) { int[] codes = new int[] { 0, 0, 0, 0 }; int[] parsedCodes = NumToArray(_data[_iteratorPos]); parsedCodes = parsedCodes.Reverse().ToArray(); for (int j = 0; j < parsedCodes.Length; j++) { codes[j] = parsedCodes[j]; } int opcode = codes[0]; int mode1 = codes[2]; int mode2 = codes[3]; int value1 = mode1 == 0 ? _data[_data[_iteratorPos + 1]] : _data[_iteratorPos + 1]; int value2 = 0; if (opcode != 4 && opcode != 3) { value2 = mode2 == 0 ? _data[_data[_iteratorPos + 2]] : _data[_iteratorPos + 2]; } if (opcode == 1) { _data[_data[_iteratorPos + 3]] = value1 + value2; _iteratorPos += 4; } else if (opcode == 2) { _data[_data[_iteratorPos + 3]] = value1 * value2; _iteratorPos += 4; } else if (opcode == 3) { if (input.Count > 0) { int currentInput = input.Dequeue(); int tmpPos = _data[_iteratorPos + 1]; _data[tmpPos] = currentInput; _iteratorPos += 2; } else { _state = IntCodeProgramState.PAUSED; } } else if (opcode == 4) { Output = value1; _iteratorPos += 2; } else if (opcode == 5) { if (value1 != 0) { _iteratorPos = value2; } else { _iteratorPos += 3; } } else if (opcode == 6) { if (value1 == 0) { _iteratorPos = value2; } else { _iteratorPos += 3; } } else if (opcode == 7) { _data[_data[_iteratorPos + 3]] = value1 < value2 ? 1 : 0; _iteratorPos += 4; } else if (opcode == 8) { _data[_data[_iteratorPos + 3]] = value1 == value2 ? 1 : 0; _iteratorPos += 4; } } if (_data[_iteratorPos] == 99) { _state = IntCodeProgramState.FINISHED; } return(this.Output); }