背景
Fractran是John Conway发明的深奥的图灵完备的编程语言。Fractran程序由分数的有序列表组成。该程序以一个整数作为输入开始。程序的每次迭代,都会在列表中搜索第一个分数,以便将该数字乘以该分数会生成另一个整数。然后从列表的开头开始,用新的编号重复此过程。当列表中没有可以与数字相乘的分数时,程序将终止并给出数字作为输出。
Fractran具有图灵完备性的原因是因为它模拟了套准机。数字的素数分解存储了寄存器的内容,而除法和乘法是有条件地从寄存器中进行加减的一种方法。我建议阅读Wikipedia文章(链接到上面)。
挑战
您的任务是编写尽可能最短的程序,该程序可以将来自STDIN的有效Fractran程序作为其唯一输入,并向模拟Fractran程序的STDOUT生成有效的BF程序。使用BF模拟Fractran程序的方式有两种。
注意:您的答案不是BF程序。您的答案是从任何给定的Fractran程序生成BF程序的代码。目的是使BF程序与Fractran程序等效。(从技术上讲,您可以参加高炉比赛,但这很难)
选项1
您的程序应输出执行以下操作的BF程序:
- 从STDIN中以相应的ASCII字符的形式获取正好1个数字(由于BF输入的工作方式),这是Fractran程序的输入。
- 以相应的ASCII字符的形式将精确的1数字打印到STDOUT,这是Fractran程序的输出。
此选项旨在表示Fractran虚拟机的确切输入和输出。
选项2
程序生成的BF代码应执行以下操作:
- 通过对已经编码在内存中的数字进行质因子分解来进行输入(在运行程序之前)。如果输入为28(2 * 2 * 7),则第二个单元格中的值为2,第七个单元格中的值为1(指针从单元格0开始)。所有其他单元将为零。
- 程序终止时,通过将输出的质数分解编码在内存中来给出输出。如果输出为10,则像元2和5中的每个像元都必须为1。所有其他素数像元必须为零。其他单元格的内容无关紧要。
此选项表示Fractran语言背后的计算模型。
规则与要求
- 输入(程序顶部)将是STDIN上的分数列表。每行将有一个小数,在分子和分母之间带有逗号。空行表示输入的结尾。分数将始终减少到最低的条件。
- 程序的输出应该是单行有效的BF程序,输出到STDOUT。该程序应该能够根据两个选项之一模拟该特定的Fractran程序。对于任何输入,生成的BF程序应能够产生与Fractran程序相同的输出。
- 您必须说明选择的选项。
- 您可以选择BF存储器和磁带上的边界以及它们是否在包装
- 代码高尔夫。同样,输出的BF程序的大小无关紧要,仅执行转换的程序的大小无关紧要。
- 程序只能由可打印的ASCII组成
如果我在任何地方都模棱两可,请不要犹豫。这是一个非常复杂的挑战,难以描述。
另外,请为以下输入发布程序生成的BF代码,以提供一种简便的方法来检查程序是否正常运行:
33,20
5,11
13,10
1,5
2,3
10,7
7,2
此程序在数字的二进制扩展中计算1的数量。但是,输入和输出的格式很奇怪(与所有Fractran程序一样)。输入的形式为2 ^ A,而输出的形式为13 ^ B。