40分求调
查看原帖
40分求调
931366
quanquhengzhezou楼主2024/7/20 09:45
#include <iostream>
#include <vector>
#include <stack>
#include <unordered_map>
#include <string>

void executeBrainfuck(const std::string& code, const std::string& input) {
    const int MEMORY_SIZE = 30000;
    std::vector<unsigned char> memory(MEMORY_SIZE, 0);
    int pointer = 0;
    std::string output;
    std::unordered_map<int, int> loopStartToEnd;
    std::unordered_map<int, int> loopEndToStart;

    // Build the loop maps
    std::stack<int> bracketStack;
    for (int i = 0; i < code.size(); ++i) {
        if (code[i] == '[') {
            bracketStack.push(i);
        } else if (code[i] == ']') {
            int start = bracketStack.top();
            bracketStack.pop();
            loopStartToEnd[start] = i;
            loopEndToStart[i] = start;
        }
    }

    int inputIndex = 0;
    for (int i = 0; i < code.size(); ++i) {
        char command = code[i];

        switch (command) {
            case '>':
                pointer = (pointer + 1) % MEMORY_SIZE;
                break;
            case '<':
                pointer = (pointer - 1 + MEMORY_SIZE) % MEMORY_SIZE;
                break;
            case '+':
                memory[pointer] = (memory[pointer] + 1) % 256;
                break;
            case '-':
                memory[pointer] = (memory[pointer] - 1 + 256) % 256;
                break;
            case '.':
                output += static_cast<char>(memory[pointer]);
                break;
            case ',':
                if (inputIndex < input.size()) {
                    memory[pointer] = static_cast<unsigned char>(input[inputIndex]);
                    ++inputIndex;
                } else {
                    memory[pointer] = 0; // No input available
                }
                break;
            case '[':
                if (memory[pointer] == 0) {
                    i = loopStartToEnd[i];
                }
                break;
            case ']':
                if (memory[pointer] != 0) {
                    i = loopEndToStart[i];
                }
                break;
        }
    }

    std::cout << output;
}

int main() {
    std::string code;
    std::string inputBuffer;

    std::string line;
    while (std::getline(std::cin, line) && line != "$") {
        code += line + '\n'; // Include line breaks in the code
    }
    
    if (std::getline(std::cin, line) && !line.empty()) {
        size_t spacePos = line.find(' ');
        if (spacePos != std::string::npos) {
            inputBuffer = line.substr(spacePos + 1);
        }
    }

    executeBrainfuck(code, inputBuffer);

    return 0;
}
2024/7/20 09:45
加载中...