关于奎因


27

受超编程启发:N + N,N×N,N ^ N合而为一
感谢@MartinEnder和@trichoplax在沙箱中的帮助。

定义

超喹

将阶n的超quine 定义为类似于 quine的完整程序或函数P ,该程序或函数P满足适用于适当quines的所有规则,并且具有以下结构。

P是由相同字符的n个副本组成的字符组的串联。当执行P时输出是相同组的串联,再增加一个字符副本。

例子

  • 在源代码aabbcc生成输出的假设编程语言中aaabbbccc,此程序构成2阶的超喹。

  • 该定义并没有要求不同群体的特点是不同的。

    如果源代码aabbcc生成输出aaaabbbbcccc,则该程序是1阶的超喹啉; 源代码包含六个单字符组,六个字符对的输出。

  • GS2中,将打印空程序\n,然后\n打印程序\n\n。但是,\n也不\n\n是超级喹,因为它们不能满足适当喹的所有特性。源代码的任何部分都不会编码输出的不同部分。

超喹链

将长度为n超链链定义为满足以下约束的n个完整程序或n个函数(P 1,…,P n的有限序列。

  1. 的输出P 1,...,P N-1P 2,...,P Ñ,分别。

  2. P 1,…,P n是超喹。

  3. 的订单P 1,...,P Ñ形成严格递增的顺序相邻的整数。

最后,将无限个超喹链定义为完整程序或函数(P 1,P 2,...)的无限序列,以使每个初始间隔(P 1,…,P n构成长度为n的超喹链。

例子

  • 在一种假设的编程语言中,其中的源代码aabbcc生成输出aaabbbccc,然后生成输出aaaabbbbcccc,该对(aabbccaaabbbccc)构成长度为2的超喹链。

    请注意,aaaabbbbcccc–链中最后一个hyperquine的输出–不必产生特定的输出;它甚至不必是有效的源代码。

  • 继续前面的例子,如果aaaabbbbcccc生成输出aaaaabbbbbccccc,三重态(aabbccaaabbbcccaaaabbbbcccc)构成长度的hyperquine链3

    如果这种模式继续永远,序列(aabbccaaabbbcccaaaabbbbcccc,...)构成的无限hyperquine链。

  • 在对程序(abcaabbcc与输出)( ,aabbccaaaabbbbcccc一个hyperquine链,由于hyperquines的命令都是1,所以它们不形成一个严格递增顺序。

  • 在对程序(aabbccaaaabbbbcccc与输出)( ,aaaabbbbccccaaaaabbbbbccccc一个hyperquine链,由于hyperquines的顺序是14,所以它们不形成相邻的整数的序列。

规则

任务

用您选择的编程语言编写一条非平凡的超喹链,即一条至少包含2个超喹的链。

和往常一样,您的程序可能不会接受任何输入或以任何形式访问其自己的源代码。

如果您的解释器打印隐式换行符,则您的超喹啉必须解决这一问题。

所有标准漏洞,尤其是与奎因有关的漏洞均适用。

计分

最长的超喹链会获胜。如果并发两个或多个提交,则其中以最短的超喹啉(以字符度量)开头的提交将获胜。和往常一样,发帖时间是决胜局。


您必须对源代码,输出,字符计数和执行使用相同的字符编码。例如,Python程序print 42不是一个2字符UTF-32提交的,因为解释器将每个字节作为一个单独的字符。如果您选择的语言不是基于字符的语言,则将所有单个字节都视为字符。


3
好的,也许Helka的挑战并非并非不可能,但这肯定是:D
Beta Decay

1
@BetaDecay真的吗?:)
Martin Ender

Answers:


10

Befunge-98,无限顺序,54 52 38 36字节

第二种方法-无限顺序,36个字节

该程序实际上将在第34个超五线组处中断,因为的ASCII值"将破坏字符串解释(在59处;),但是我们将该值的存储偏移到了永远不会执行的位置(即,(0, 1)代替(0, 0))。

1+::0*x01pn'!1+:#jr;,kg10@k!:kg10;#"

在线尝试:12103442

说明

INSTRUCTIONS  STACK (PYTHON PSEUDOCODE)           EXPLANATION
1+            [n]                                 Push n many 1s onto the stack, then sum them up
::            [n]*(at least 3)                    Duplicate that sum at least twice
0*            [n]*(at least 2)+[0]                Push a whole lot of zeros, then multiply them all together
x             [n]*(at least 1)                    Pop a vector off the stack (n, 0) and set the IP delta to that; now the IP is only executing every nth character
01p           [n]*(at least 1)                    Place n in the program at coordinates (0, 1); this is just for storage
n             []                                  Clear the stack
'!1+          ['"']                               '!' is character 33; one less than 34, or '"'
:#jr          ['"']                               We duplicate the 34 (all we care is that it's a rather large number), then turn around and skip that many spaces
                                                  The IP, having jumped 34*n instructions to the left, is now way in the negatives
                                                  Execution resumes on the other side of the program (the following instructions have been reversed for readability
"             [the program of order 1]            The quote-at-the-end-of-the-program is a common trick for one-liner Befunge quines
#; ... ;                                          Jumps into a loop (when the IP hits one semicolon it skips to the next, restarting the loop)
01gk:         [(rest of string), char*(n+2)]      This duplicates the letter n+1 times*, leaving n+2 copies on the stack
!k@                                                If the number on the top of the stack is zero (i.e. we are printing), it will execute '@',
                                                  ending the program; otherwise, it will NOT execute '@' and will instead continue normally
                                                  Vague* 'k' instruction FTW
10gk,                                             If we aren't done yet, print the character n+1 times* (and restart the loop)

* 'k' is a very strange instruction. It pops a number off the stack; if the number is zero, it skips the command in front of it. If the number is greater than zero,
  it will execute the instruction that many times PLUS ONE. This is actually strangely advantageous in this program.

第一种方法-顺序34、52字节(使用自省,因此从技术上讲不合法)

由于上述原因,该程序将在第34阶中断(尽管我尚未测试)。

1+::0*x:00p'1\k:00gk,1#;:00g*0g00gk:$00gk,1+:'4-!k@;

在线尝试!


2
尽管输出看起来是正确的,并且确实令人印象深刻,但我不相信可以使用适当的 quine g,它可以直接读取程序的源代码。就是说,我几乎不是Befunge专家,所以我可能会误解某些东西。
丹尼斯,

我在g这里有两个目的:存储数据和读取源代码。尽管esolangs.org/wiki/Befunge#Quine也提供了一个示例g来读取源代码,但第二个示例可能有点粗略。同时,我将查看是否可以创建不使用任何自省功能的版本。
Hactar

我知道在Befunge中必须做到这一点,但我不知道如何做到。谢谢你给我看 +1
ETHproductions '16

10

> <>,无限顺序,178个字节

该程序包含尾随换行符。

^
.
*
&
:
&
+
*
2
b
*
*
6
9
$
0
)
*
4
8
:
~
.
*
&
:
&
+
*
2
b
*
*
2
b
$
0
)
i
:
-
1
o
a
&
:
&
o
~
.
*
&
:
&
+
*
7
7
*
*
4
6
$
0
)
0
:
-
1
$
o
:
$
&
:
&
&
,
*
8
b
-
1
l
}
*
3
d
'

