【提问】python 的 brainfuck 代码翻译解释器程序

baidu_34106947 2016-02-28 02:37:02
要求是352个字符以内,程序我是写出来了但是不符合要求长度,求大神帮忙

m=s;i=n=p=0;d="";a=[0]*30000
while len(m)-1-i:
s=m[i];o=1
if s=='>':p+=1
if s=='<':p-=1
if s=='+':a[p]+=1
if s=='-':a[p]-=1
if s=='.':print(chr(a[p]),end="")
if s==',':a[p]=ord(d[n]);n+=1
if s=='[' and a[p]==0:
while o:
i+=1;c=m[i];
if c=='[':o+=1
if c==']':o-=1
if s==']':
while o:
i-=1;c=m[i]
if c=='[':o-=1
if c==']':o+=1
i-=1
i+=1
...全文
553 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_34106947 2016-02-29
  • 打赏
  • 举报
回复
感谢回复,懂了许多,只是h=lambda s,t,a,n=1:n and h(s+t,t,a,n+[1,-1][r[s]==a]*(r[s]in'[]'))or s这一句看了蛮久看不明白,能不能提示一下
panghuhu250 2016-02-29
  • 打赏
  • 举报
回复

def h(s, t, a, n=1):
    """start from s, search for the nth a (the matching [ or ]) in the given direction.
    """
    if n:
        # n > 0, search further
        change = [1,-1][r[s]==a]*(r[s]in'[]')
        return h(s+t, t, a, n+change)
    else:
        # n = 0, found the position
        return s
其中change = [1,-1][r[s]==a]*(r[s]in'[]')对应于下面你的代码中的1或-1
c=m[i];
                if c=='[':o+=1
                if c==']':o-=1
用if/else来写,相当于:

if r[s] not in '[]':
   change = 0
else:
   if r[s] == a:
       change = 1
   else:
       change = -1
panghuhu250 2016-02-29
  • 打赏
  • 举报
回复
不算空格的话, 你的程序已经在352个字符以内了. 下面假设空也算在内. 把缩进的空格减少后, 大概还有360个字符. 缩减字符的常用手段: 1. 改变程序的次序, 减少关键字和变量之间的空格:
if s=='[' and a[p]==0:
变为:
if 0==a[p]and'['==c:
2. 再利用python把True当作1, False当作0, 0当作False,非零的数当作True, 精简合并if语句:
if s=='>': p+=1
可以写成
p+=s=='>'
等等. 3.

if cond:
  x = a
else:
  x = b
换成
x=[a, b][cond]
或者
x = cond and a or b
进一步的处理包括把"匹配括号"定义为函数, 合并p+=,p -=等. 下面的程序有I/O, 共341字符(空格, 换行符都算).

import os,sys
r=open(sys.argv[1]).read()
m=[0]*90000
p=i=0
h=lambda s,t,a,n=1:n and h(s+t,t,a,n+[1,-1][r[s]==a]*(r[s]in'[]'))or s
while i<len(r):
 x=m[p];c=r[i];p+=(c=='>')-(c=='<');m[p]+=(c=='+')-(c=='-')
 if'.'==c:os.write(1,chr(x))
 if','==c:m[p]=ord(os.read(0,1)[0])
 if x==0and'['==c:i=h(i+1,1,']')
 if x*(']'==c):i=h(i-1,-1,'[')
 i+=1
baidu_34106947 2016-02-28
  • 打赏
  • 举报
回复
解释brainfuck语言的网址: http://www.jianshu.com/p/9bc08cce4579
baidu_34106947 2016-02-28
  • 打赏
  • 举报
回复
指令 动作 > 右移一格 < 左移一格 + 指针指向的字节的值加一 - 指针指向的字节的值减一 . 输出指针指向的单元内容(ASCII码) , 输入内容到指针指向的单元(ASCII码) [ 向後跳转到对应的] ] 向前跳转到对应的[指令的次一指令处,如果指针指向的字节非零

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