首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编写一个Boolfuck编译器或解释器

编写一个Boolfuck编译器或解释器
EN

Code Golf用户
提问于 2014-05-18 00:13:34
回答 1查看 1.3K关注 0票数 6

从现在起,

认为“操”这个词是不亵渎的,

是个好主意。

为Brainfuck变体做最小的编译器或解释器。它必须在Windows、DOS或Unix操作系统(所以Linux、Mac、OpenBSD等)中执行。Bool操与Brainfuck非常相似,可以找到一个完整的定义这里

与Brainfuck

的区别

  1. 使用的是位而不是字节(每个单元格是一个位)
  2. 输出字符是;而不是.
  3. 输入以小终端模式读取,并一次读取一位。
  4. 输出存储到流中,然后以小终端模式输出。

规则

  1. 使用单元格的位,而不是字节
  2. 支持来自官方定义的完整操作列表:+翻转指针下位的值。,从输入流中读取一点,并将其存储在指针下。但是,最终用户使用字符输入信息。字节是按小端点顺序读取的;例如,从字符a读取的第一个位是1,后面是0、0、0、0、1、1,最后是0。;输出指向输出流的指针下的位。比特的输出顺序与输入的顺序相同.如果在程序结束时,比特输出的总数不是8的倍数,则输出的最后一个字符将在更重要的端填充零。如果已输入文件结束字符,则将零输出到指针下的位.<这将指针向左移动一位。>这将指针向右移动一位。如果指针下的值为零,则向前跳,只需通过匹配。字符]跳回匹配的[字符]。任何不在官方定义中的字符都会被忽略。
  3. 程序必须从磁带的中间开始,而不是在结束时。
  4. 磁带的大小必须是无限的(两个方向都是无限的)。

下面是一个示例Bool操程序;它输出Hello, world!

代码语言:javascript
运行
复制
;;;+;+;;+;+;
+;+;+;+;;+;;+;
;;+;;+;+;;+;
;;+;;+;+;;+;
+;;;;+;+;;+;
;;+;;+;+;+;;
;;;;;+;+;;
+;;;+;+;;;+;
+;;;;+;+;;+;
;+;+;;+;;;+;
;;+;;+;+;;+;
;;+;+;;+;;+;
+;+;;;;+;+;;
;+;+;+;
EN

回答 1

Code Golf用户

发布于 2014-05-19 07:44:47

Python (531字节编译器)

这是一个源代码对源代码的编译器:它将Bool操编译成Python。将文件的输入作为其第一个参数,将Python代码输出到当前dict中的o文件中。

代码语言:javascript
运行
复制
exec"eJxdUs1u8yAQvOcpEBez/lNS9RDZpS+C+CQ3xg5RwlKMmkTV9+5l7bZue2RmZ4YdGAJe2HSfmL14DDFvndy2o0RvnOjC+KZ2Gupgul5A20vFh7/zM2CjCRHxvMI+2UQ5mZh0KJXmuu2LpD9J9WKdwNCLO4Bqdk210wMGdmfWsSn21n3G6dbKS+eFdbE8HLskytWtyLZZfk53u0G1J9mNZCcNwO3AS54OIzPnyXCuN8QfiB8bynY5Z7wQPP6T7/4/zRdcysMyHuuu74UHOzBbe/QCCGYxXeaCbyYxS8C3AJOjJ/OoiWlXxldyR9DTD6hYoOcVuh7t2bDFoSFOrRxPy7tCPrJfMKtmQK/AdjN3ijLL6hOmhqivKYbyqzcEmOtHNTRDsdeMKhkoM3RuNGJbUpcI5T4l0ka47D7XLPbVzKr0QpB4H5LlV9LhGChBvKqGXrB8ACDvV/JGSK89/6A8w2sG9TWkDyKyzae2B/gAiGHBlw".decode('base64').decode('zip')

如果您真的很介意使用zip之类的欺骗,那么实际代码是631字节长(比原始Brainfuck编译器长,但比原始错误编译器短):

代码语言:javascript
运行
复制
from sys import*;n=0;g=open(argv[1]).read();d=["from sys import*;from itertools import*;p=0;t=set();o=[]"];d+=["j=[bin(ord(y))[:1:-1]for y in stdin.read()];i=map(int,chain(*[x+'0'*len(x)-8for x in j]))"if","in g else""]
for c in g:d+=[n*" "+("t^={p}"if"+"==c else"t.add(p)if i.pop()else t.remove(p)"if","==c else"o+=[p in t]"if";"==c else"p-=1"if"<"==c else"p+=1"if">"==c else"while p in t:"if"["==c else"")];n+=4 if"["==c else -4 if"]"==c else 0
d+=["o=''.join(map(str,map(int,o)));o=[o[f:f+8] for f in range(0,len(o),8)];o+=[o.pop()+'0'*(8-len(o[-1]))];print''.join(chr(int(q[::-1],2))for q in o)"];open(*'ow').write('\n'.join(d))

这可能是我写过的最令人费解的巨蟒,尽管open(*'ow')而不是open('o','w')让我觉得自己很聪明;)

有(稍)好的布局:

代码语言:javascript
运行
复制
import sys

n = 0
g = open(sys.argv[1]).read()
d = ["from sys import*;from itertools import*;p=0;t=set();o=[]"]
d += [
    "j=[bin(ord(y))[:1:-1]for y in stdin.read()];i=map(int,chain(*["
    "x+'0'*len(x)-8for x in j]))" if "," in g else ""]
for c in g:
    d += [n * " " + (
        "t^={p}" if "+" == c
        else "t.add(p)if i.pop()else t.remove(p)" if "," == c
        else "o+=[p in t]" if ";" == c
        else "p-=1" if "<" == c
        else "p+=1" if ">" == c
        else "while p in t:" if "[" == c
        else "")]
    n += 1 if "[" == c else -1 if "]" else 0
d += [
    "o=''.join(map(str,map(int,o)));o=[o[f:f+8] for f in range(0,len(o),"
    "8)];o+=[o.pop()+'0'*(8-len(o[-1]))];print''.join(chr(int(q[::-1],"
    "2))for q in o)"]

open(*'ow').write('\n'.join(d))

最后,您给出的"Hello“测试的示例输出:

代码语言:javascript
运行
复制
from sys import*;from itertools import*;p=0;t=set();o=[]

o+=[p in t]
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]

t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]

o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]

o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]

t^={p}
o+=[p in t]
o+=[p in t]
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]

o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]

o+=[p in t]
o+=[p in t]
o+=[p in t]
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]

t^={p}
o+=[p in t]
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]

t^={p}
o+=[p in t]
o+=[p in t]
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]

o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]

o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]

o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]

t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]
o+=[p in t]
o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
o+=[p in t]

o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
t^={p}
o+=[p in t]
o=''.join(map(str,map(int,o)));o=[o[f:f+8] for f in range(0,len(o),8)];o+=[o.pop()+'0'*(8-len(o[-1]))];print''.join(chr(int(q[::-1],2))for q in o)

作为一个内存填充,+[>+]也运行得很好(而且速度快,10秒内消耗了大约2次):

代码语言:javascript
运行
复制
from sys import*;from itertools import*;p=0;t=set();o=[]

t^={p}
while p in t:
    p+=1
    t^={p}

o=''.join(map(str,map(int,o)));o=[o[f:f+8] for f in range(0,len(o),8)];o+=[o.pop()+'0'*(8-len(o[-1]))];print''.join(chr(int(q[::-1],2))for q in o)
票数 3
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/28172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档