解读TwoMega


9

在这个挑战,你会写一个解释2 Ω(转录为TwoMega),基于松散的语言brainfuck具有无限维存储空间。

语言

2 Ω包含三个部分的状态:

  • 磁带,它是比特的无穷列表,全部初始化为0。它有一个最左边的元素,但没有最右元素。

  • 存储器指针,这是一个非负整数,它是在带的元素的索引。较高的内存指针指向更右侧的磁带单元。内存指针0指向最左边的元素。内存指针初始化为0。

  • 超立方体,这是一个概念性维“盒子”细胞,其中的每一个包含一个位初始化为0。超立方体的宽度被绑定在每一个维度为仅2细胞,但尺寸的无穷大装置的数量细胞是不可数的

指向超立方体的索引是一个无限的位列表,它引用了超立方体中的一个单元(以与使用有限的位列表来引用一个有限维的超立方体相同的方式)。因为磁带是无限的位列表,所以整个磁带始终引用Hypercube的元素;此元素称为引用对象

2 Ω给出意到7个不同的字符:

  • < 将内存指针减1。将其减少到0以下是未定义的行为,因此您无需处理它。
  • > 将内存指针加1。
  • ! 翻转参考对象的位。
  • . 在参考对象处输出该位。
  • ^用引用对象的位的倒数替换磁带上的内存指针指向的单元处的位。
  • [x]x只要引用对象的位为1,就运行代码。

挑战

您的任务是编写一个程序,该程序将字符串作为输入,并以程序的形式执行该输入。

这是 ,因此最短的有效答案(以字节为单位)将获胜。

笔记

  • 您可以假定该程序将仅包含字符<>!.^[],并且[]将被正确嵌套。
  • 您的解释器应仅受系统上可用内存的限制。它应该能够在合理的时间内运行示例程序。

样例程序

打印1:

!.

打印010:

.!.!.

永远打印0:

![!.!]

永远打印0,如果有,!则永远打印1 :

[.]![!.!]

2
需要注意的一点是:存储单元的数量实际上并不是不可数的,因为1磁带上的s 数量始终是有限的。实际上,自然数和磁带状态之间有一个非常简单的双射(将磁带内容解释为向后的二进制数),这表明Hypercube本质上是一个无限一维数组,可以通过翻转整数指针值中的来访问,而不是像脑筋急转弯那样减少/减少。
Lynn

另外,请重新输入:您编写cat程序的邀请:似乎没有输入指令。
Lynn

2
我认为应该有使用更多指令集的示例程序。两个简单的程序: .-打印单个零然后存在;!^!.-打印一个然后退出。虽然更多会很好。目前,您必须了解提交内容以进行验证(并对其进行投票!)
乔纳森·艾伦

@Lynn输入将通过在单元格上具有1或0来给出[0,0,0,0,0,0,0...](即!,在程序开始时存在a )。
Esolanging Fruit '18

然后,您可以[.]![!.!]永久打印该单元格的值
Leo

Answers:


2

Python 2,167字节

t=h=I=0
m=1
E=''
for c in input():i='[<>!.^]'.find(c);E+=' '*I+'while+2**t&h: m/=2 m*=2 h^=2**t print+(2**t&h>0) t=t&~m|m*(2**t&h<1) #'.split()[i]+'\n';I-=~-i/5
exec E

在线尝试!

t是磁带。t = 6表示磁带为[0 1 1 0 0 0…]

m是内存指针的幂的2。所以m = 8表示我们指向磁带位3。

h是超立方体。h = 80(设置了位4和6)意味着设置了[0 0 1 0…]和[0 1 1 0…]的位。

要读取参考对象的位,我们检查2 t&h。为了翻转它,我们执行h ^ = 2 t

我们将指令翻译成Python代码并执行结果。存储while循环的缩进级别。


您的程序或第二个测试用例是错误的
wastl

@wastl第二个测试用例是错误的。;)
DLosc


2

JavaScript(Node.js),148字节

x=>eval(x.replace(e=/./g,c=>({'<':'u/=2','>':'u*=2','!':'e[v]^=1','.':'alert(+!!e[v])','^':'v=(v|u)^u*e[v]','[':'while(e[v]){'}[c]||'}')+';',v=u=1))

