为2B写一个口译员


12

2B写一个口译员

我喜欢大卫·卡特David Catt)的深奥语言2B,将内存存储在磁带中,其中每个单元是一个单独的字节带(“子带”)。为此写一个翻译!

语言规范

官方规格可以在这里找到。在本说明书中,"表示范围内的数字0-90解释为10),_表示任意长度的字符串。每个像元都存储一个在range范围内的值0-255,上溢/下溢会像BF一样回绕。(感谢@MartinBüttner)。要将文本转换为数字0-255,请使用ASCII码。因为我找不到详细信息,所以我要说磁带长度应该255最小,但是如果您另外知道,请进行编辑。

+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| Instruction |                                                              Description                                                               |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| 0           | Zeroes the current cell and clears the overflow/underflow flag.                                                                        |
| {           | If the current cell is zero, jump to the matching }.                                                                                   |
| }           | A placeholder for the { instruction.                                                                                                   |
| (           | Read a byte from the input stream and place it in the current cell.                                                                    |
| )           | Write the value of the current cell to the console.                                                                                    |
| x           | Store the value of the current cell in a temporary register.                                                                           |
| o           | Write the value of the temporary register to the console.                                                                              |
| !           | If the last addition overflowed, add one to the current cell. If the last subtraction underflowed, subtract one from the current cell. |
| ?           | Performs a binary NOT on the current cell.                                                                                             |
| +"          | Adds an amount to the current cell.                                                                                                    |
| -"          | Subtracts an amount from the current cell.                                                                                             |
| ^"          | Moves the subtape up a number of times.                                                                                                |
| V"          | Moves the subtape down a number of times.                                                                                              |
| <"          | Moves the tape left a number of times.                                                                                                 |
| >"          | Moves the tape right a number of times.                                                                                                |
| :_:         | Defines a label of name _.                                                                                                             |
| *_*         | Jumps to a label of name _.                                                                                                            |
| ~_~         | Defines a function of name _.                                                                                                          |
| @_@         | Calls a function of name _.                                                                                                            |
| %           | Ends a function definition.                                                                                                            |
| #_#         | Is a comment.                                                                                                                          |
| [SPACE]     | Is an NOP.                                                                                                                             |
| [NEWLINE]   | Is treated as whitespace and removed.                                                                                                  |
| [TAB]       | Is treated as whitespace and removed.                                                                                                  |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+

测验

+0+0+0+0+0+0+0+2)+0+0+9)+7))+3)-0-0-0-0-0-0-0-9)+0+0+0+0+0+0+0+0+7)-8)+3)-6)-8)-7-0-0-0-0-0-0)

应该输出 Hello world!


+1:i:{()*i*}

某种cat程序,只是没有换行符。


+1:loop:{@ReadChar@*loop*}@PrintHello@@WriteAll@(~ReadChar~(x-0-3<2o^1>1+1>1%~PrintHello~+0+0+0+0+0+0+0+2)-1+0+0+0)+7))+3)+1-0-0-0-0-0-0-0-0)%~WriteAll~<1x:reverse:{<1v1>1-1*reverse*}o-1:print:{-1<1)^1>1*print*}%

首先应接受一个名称,然后按Return,应输出Hello name(此处是输入的名称)。

该计划的功劳归功于David Catt


我正在制定完整的测试程序。

规则

  • 禁止出现标准漏洞
  • 您的口译员必须符合所有规范,但注释除外,这不是必需的。

计分

  • 这是,因此最少的字节获胜!
  • -10字节(如果您的口译员处理注释)。

排行榜

这是一个堆栈片段,用于按语言生成常规排行榜和获胜者概述。

为了确保您的答案显示出来,请使用以下Markdown模板以标题开头。

# Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,可以将旧分数保留在标题中,方法是将它们打掉。例如:

# Ruby, <s>104</s> <s>101</s> 96 bytes


4
好想法!这里有一些想法:请定义每个子带的单元数,以及我们在实现中应该使用的子带数(或指定它是否应该是某种自适应/无穷大)。输入字符串应如何转换为数字0-255?也许是ASCII码?
flawr

Answers:


4

Python2,748个 736 731 709 704 691字节

这是一个有趣的小挑战,我敢肯定我可以使这段代码更短(也许稍后再做)。

