1993年時,Urban Müller發明了一種叫做「Brainfuck」的語言(以下稱為「Brainf*ck」)。
Brainf*ck極為靈巧,雖然僅僅具備8個指令,卻符合「圖靈完全」思想,換句話說,任何一種程式語言做的到的事,Brainf*ck也做的到。
在Brainf*ck的環境當中,有一個以位元組為單位、初始化為0的記憶體空間,且有一個指標指向某一個記憶體位置(初始化時指向第一個記憶體位置)。
此外,還有用來輸出入的資料流各一個(可以視為stdin、stdout)。Brainf*ck所有的指令如下表所示:
指令 | 說明 | 對應的C程式碼 |
> | 指標加一 | ptr++; |
< | 指標減一 | ptr--; |
+ | 指標所指向的記憶體空間的值加一 | (*ptr)++; |
- | 指標所指向的記憶體空間的值減一 | (*ptr)--; |
. | 把指標所指向的記憶體空間的內容輸出 | putchar(*ptr); |
, | 輸入一個byte(ASCII碼)存到指標所指向的記憶體空間 | *ptr = getchar(); |
[ | 如果指標指向的記憶體空間的值為零,向後跳轉到對應的]指令的次一指令處 | while (*ptr) { |
] | 如果指標指向的記憶體空間的值不為零,向前跳轉到對應的[指令的次一指令處 | } |
請寫一個Brainf*ck模擬器。
輸入的一開始是Brainf*ck程式碼,一直到單獨一行的「@」符號為止(請不要把「@」當成程式碼)。
程式碼可能分成很多行,並會夾雜註解、空白等等。請忽略所有非指令的字元。
接下來有一個正整數T,代表程式要被執行的次數。
接著從下一行開始,所有的資料都是Brainf*ck語言的輸入。
程式碼的長度、記憶體使用量皆不會超過30,000,且程式會在合理的指令個數後結束。
請輸出Brainf*ck程式模擬的結果。
※ 2010/07/23 範例測資更正,感謝 poloo5582。
※ 時限放寬,rejudged,感謝 shik。
原TIOJ1611 / Problem Setter: suhorng
Adapted from NTUJ 0014
No. | Testdata Range | Score |
---|---|---|
1 | 0 | 10 |
2 | 1 | 10 |
3 | 2 | 10 |
4 | 3 | 10 |
5 | 4 | 10 |
6 | 5 | 10 |
7 | 6 | 10 |
8 | 7 | 10 |
9 | 8 | 10 |
10 | 9 | 10 |