CoffeeScript实现BF解释器

本文介绍了Brainfuck(简称BF)编程语言的特点,并分享了一个简单的BF解释器实现过程。此外,文章提出了一道有趣的算法题,即如何设计一个算法,根据BF解释器对不同指令的时间消耗,找出输出特定字符串的最优BF源代码。
摘要由CSDN通过智能技术生成

今天一大早天气很好,翻了几页《Go语言·云动力》,1.5节讲到下面的脑操编程语言

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

额,这不是大名鼎鼎的BF么?终于明白上面的"脑操"不是印刷错误,只是这翻译真不给力,感觉用"脑残"会合适点。(PS: 用BF来讲述图灵机似乎不太合适,虽然BF里有存储/跳转/输出,但是缺少了外部输入,唯一的输入就是代码本身。)

虽然之前知道BF解释器很简单,但毕竟从没亲手写过。闲来O疼便打算写个,练习下CoffeeScript也熟悉下github。还好一个小时就测好了,不到30行。为了行数更少,合并了一些赋值语句,可能是个人水平问题,很难再短了。

关于BrainFuck的介绍可以查看这个网页,这里就不多说了,实在是,很坑爹。

 1 exports.run = (source) ->
 2   throw new Error 'invalid source' unless typeof(source) is 'string'
 3   throw new Error "invalid char '#{m[0]}'" if (m=/[^+-.<>[\]]/.exec source)?
 4   [i,buf,jmp] = [0,[],[]]
 5   for ch,p in source when ch is '[' or ch is ']'
 6     switch ch
 7       when '[' then buf[i++]=p
 8       when ']'
 9         if buf[i-1]?
10           jmp[buf[--i]]=p
11           jmp[p]=buf[i]
12           delete buf[i]
13         else
14           throw new Error "unexpect ']' at pos #{p}"
15   unless i is 0
16     throw new Error "expect ']' to match '[' at pos #{buf[i-1]}"
17   [p,len]=[-1,source.length]
18   while ++p<len
19     ch = source[p]
20     switch ch
21       when '+' then buf[i]=(buf[i] ? 0)+1
22       when '-' then buf[i]=(buf[i] ? 0)-1
23       when '>' then ++i
24       when '<' then --i
25       when '.' then process.stdout.write String.fromCharCode buf[i] ? 0x30
26       when '[' then p=jmp[p] if not buf[i]? or buf[i] is 0
27       when ']' then p=jmp[p] if buf[i]? and buf[i] isnt 0
28 
29 exports.run "++++++++++[>++++++++++<-]>++++.+."  # print "hi"

 

然后有个问题:假设已知某种BF解释器对7种指令的时间消耗分别为T1~T7,设计一个算法,计算该解释器输出给定字符串所需的最优源代码(时间消耗最低,代码最少)

转载于:https://www.cnblogs.com/neutra/archive/2012/07/08/2581179.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值