在线尝试!

即将完成

BoolFuck TwoMega
< >^>^>[!]^<<<<[!]^>>[!]!^>[!]!^>[!]!^<<<<(>^>^>1<<<<1>>0>0>0<<<<)
> ^<^<[!]^>>>>[!]^<<[!]!^<[!]!^<[!]!^>>>(^<^<1>>>>1<<0<0<0>>>)

需要init向右移动几个位置,并将地址的当前和右一位初始化为1(>>>>>>>>^>^<

在线尝试!

地点n在BoolFuck写成(0, 0, ..., 0(n*0), [1], 1, 0, 0, ...)

对于>,它确实n=>n+1

     0 0 0 0 0[1]1 0 0 0 0
^    0 0 0 0 0[x]1 0 0 0 0
<    0 0 0 0[0]x 1 0 0 0 0
^    0 0 0 0[y]x 1 0 0 0 0, yx != 01
<    0 0 0[0]y x 1 0 0 0 0
[!]^ 0 0 0[1]y x 1 0 0 0 0, (0yx10) = 0
>>>> 0 0 0 1 y x 1[0]0 0 0
[!]^ 0 0 0 1 y x 1[1]0 0 0, (1yx10) = 0
<<   0 0 0 1 y[x]1 1 0 0 0
[!]! 0 0 0 1 y[x]1 1 0 0 0, (1yx11) = 1
^    0 0 0 1 y[0]1 1 0 0 0
<    0 0 0 1[y]0 1 1 0 0 0
[!]! 0 0 0 1[y]0 1 1 0 0 0, (1y011) = 1
^    0 0 0 1[0]0 1 1 0 0 0
<    0 0 0[1]0 0 1 1 0 0 0
[!]! 0 0 0[1]0 0 1 1 0 0 0, (10011) = 1
^    0 0 0[0]0 0 1 1 0 0 0
>>>  0 0 0 0 0 0[1]1 0 0 0

<工作方式相同


您确定此翻译有效吗?在boolfuck中!>.打印1,但转换为!>^.TwoMega中的1打印(>不影响磁带;^由于引用对象为1,因此不影响磁带)
Esolanging Fruit

@EsolangingFruit +>;[1]00... 1[0]0...(输出0),!>^.(0,0,...)=1, ptr=([0],0,...) (0,0,...)=1, ptr=(0,[0],...) (0,0,...)=1, ptr=(0,[1],...)(输出0),怎么了?
l4m2 '18

@EsolangingFruit for !>.,仅>是boolfuck中的有效命令...
仅ASCII

1
@ l4m2在TwoMega中,!反转引用对象,而不是磁带单元。
硕果累累'18

@EsolangingFruit那么这里出了什么问题?
l4m2 '18

1

Brain-Flak Classic,816字节

<>(((<(())>)))<>{(([][][])(((({}){}[])({}))({})[]([][](({})(({}())(({}){}{}({}(<()>))<{<>({}<>)}{}>))))))(([]{()(<{}>)}{}){<((<{}>))<>(()(){[](<{}>)}{}<{({}[]<({}<>)<>>)}{}{}>)<>({()<({}<>)<>>}<<>{<>(({}){}<>({}<>)[])<>}{}<>({()<({}[]<<>({}<>)>)>}{})<>(({})<<>{({}[]<({}<>)<>>)}({}<>)<>{({}<>)<>}>)<>>)<>({}<>)<>>}{}([]{()(<{}>)}{}){{}<>({})(<>)}{}([]{()(<{}>)}{}){(<{}<>({}<{((<({}[])>))}{}{((<(())>))}{}>)<>>)}{}([]{()(<{}>)}{}){(<{}<>({}<({}())>)<>>)}{}([]{()(<{}>)}{}){(<{}<>[({})]<>>)}{}([]{()(<{}>)}{})<{((<{}>))<>{}({}<{<>(({}){}<>({}<>)[])<>}{}<>({()<({}[]<<>({}<>)>)>}{})<>(((){[](<{}>)}{})<<>{({}[]<({}<>)<>>)}{}(<>)<>{({}<>)<>}>)<>>)<>({}<>)<>}{}(<>)<>{({}<>)<>}{}>()){((({}[]<>){(<{}({}<>)>)}{}())<{({}<({}<>)<>((((((([][][]){}){}){}()){}){}({})())[][])>{[](<{}>)}{}{()(<{}>)}{})}{}({}<>)>[]){{}(<>)}}{}}

在线尝试!

编写这些代码只是为了让我有地方写一个图灵完备性证明。

图灵完备性证明

我们显示从Boolfuck减少到TwoMega:

Boolfuck   TwoMega
>          >>
<          <<
.          !^!.!^!
[          !^![!^!
]          !^!]!^!
+          !^[!]^[>!^<[!]!^>[!]!^<]

这种转换将Boolfuck状态存储在TwoMega中偶数编号的磁带单元中。所有已翻译的命令将保留以下不变式:

  • 内存指针位于偶数单元。
  • 所有奇数编号的磁带单元均为零。
  • 对于所有奇数单元格均为零的任何可能的磁带,超立方体上的相应值为零。

该代码段!^!将保持[0]0不变并在0[0]和之间交换[1]1(注意仅限于无需移动内存指针即可到达的超多维数据集上的行)。因此,它用于将当前的磁带值临时放入关心它的Boolfuck命令的参考对象中。

如果为TwoMega提供了,具有预期语义的输入命令,则Boolfuck命令,将转换为>^<,!^>[!]!^<。由于,不必证明Boolfuck是图灵完备的,因此缺少输入命令不会影响该证明。


它主要将信息存储在超多维数据集中的位置,而不是多维数据集本身?
l4m2 '18年

@ l4m2我从BoolFuck进行的还原没有在多维数据集本身中存储任何数据。我在超
多维数据

0

Python 3中297 284 274字节

-10字节感谢ovs和Jonathan Allan

C=input()
h={}
t=set()
def f(C,p):
 c=C[0];r=hash(frozenset(t));v=h.get(r,0)
 p={"<":p-1,">":p+1}.get(c,p)
 if'"'>c:h[r]=not v
 if"."==c:print(int(v))
 if"]"<c:t.discard(p)if v else t.add(p)
 if"["==c:
  while f(C[1:],p):1
 else:return c=="]"and v or C and f(C[1:],p)
f(C,0)

在线尝试!


t.discard(p)->t-={p}
shooqie '18

@shooqie除非t是这样,否则不起作用global
fergusq '18年

@fergusq虽然我很确定如果您声明ff(C,p,t=set())
shooqie '18年

0

75 71字节

lPB0aR:^"!><[].^_""!:_
--viPU0
++v
W_{
}
O_
i@v:!_LFBilPB0
l@FBi"^n;Vau

在线尝试!

转换代码转换为等效的Pip代码并进行评估。

我们i用来表示磁带,v磁带指针*和l超立方体。前两个被预先初始化为有用的值。l以开头[],我们将其推入0lPU0),以避免出现索引空列表问题。

*实际上,这是磁带指针的按位取反,因为我们将磁带向后存储,以便于转换为十进制。

其余代码为:

aR:...;     Do a bunch of replacements in a, translating it into Pip code
       Va   Evaluate a
         u  Suppress output of the final expression that was evaluated

转换表:

!  !:_
>  --viPU0
<  ++v
[  W_{
]  }
.  O_
^  i@v:!_LFBilPB0
_  l@FBi

l@FBil索引的hypercube元素(i从二进制转换)。它经常出现,因此我们将其命名_并最后_用实际代码替换。

  • !:_ 从逻辑上否定引用对象。

  • --viPU0递减v(将磁带指针向右移动);然后将另一个推0到的左侧i,以确保磁带指针停留在范围之内。

  • ++v增量v(每个OP不需要边界检查)。

  • W_{在引用对象为真(即非零,即1)时运行循环。

  • } 闭环。

  • O_ 输出引用对象,不带换行符。

最后,对于^

i@v:            Set the current tape cell to
    !_          The logical negation of the referent
                Now, make sure the list representing the hypercube is long enough:
      LFBi      Loop frombinary(i) times:
          lPB0  Push another 0 to the end of l
                This ensures that FBi will always be a valid index into l
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.