CJam(58 56 54 48 46 x 2)* 48%= 44.16
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
哪个打印
{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~
每行中的非空格字符在两个互为quines之间保持相同。
但是现在最甜蜜的部分是:
{`"_~"+{_,94\m2/S*a_+\*{`"_~"+{_,94\m2/S*a_+\*
N/23f/Wf%N*}_`'"#)!*}_~N/23f/Wf%N*}_`'"#)!*}_~
是一个藜!:)
在这里测试。
怎么运行的
我建议您先阅读我的其他文章中的解释,因为它通常解释了CJam中的奎因的基本知识。
这个有点棘手。与其他情况一样,对于互为quine,我通过在每行之前或之后添加空格,并将0替换为2,来修改块的字符串表示形式,以便最终程序将空格放在另一端。
请注意,空格根本不会影响相互的奎因。在第一个中,它们位于一个未使用的块中,在第二个中,它们位于整个代码中。
为了在组合两者时获得规则的拉皮,我们需要找到一种避免进行所有修改的方法。注意,空格和代码的结构意味着通过将两者结合在一起,我们可以将一个quine的全部插入另一个。因此,如果将整个修改代码放在一个块中,则可以根据其实际内容运行该块。
所以现在我有了这个代码块……对于相互的奎因,它只包含我实际要运行的代码。对于组合的奎因,它还以随机位置再次包含整个奎因,这没有任何意义……但是由于它是一个块,因此不会自动运行。因此,我们可以基于该块的内容来确定是否修改字符串。那_`'"#)!
是为了什么 它复制该块,将其转换为字符串,搜索字符"
(在互为quine中,仅出现在块外部)- -1
如果找不到字符,则搜索返回,否则返回正整数-,增加结果并在逻辑上将其否定。因此,如果"
找到a ,0
它将产生1
。现在我们要做*
,如果结果为1,则一次执行该块,否则完全不执行。
最后,这是修改代码的工作方式:
_,94\m2/S*a_+\*N/23f/Wf%N*
_, "Duplicate the quine string and get its length.";
94\m "Subtract from 94.";
2/ "Divide by two.";
S* "Create a string with that many spaces. This will be
an empty string for the first mutual quine, and contain
23 spaces for the second mutual quine.";
a_+ "Create an array that contains this string twice.";
\* "Join the two copies together with the quine string.";
N/ "Split into lines.";
23f/ "Split each line into halves (23 bytes each).";
Wf% "Reverse the two halves of each line.";
N* "Join with a newline.";
领取赏金(12 x 10)* 48%= 57.6
事实证明,通过一些修改,该代码可以很容易地拆分为更多行。我们添加2个字符,以连续获得48个字符,然后可以方便地将其除以8,这样我们就有8行包含6个字符的代码和6个空格。为此,我们还需要更改一些数字,并重新排列一个或两个运算符,以使它们不会在两条线上都分开。这样就给我们提供了一个12 x 8大小的工作版本...比要求少一个。因此,我们只添加了两行不做任何事情(按1,按1,按1,按1 ...,所以变成12 x 10:
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
作为前一个,这产生了
{`"_~"
+{129X
$,m2/S
*a_+\*
N/6f/1
;1;1;1
;1;1;1
;Wf%N*
}_`'"#
)!*}_~
(附带说明:无需在中间行上保持左右交替,只有第一行和最后一行的位置很重要。对于其他所有行,可以任意选择左右。)
而且,通过纯粹的巧合,完整的藜也仍然有效:
{`"_~"{`"_~"
+{129X+{129X
$,m2/S$,m2/S
*a_+\**a_+\*
N/6f/1N/6f/1
;1;1;1;1;1;1
;1;1;1;1;1;1
;Wf%N*;Wf%N*
}_`'"#}_`'"#
)!*}_~)!*}_~
(我说的是巧合,因为负责执行内部代码的部分现在被奇怪地散布在另一个quine中,但仍然可以正常工作。)
话虽如此,我本可以在1;
原始提交的内容中添加44行来满足赏金要求,但12 x 10
看起来却更加整洁。;)
编辑:哈哈,当我说“纯粹的巧合”时,我再也没有出现过。我研究了最后的奎因现在是如何工作的,这绝对是荒谬的。有三个嵌套块(实际上是4个,但是最里面的块是不相关的)。这3个块中最里面的唯一重要部分是它包含一个"
(而不是它在原始提交中所做的一个,而是'"
结尾处用于检查该相同字符的那个)。因此,该藜麦的基本结构为:
{`"_~"{`"_~"+{___'"___}_`'"#)!*}_~)!*}_~
我们来剖析一下:
{`"_~" }_~ "The standard CJam quine.";
{`"_~"+ }_~ "Another CJam quine. Provided it doesn't do
anything in the rest of that block, this
will leave this inner block as a string on
the stack.";
) "Slice the last character off the string.";
! "Negate... this yields 0.";
* "Repeat the string zero times.";
因此,确实确实做了一些有趣的魔术,但是由于内部块在堆栈上留下了一个字符串,因此)!*
碰巧将其变成了一个空字符串。唯一的条件是,内部块+
中的内容对堆栈没有任何其他作用,因此让我们看一下:
{___'"___} "Push a block which happens to contain
quotes.";
_`'"#)!* "This is from the original code and just
removes the block if it does contain
quotes.";