生长缓慢的奎因


30

做个Quine。

看起来容易吧?那么,这个quine必须输出自己加上第一个字符,然后输出自己加上第二个字​​符,依此类推。

这样,木盒可以几代输出两个副本。

示例:让您的代码为x。运行它应该输出x + x[:1]。运行生成的程序应输出x + x[:2],依此类推...

如果您的代码是foobar,运行此应输出foobarf。运行这个应该输出foobarfo。依此类推,依此类推:

foobar
foobarf
foobarfo
foobarfoo
foobarfoob
foobarfooba
foobarfoobar
foobarfoobarf

您的程序必须长于2个字节,并且每次迭代只能输出自己代码的一个额外字符。


3
考虑到默认情况下禁止阅读源代码,我怀疑在大多数语言中都无法实现这一挑战。
与Orjan约翰森

12
@ØrjanJohansen,然后是Dennis出现
Rod

2
@Rod好吧,我并没有全部出来,只是很多/大多数语言都没有明显的方法将任意代码片段添加到末尾,使得(1)不会产生语法错误(2)程序可以检测到更改。
与Orjan约翰森

3
由于这是一个非常不寻常的奎因,是否仍然不允许使用常见的奎因漏洞?
Draconis'5

Answers:


15

岩组110 108 100字节

a=`<&0`<<''<<<t;b=${a:0:50};printf $b$b${a:0:-50}
a=`<&0`<<''<<<t;b=${a:0:50};printf $b$b${a:0:-50}

在线尝试!

因此有可能。

说明

a=`<&0`<<''<<<t;       # Set A to everything following this line, until eof or
                       #   an empty line (which never happens before eof) encountered.
                       # A "t" is appended to prevent automatic trimming of newlines.
b=${a:0:50};           # Set B to the first line.
printf $b$b${a:0:-50}  # Print two copies of B and
                       #   A with 50 trailing characters removed.


11

R,289字节

s<-c("s<-", "i=get0('i',ifnotfound=0)+1;p=paste0(s,substr(get0('p',ifnotfound=s),1,i),collapse='');cat(s[1]);dput(s);cat(paste0(s[2],substr(p,1,i)))#")
i=get0('i',ifnotfound=0)+1;p=paste0(s,substr(get0('p',ifnotfound=s),1,i),collapse='');cat(s[1]);dput(s);cat(paste0(s[2],substr(p,1,i)))#

归功于这个灵感。仅当在先前的quine 运行于相同的 R环境中运行时才有效。


即将推出一个解释...我尚未对其进行288次测试,但我相当确信它是正确的
朱塞佩(Giuseppe)

由于quine在其中添加了换行符,因此证明应该是289个字节,但是无论如何它都很棒,您已经解决了!
IQuick 143

嗯,是的,愚蠢地cat添加了换行符。
朱塞佩

但这是一个完整的程序吗?生成的代码是否完整程序?
jimmy23013

@ jimmy23013据我所知,这个答案和生成的代码是完整的程序。在R中没有main或没有其他任何强制性结构。此外,问题没有明确要求完整的程序,因此可以使用函数或类似函数。
Steadybox'5

5

爱丽丝,29个字节

4P.a+80pa2*&wdt,kd&w74*,.ok@

在线尝试!

不可打印字符为0x18。

说明

通常的"基于Fungeoid quines的问题在于,如果我们重复整个源代码,那么我们还会得到更多信息",并且字符串不再覆盖整个源代码。我认为这就是为什么现有答案使用cheat-y g方法的原因。

这个答案确实使用了"基于-的方法,但是我们没有"在源代码中包含-,而是在运行时将其写入程序中。这样,"无论重复程序的频率如何,都将只有一个(因为我们仅将其写入一个特定的坐标,而与程序的大小无关)。

然后,一般的想法是,我们在堆栈上创建整个源代码的表示,但是仅循环通过字符的前29个字符(即程序长度),而循环的长度由代码的大小确定。因此,我们实际上可以在其后附加任意字符(换行符除外),@并且结果始终是核心程序的循环重复,比源代码长一个字符。

4P   Push 4! = 24. This is the code point of the unprintable, which we're 
     using as a placeholder for the quote.
