Befunge详解

tiger2005

2018-09-07 21:17:43

Personal

一个恶心而有艺术感的语言 --- 你无法相信这是一个随机数生成器代码 ``` 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! ``` --- 感觉很好玩 自己去试一试理解随机数生成器吧!