開啟章節選單

11956 Brainfuck

題目連結

題目翻譯

模擬一個 Brainfuck 語言的子集直譯器。有一個 100 bytes 的環狀記憶體(初始全 0)和一個指標(初始指向第 0 個)。

支援的指令:

指令說明
>指標右移(超過第 99 格回到第 0 格)
<指標左移(低於第 0 格回到第 99 格)
+當前 byte 加 1(255 + 1 = 0)
-當前 byte 減 1(0 - 1 = 255)

執行完後,輸出所有 100 個 byte 的十六進位值。

輸入

第一行 T(測資數),接下來每行一個指令字串(長度 < 100000)。

輸出

每組輸出 Case T: XX XX XX ...,共 100 個大寫十六進位值,空格隔開。

解題思路

初始化大小 100 的 unsigned char 陣列(自動溢位循環)和指標 idx = 0

逐字元處理指令:

  • > / <:指標用 (idx+1)%100 / (idx+99)%100 更新,避免負數
  • + / -:直接對 v[idx](v[idx]+1)%256 / (v[idx]+255)%256

最後輸出時,每個 byte 用 (i>>4)(i&0x0f) 分別輸出高低 4 bits,搭配 uppercase << hex

程式碼

//author: Piau
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define fi first
#define se second
#define INF LONG_LONG_MAX/1000
#define WA() cin.tie(0)->sync_with_stdio(0)
#define all(x) (x).begin(), (x).end()
#define int long long
#define PII pair<int, int>

signed main() { WA();
    int t = 1, T;
    for (cin >> T; t <= T; t++) {
        cout << "Case " << dec << t << ":";
        string s; cin >> s;
        vector<unsigned char> v(100); int idx = 0;
        for (auto &c : s) {
            if (c == '>') idx = (idx+1)%100;
            else if (c == '<') idx = (idx+99)%100;
            else if (c == '+') v[idx] = (v[idx]+1)%256;
            else if (c == '-') v[idx] = (v[idx]+255)%256;
        }
        for (auto &i : v) cout << ' ' << uppercase << hex << (i>>4) << (i&0x0f);
        cout << '\n';
    }
}