.a+  Duplicate it and add 10, to get 34 = '"'.
80p  Write '"' to cell (8,0), i.e. where the first unprintable is.
    Placeholder, becomes " by the time we get here, and pushes the code
     points of the entire program to the stack. However, since we're already
     a good bit into the program, the order will be messed up: the bottom
     of the stack starts at the 24 (the unprintable) followed by all 
     characters after it (including those from extraneous repetitions). Then 
     on top we have the characters that come in front of the `"`. 
     So if the initial program has structure AB, then any valid program has
     the form ABC (where C is a cyclic repetition of the initial program),
     and the stack ends up holding BCA. We don't care about C, except to
     determine how big the program is. So the first thing we need to do is
     bring B to the top, so that we've got the initial program on top of
     the stack:
a2*  Push 10*2 = 20.
&w   Run the following section 21 times, which is the length of B.

  dt,  Pull up the value at the bottom of the stack.

k    End of loop.
d&w  Run the following section D+1 times, where D is the length of ABC.

  74*  Push 28, one less than the number of characters in AB.
  ,    Pull up the 29th stack element, which is the next character to print.
  .o   Print a copy of that character.

k    End of loop.
@    Terminate the program.

很好的解决方案。我喜欢这个解释。
iQuick 143 '18

4

Perl 5,83个字节(包括最后的换行符)

$_=q($/=$;;$_="\$_=q($_);eval
__END__
".<DATA>;print$_,/(.).{82}\z/s);eval
__END__

在线尝试!

好的ol' __DATA__令牌可以轻松地将任意字符串附加到任何Perl程序中,然后主程序可以通过<DATA>文件句柄访问该字符串(并且实际上使用__END__,这样做是为了实现向后兼容性,而不是__DATA__节省两个额外的字节) 。

请注意,这个程序没有读取自己的源代码,但仅将额外的输入数据附加到其源__END__令牌。实际上,__END__令牌及其后的所有功能都类似于由输入结尾终止的字符串文字。

另外请注意,为了完全符合规范,该程序必须以换行符结尾。如果不是这样,换行符实际上会在第二个之后自动添加__END__,但是第一个迭代输出将不再等于该代码加上它的第一个字节。


2

Befunge-98,30个字节

0>:#;0g:840#;+*#1-#,_$a3*%0g,@

在线尝试!

我的尝试是使用Befunge-98,它使用了以空格终止的quine,也可以计算输出了多少个字符。但是不使用g命令。


您可能想在第一行中提到它是不竞争/作弊的,只是为了阻止它可能会收到的任何反对票。
quintopia'5

2

PHP,146字节

ob_start(function($s){return($u=substr($s,0,73)).$u.substr($s,0,-72);})?>ob_start(function($s){return($u=substr($s,0,73)).$u.substr($s,0,-72);})?>

它应该-r在命令行中运行。


当我在线尝试时似乎不起作用,这只是一个普通的藜。
与Orjan约翰森

@ØrjanJohansen您应该使用来运行它php -r 'command'
jimmy23013

Gah,无法使其正常工作。TIO似乎只是忽略-r参数。
与Orjan约翰森


啊哈 那时候我一定误会了。现在,我也设法使其与PHP一起用作语言设置
与Orjan约翰森

2

符文附魔,61字节

803X4+kw.'.q}͍}͍}͍}͍}͍}͍}͍}͍}͍::l͍5X-:}-$:l͍{-1--@

在线尝试!

使用与Alice答案类似的方法:将string "命令反射性地写入代码中,以便只有一个。剩下的工作是很多字符串和堆栈操作,以恢复原始程序,需要多少额外的字节并打印必要的块。

序列将内存中的字符串表示形式旋转,以使该字符串803X4+kw出现在开头而不是结尾,这是由于的位置所致,"并且没有一种更简便的方法来处理此操作,而无需计算大量的尴尬数字。

虽然原始程序只有61 个字节,但是它的字符串长度只有50个,这很容易构造,5X并且只是巧合的是,在包含所有必需的功能之后不需要将其填充(例如,长度为49的程序会更容易的编码方式是50使用填充的一个字节49,而不是字面量,而51编码为5X3+或53,则必须考虑自己的额外字节)。

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.