Befunge详解
tiger2005
2018-09-07 21:17:43
一个恶心而有艺术感的语言
---
你无法相信这是一个随机数生成器代码
```
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压入栈后相乘得到'\n'
之后呢,将!dlrow ,olleH装入栈,这时你的栈就有了一个反着的HW
复制H后进入_,此时栈如下
```
H
---
H
---
e
---
l
---
l
---
o
---
,
---
(空格)
---
w
---
o
---
r
---
l
---
d
---
!
---
\n
```
之后只要顶上那个家伙不是0,就弹出一个值(_的比较)
之后再弹出一个值并输出ASCII字符
于是这一个字符就被输出和清空了
然后,再将下一个字符复制一遍,重复循环,就可以输出
```
Hello, world!
```
---
感觉很好玩
自己去试一试理解随机数生成器吧!