開啟章節選單
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'; } }