標籤:

Befunge詳解

Befunge詳解

來自專欄編程語言專欄

你無法相信這是一個隨機數生成器代碼

v>>>>>v 12345 ^?^ > ? ?^ v?v 6789 >>>> v^ .<

感覺超級懵逼?

沒錯啦!

沒學過的人當然會懵逼

之前看不懂的代碼是天書,這次怎麼變天圖了?

來來來,莫驚慌


指針?

由於這是個二維代碼,就需要代碼指針瘋狂的走圖(利用一個指針將代碼掃過一遍運行)。在這裡,我們假設有一個沙雕指針po走圖,這時,指針符派上了用場

> 讓po往右走

< 讓po往左走

^ 讓po往上走

v 讓po往下走

? 讓po隨機走

_ 在棧中彈出a,若a=0則往右,否則往左

| 同上,但a=0時往下走,否則往上走

當然,整個代碼從左上角開始,且po一開始都是往右走的


運算?

當然,加減這些東西是不能少的

假設現在從棧(又是它!)中依次彈出a,b,那麼將下面的結果壓入棧:

+ a+b

- b-a

* a*b

/ b/a(四捨五入到個位數)

% b%a(不懂取模的出門左轉OK?)


比較?

那個,比較是不可少的

! 彈出a,若它不是0壓入1,否則壓入0

` 依次彈出a,b,若b>a壓入1,否則壓入0


丟入?

不把東西丟進棧里你還能計算?

"" 中間是字元串,進入了"就按方向依次收集字元並將ASCII壓入棧,到另一個"為止 0-9 識別

數字,只識別一個就將值壓入棧


棧頂?

為棧頂元素奮鬥

: 將棧頂元素複製一份又丟到棧頂

交換棧頂的兩個元素

$ 彈出棧頂元素後直接不管它


修改?

如何修改代碼(驚)?

這裡假設代碼長這樣

0,0 0,1 0,2

1,0 1,1 1,2

2,0 2,1 2,2

之後

p 依次彈出y,x,v後將代碼x,y改為字元v

g 依次彈出y,x後壓入代碼x,y的字元


IO?

輸入輸出是必須的

. 輸出棧頂元素的值並彈出

, 輸出棧頂元素所對應的ASCII字元並彈出

& 輸入一個整數並壓入棧

~ 輸入一個字元並將ASCII值壓入棧


其他?

#和 (<<這是個空格) 按現在的方向走,不回頭~

@ 結束程序吧!程序猿:什麼?


例子?

先看看HW

>25*"!dlrow ,olleH":v v:,_@ > ^

首先,將2,5壓入棧後相乘得到

之後呢,將!dlrow ,olleH裝入棧,這時你的棧就有了一個反著的HW

複製H後進入_,此時棧如下

H --- H --- e --- l --- l --- o --- , --- (空格) --- w --- o --- r --- l --- d --- ! ---

之後只要頂上那個傢伙不是0,就彈出一個值(_的比較)

之後再彈出一個值並輸出ASCII字元

於是這一個字元就被輸出和清空了

然後,再將下一個字元複製一遍,重複循環,就可以輸出

Hello, world!


感覺很好玩

自己去試一試理解隨機數生成器吧!

推薦閱讀:

九連環的數學分析
教案推薦:中班數學《有趣的數字》
關於公文數學的問題?
Axure變數函數就那麼簡單
三角與數列的結合

TAG:數學 |