from sys import*
w=stdout.write
p=open(argv[1],'r').read()
c,r,s,x,y,t,o=0,0,256,0,0,0,0
g=[[0]*s]*s
e=lambda d:p.find(d,c+1)
def h(i,j=0,k=0):global c,x,y;c+=1;n=1+(int(p[c])-1)%10;l=g[x][y]+n*i;g[x][y]=l%s;o=l/s;x=(x+n*j)%s;y=(y+n*k)%s
a="g[x][y]"
b="[p[c+1:i]]"
l={}
f={}
d={'0':a+"=0",'{':"if "+a+"<1:c=e('}')",'(':"i=stdin.read(1);"+a+"=ord(i)if i else 0",')':"w(chr("+a+"))",'x':"t="+a,'o':"w(chr(t))",'!':a+"+=o",'?':a+"=0if "+a+"else 1",'+':"h(1)",'-':"h(-1)",'^':"h(0,1)",'V':"h(0,-1)",'<':"h(0,0,-1)",'>':"h(0,0,1)",':':"i=e(':');l"+b+"=i;c=i",'*':"i=e('*');c=l"+b,'~':"i=e('~');f"+b+"=i;c=e('%')",'@':"i=e('@');r=i;c=f"+b,'%':"c=r"}
while c<len(p):
    if p[c]in d:exec d[p[c]]
    c+=1

此实现要求在调用之前声明(实现)标签和函数。它可以很好地与给出的两个测试一起使用,但是不幸的是,它不适用于该语言的作者编写的“ SayHi.2b”程序(即使更改了函数的声明顺序)。我认为这个问题可能与我了解磁带和磁带系统的方式有关。沿主磁带移动时,相应子带上的位置是否重置为0?此刻,即使在主磁带上移动,我仍保持在子带上的位置。

这是更具可读性的版本:

#!/usr/bin/python

import sys
w=sys.stdout.write
p=open(sys.argv[1],'r').read()
c,r,s,x,y,t,o=0,0,256,0,0,0,0
# c is the current index in the program string
# r is the return index (for functions)
# s is the size of the tape, subtapes and modulo for ints (max int will be 255)
# x and y are the coordinates in the grid
# t is the temporary register
# o is overflow
g=[[0]*s]*s # initialise a grid 256x256 with 0

e=lambda d:p.find(d,c+1)
def n():global c;c+=1;i=int(p[c]);return i if i>0 else 10 # get the number specified
def h(i):j=g[x][y]+i;g[x][y]=j%s;o=j/s # handle addition and substraction
def m(i,j):global x,y;x=(x+i)%s;y=(y+j)%s # move current cell

a="g[x][y]" # string of current cell
b="[p[c+1:i]]" # key for label or function
l={} # dictionary of labels
f={} # dictionary of functions
d={'0':a+"=0",
   '{':"if "+a+"<1:c=e('}')",
   '(':"i=sys.stdin.read(1);"+a+"=ord(i)if i else 0",
   ')':"w(chr("+a+"))",
   'x':"t="+a,
   'o':"w(chr(t))",
   '!':a+"+=o",
   '?':a+"=0if "+a+"else 1",
   '+':"h(n())",
   '-':"h(-n())",
   '^':"m(n(),0)",
   'V':"m(-n(),0)",
   '<':"m(0,-n())",
   '>':"m(0,n())",
   ':':"i=e(':');l"+b+"=i;c=i",
   '*':"i=e('*');c=l"+b,
   '~':"i=e('~');f"+b+"=i;c=e('%')",
   '@':"i=e('@');r=i;c=f"+b,
   '%':"c=r",
   '#':"c=e('#')"
   }

while c<len(p): # loop while c is not EOF
    # print c, p[c]
    if p[c]in d:exec d[p[c]] # execute code kept as a string
    c+=1 # increment index

编辑:考虑到注释处理(-10字节),修正了一个错误。此实现不支持嵌套函数调用(如果它是必需功能,则可以实现)

编辑2:更改处理程序函数以进行加,减和单元格移动。更多lambda!:D(“可读性更高的版本”现在可能不同步)

Edit3:我刚刚意识到处理注释花了我5个字节(考虑到-10)。所以我只是删除了它,可惜现在感觉不完整。

Edit4:将n的定义从lambda移到处理程序h()中的var中


有那么多+a+加入会更好a吗?它也摆脱了您必须将其分配给var的麻烦。
Maltysen,2015年

好吧,除了我不能将字符串整体作为一个字典来连接之外,对每个字符串单独这样做也不值得。将字符串分配给a只是获得一些字节的技巧,实际上对代码没有用。
basile-henry

我猜我不能抱怨函数的顺序,因为我实际上没有指定函数的顺序,而是尝试使SayHi.2b文件正常工作。如果更改后将胶卷重置为零会发生什么情况?
JimBobOH 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.