示例#1
0
        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);
        }
示例#2
0
        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);
        }