在线试用: 12310(这最后一个需要一段时间来运行。)

视网膜脚本从线性程序生成源。

说明

主要思想是将木盒垂直放置,以使实际的控制流程不受重复的影响。例如,第二个超级quine开始如下:

^^

..

**

由于我们只浏览第一列,因此不必担心重复的字符。同样,当我们使用来将大多数代码作为字符串'推送时,这将为每个空行推送一个空格,这为我们提供了一种确定重复次数的方法。就是说,由于这些空行,存在一些限制:

  • 我们不能用"大数字作为quine主体部分中的字符代码,因为这会增加32我们不想要的其他s。
  • 我们不能使用?!因为它们仅跳过下一个字符(在这种情况下为空格)(因此他们实际上不会跳过下一个命令)。

因此,所有控制流程都是通过显式跳转(基本上是2D goto)完成的,我们需要根据重复次数来计算其实际偏移量。

因此,让我们看一下实际的代码。我们从头开始,^因此代码是自下而上执行的。为了便于阅读,让我们按执行顺序写出实际代码(并删除,^因为它不再被执行):

'd3*}l1-b8*,&&:&$:o$1-:0)0$64**77*+&:&*.~o&:&ao1-:i)0$b2**b2*+&:&*.~:84*)0$96**b2*+&:&*.

'是> <>(和Befunge,我想)的标准quinquin技术。它切换到字符串模式,这意味着将遇到的字符压入堆栈,直到'遇到下一个为止。空行用空格隐式填充,这就是为什么我们要得到它们之间的所有空格。程序末尾的空行将被忽略。因此,在IP回绕并'再次命中之后,我们将程序的第一列放在堆栈上,除了'本身。

让我们看看如何使用它来打印整个程序。

d3*}    Put a 36 (the ') at the bottom of the stack. Now the stack holds
        a representation of the entire first column.
l1-     Push the depth of the stack, minus (so minus to ').
b8*,    Divide by 88. The original program has 89 lines. If we divide the 
        depth of the stack (minus 1) by 88, we get the order of the current
        hyperquine (due to all the spaces we've pushed).
&       Store the order of the hyperquine in the register.
        Begin of main loop:
&:&       Push a copy of the register onto the stack. Call that N.
          Begin of line-printing loop:
$:o$        Print a copy of the top character on the stack.
1-          Decrement N.
:0)         Check whether it's still positive (gives 0 or 1).
0$          Put a 0 underneath. This will be the x-coordinate of a jump.
64**        Multiply the conditional by 24. This is the number of commands
            in this inner loop.
77*+        Add this to 49, the offset of the end of the loop.
            The result is line we want to jump to in the order-1 hyperquine.
&:&*        Multiply by the order of the quine (so that we jump further on
            higher quine orders).
.         Jump. If N isn't zero yet, this repeats the inner loop. Otherwise
          we continue right here.
~         Discard N (now 0).
o         Output one last copy of the top character on the stack.
&:&       Push a copy of the register onto the stack. Call that N.
          Begin of linefeed-printing loop:
ao          Print a linefeed.
1-          Decrement N.
:i)         Check whether it's still non-negative (gives 0 or 1).
            The next bit is essentially the same loop structure as above,
            but with loop length 22 and offset 22:
0$
b2**
b2*+
&:&*
.         Jump. If N isn't -1 yet, this repeats the inner loop. Otherwise
          we continue right here.
          Begin of space-clearing loop:
~           Discard the top of the stack. On the first iteration this is the
            -1 from the previous loop. Afterwards, it's one of the spaces
            representing an empty line.
:84*)       Check if the top of the stack is a space.
            And another loop conditional. This one works the other way round:
            the difference is 54, which is the distance between the beginning
            of this loop and the main loop. The offset is the beginning
            of this loop, at 22 as above.
0$
96**
b2*+
&:&*
.         Jump. If the top of the stack is still a space this repeats the 
          inner loop. Otherwise we continue from the top of the main loop.

当堆栈为空且第一个内部循环无法打印另一个字符时,程序终止。

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.