突变硬化的奎因


14

您的任务是制作一个打印出自己的源代码的程序。

“嘿,我们已经面临这个挑战,而且挑战无穷!您为什么要再挑战一个?” 您可能会问,但这将是最困难的一项(希望如此)。

您的quine必须经过“突变强化”,这意味着即使在其中的任何一个字符被复制的地方,quine也必须输出原始程序的源代码。

例如,如果您有一个quine(以下示例不是用任何语言编写的,那只是伪代码):

abcd

这些程序必须全部输出abcd

aabcd
abbcd
abccd
abcdd

(在每一个这些方案,abcd各自就地复制,这意味着复制的字符在原始字符后直接放置。)

规则:

  • 适用标准标准规则。
  • 多字节字符算作一个字符,并且重复时该字符不会“拆分”为相应的字节。

这是,因此以字节为单位的最短代码胜出!


这算吗?000在CJam两个输出0
geokavel

不,0这不是适当的选择。
丹尼斯,

2
我认为作为代码
保管

一般而言,代码突变问题可以解决吗?除非突变发生在带引号的字符串中的某个字符上,否则通常会破坏程序。
哈森

标题有点误导吗?“静音”建议更改角色,而不是重复角色
Luis Mendo

Answers:


18

> <>,56个字节

^
.
+
8
f
0
o
a
o
~
:
?
~
:
?
:
-
*
4
8
:
^
^
}
*
3
d
'

在线尝试!验证所有突变

原始程序的工作方式(已过时)

解释器从单元格(0,0)开始^将方向设置为向上,因此指令指针(IP)环绕到单元格 0,20

'激活字符串模式:直到'遇到下一个,IP下的所有字符都被压入堆栈。'环绕后再次发现相同的内容,因此我们推

d3*}^^:84*=?~oao0f.^

IP落在(0,19)处,仍在向上。执行d3*}13 = 0xd中,然后3,乘两个值(39 / 单引号),然后旋转堆叠到右侧。这使堆栈如下。

'd3*}^^:84*=?~oao0f.^

接下来的两个指令(^)此时不执行任何操作。

:84*=复制堆栈顶部,按84,将它们相乘(32 / 空格),然后测试复制的字符与空格是否相等。对于未更改的程序,它将始终推0

?如果栈顶为假,则跳过下一条指令。对于原始程序,它始终是,因此~总是被跳过。

oao弹出并打印堆栈顶部,按10 / 换行,然后弹出并打印linefeed

最后0f.跳转到单元格 0,15 (最底部的^),从堆栈上的下一个字符开始。

堆栈为空后,将打印整个源代码。:将失败,程序退出。

变异程序的工作方式(过时)

复制任何非换行符只会使程序水平扩展。由于程序是垂直执行的,因此这些额外的指令将永远不会执行。

所述bottomost之前复制任何换行符^将转移细胞(0,14)(0,15)(0,15)(0,16) 0f.现在将跳转到最底端的单元格^(也是)之前^,因此程序不受移位的影响。

最后,任何重复的换行符也会改变字符串。短行用空格填充,因此将在换行符的位置插入32 / 空格84*=将按1表示空格,因此?不要跳过下一条指令。在这种情况下,~弹出并放弃space,因此以下命令o将在空格上方打印字符。


您可以复制任何换行符,它将仍然有效。
丹尼斯

3
哦,我没有正确阅读帖子:P(丹米特·丹尼斯,你为什么这么好)
clismique


@ jimmy23013应该是固定的。
丹尼斯
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.