BrainFuck

發布時間: June 28, 2024, 7:58 a.m.   最後更新時間: June 28, 2024, 10:24 a.m.   時間限制: 1000ms   記憶體限制: 128M

Brainfuck,簡稱BF,是一種極小化的程式語言,由Urban Müller在1993年創造。而因為Fuck是髒話,所以這種語言有時稱為Brainf*ck或Brainf***,或者是我個人偏好的Brainfxxk。

Müller的目標是建立一種簡單的、可以用最小的編譯器來實現的、符合圖靈完全思想的程式語言。這個語言由八種運算子構成,為Amiga機器編寫的編譯器(第二版)只有240個位元組大小。

Brainfuck 的名字已經暗示出來,它的程式代碼很難讀懂。儘管如此,Brainfuck仍然可以像普通程式語言一樣一般完成任何計算。它雖然計算方式不能說與眾不同,只能說鶴立雞群,但確實能夠正確執行。

這種語言基於一個簡單的機器模型。這個機器除了指令以外,還包括:一個以位元組為單位、已初始化為零的陣列、一個指向該陣列的指標(開始時指向陣列的第一個位元組)、以及用於輸入輸出的兩個位元組流。

下面是這八種狀態的描述,其中每個狀態由一個字元標識:

> 指標加一(右移一格)

< 指標減一(左移一格)

+ 指標所指位元組的值加一

- 指標所指位元組的值減一

. 輸出指標所指位元組內容(ASCII碼)

, 向指標所指的位元組輸入內容(ASCII碼)

[ 若指標所指位元組的值為零,則向後跳轉,跳轉到其對應的]的下一個指令處

] 若指標所指位元組的值不為零,則向前跳轉,跳轉到其對應的[的下一個指令處

用白話文來說,Brainfuck的世界就是一條長長的一維陣列和一個箭頭。這個箭頭初始在第一格,且陣列的值初始皆為0。

Brainfuck指令可以逐一替換,翻譯成C語言(假設ptr是char *類型)的語句之類:

> 將箭頭右移一格;

將箭頭左移一格;

+ 將箭頭指的這格數字加一;

- 將箭頭指的這格數字減一;

. 輸出這格的數字在ASCII碼中對應哪個字;

先這樣就好。給個例子吧:如何印出"Hello World!"呢?

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

很簡單,非常易懂,便於閱讀,是個值得所有人學習的好語言。

一串合法的Brainfuck程式。保證沒有',' '[' ']'和換行。
所需陣列大小保證在1000格以內。

解讀輸入並輸出結果。

複製範例
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++++++++++++++++++++++..++.++>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-+++++++++++++-.++++++++++++++++++++++++.------.<++-----------.
ZxxzQics

Brainfuck好玩吧! OuO

這裡提供Brainfuck編譯器供你使用。

模擬

竹中軟研39th應用組期末競賽(A~Z瘋狂賽)