在这个挑战,你会写一个解释2 Ω(转录为TwoMega),基于松散的语言brainfuck具有无限维存储空间。
语言
2 Ω包含三个部分的状态:
的磁带,它是比特的无穷列表,全部初始化为0。它有一个最左边的元素,但没有最右元素。
的存储器指针,这是一个非负整数,它是在带的元素的索引。较高的内存指针指向更右侧的磁带单元。内存指针0指向最左边的元素。内存指针初始化为0。
该超立方体,这是一个概念性∞维“盒子”细胞,其中的每一个包含一个位初始化为0。超立方体的宽度被绑定在每一个维度为仅2细胞,但尺寸的无穷大装置的数量细胞是不可数的。
指向超立方体的索引是一个无限的位列表,它引用了超立方体中的一个单元(以与使用有限的位列表来引用一个有限维的超立方体相同的方式)。因为磁带是无限的位列表,所以整个磁带始终引用Hypercube的元素;此元素称为引用对象。
2 Ω给出意到7个不同的字符:
<
将内存指针减1。将其减少到0以下是未定义的行为,因此您无需处理它。>
将内存指针加1。!
翻转参考对象的位。.
在参考对象处输出该位。^
用引用对象的位的倒数替换磁带上的内存指针指向的单元处的位。[x]
x
只要引用对象的位为1,就运行代码。
挑战
您的任务是编写一个程序,该程序将字符串作为输入,并以2Ω程序的形式执行该输入。
这是 代码高尔夫球,因此最短的有效答案(以字节为单位)将获胜。
笔记
- 您可以假定该程序将仅包含字符
<>!.^[]
,并且[]
将被正确嵌套。 - 您的解释器应仅受系统上可用内存的限制。它应该能够在合理的时间内运行示例程序。
样例程序
打印1:
!.
打印010:
.!.!.
永远打印0:
![!.!]
永远打印0,如果有,!
则永远打印1 :
[.]![!.!]
cat
程序的邀请:似乎没有输入指令。
.
-打印单个零然后存在;!^!.
-打印一个然后退出。虽然更多会很好。目前,您必须了解提交内容以进行验证(并对其进行投票!)
[0,0,0,0,0,0,0...]
(即!
,在程序开始时存在a )。
[.]![!.!]
永久打印该单元格的值
1
磁带上的s 数量始终是有限的。实际上,自然数和磁带状态之间有一个非常简单的双射(将磁带内容解释为向后的二进制数),这表明Hypercube本质上是一个无限一维数组,可以通过翻转整数指针值中的位来访问,而不是像脑筋急转弯那样减少/减少。