为清楚起见添加了换行符:
(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^
我给自己一个限制,它必须从STDIN读取,而不是像通常的欠载回答那样从堆栈的顶部读取。我还使用了正确的十进制输入,它构成了大部分代码。
说明:
我将程序包装在quine-wrapper中:(a(:^)*
和):^
。这意味着在quine包装器中的所有代码将在堆栈底部具有程序的源代码。
为了将数字转换为普通的教堂数字,我使用了用代码替换每个数字并乘以10并添加该数字的技术:
0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*
这里有很多重复,因此让我们将其打包到一个子程序中,该子程序将从堆栈的顶部获取教会数字,并使用它来构造“数字字符串”:
:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*
我将其放入新环境中,以便可以快速访问它:
#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>
现在,我可以为创建替换代码R
。R
使用堆栈的顶部元素形成查找表,以用Betaload代码替换STDIN中的字符串。它是这样的:
()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R
但是,我们可以使用刚刚制作的子程序来生成代码段:
(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...
当R
运行时,它会转换输入一系列子程序是建立一个教堂数字的。当执行该子程序时,它将在堆栈的下一个元素(0,该元素放在较早位置)上创建该教堂数字。这意味着,在之后R^
,堆栈上的最高值将是教堂数字。然后,我们再^
有一次将教堂数字应用于堆栈中的最后一个元素(程序的源代码)以获得答案。
有趣的事实:我已经为这个提交的MD了几个月。在误解了一个问题(我似乎再也找不到了)之后,我保留了它。我必须从回收站中将其挖掘出来,然后才能在此处发布。