コード例 #1
0
        private void ExecuteBrainfuck(int[] instructions)
        {
            unchecked
            {
                int    programCounter = 0;
                int    dataPointer    = 0;
                byte[] cells          = new byte[N_CELLS];

                while (programCounter < instructions.Length)
                {
                    int twoProgramCounterPlusOne = programCounter + 1;

                    switch (instructions[programCounter])
                    {
                    case INSTRUCTION_INCREMENT_DATA_POINTER:
                        dataPointer += instructions[twoProgramCounterPlusOne];
                        break;

                    case INSTRUCTION_DECREMENT_DATA_POINTER:
                        dataPointer -= instructions[twoProgramCounterPlusOne];
                        break;

                    case INSTRUCTION_INCREMENT_DATA:
                        cells[dataPointer] += (byte)instructions[twoProgramCounterPlusOne];
                        break;

                    case INSTRUCTION_DECREMENT_DATA:
                        cells[dataPointer] -= (byte)instructions[twoProgramCounterPlusOne];
                        break;

                    case INSTRUCTION_OUTPUT_BYTE:
                        OutputBuffer.WriteByte(cells[dataPointer]);
                        break;

                    case INSTRUCTION_INPUT_BYTE:
                        cells[dataPointer] = (byte)Console.Read();
                        break;

                    case INSTRUCTION_JUMP_FORWARD:
                        if (cells[dataPointer] == 0)
                        {
                            programCounter = instructions[twoProgramCounterPlusOne];
                        }
                        break;

                    case INSTRUCTION_JUMP_BACKWARD:
                        if (cells[dataPointer] != 0)
                        {
                            programCounter = instructions[twoProgramCounterPlusOne];
                        }
                        break;
                    }

                    programCounter += 2;
                }
            }
        }
コード例 #2
0
        private static void ExecuteBrainfuck(string brainfuck)
        {
            byte[] cells          = new byte[N_CELLS];
            int    programCounter = 0;
            int    cellPointer    = 0;

            unchecked
            {
                int programLength = brainfuck.Length;

                while (programCounter < programLength)
                {
                    switch (brainfuck[programCounter])
                    {
                    case '>':
                        cellPointer++;
                        break;

                    case '<':
                        cellPointer--;
                        break;

                    case '+':
                        cells[cellPointer]++;
                        break;

                    case '-':
                        cells[cellPointer]--;
                        break;

                    case '.':
                        OutputBuffer.WriteByte(cells[cellPointer]);
                        break;

                    case ',':
                        cells[cellPointer] = (byte)Console.Read();
                        break;

                    case '[':

                        if (cells[cellPointer] == 0)
                        {
                            int bracketPosition = programCounter;
                            int nBrackets       = 1;
                            while (nBrackets > 0)
                            {
                                bracketPosition++;

                                if (brainfuck[bracketPosition] == '[')
                                {
                                    nBrackets++;
                                }
                                if (brainfuck[bracketPosition] == ']')
                                {
                                    nBrackets--;
                                }
                            }
                            programCounter = bracketPosition;
                        }
                        break;

                    case ']':
                        if (cells[cellPointer] != 0)
                        {
                            int bracketPosition = programCounter;
                            int nBrackets       = 1;
                            while (nBrackets > 0)
                            {
                                bracketPosition--;

                                if (brainfuck[bracketPosition] == ']')
                                {
                                    nBrackets++;
                                }
                                if (brainfuck[bracketPosition] == '[')
                                {
                                    nBrackets--;
                                }
                            }
                            programCounter = bracketPosition;
                        }
                        break;
                    }

                    programCounter++;
                }
            }
        }