增量Quine


23

``您的任务是编写一个程序或函数,每次运行时输出其源代码的第一个字符,然后输出第二个字符,然后输出第三个字符。

例如,如果您的程序使用file foo中的语言,那么您应该获得类似于以下内容的输出:barbaz.bar

λ bar baz.bar
f
λ bar baz.bar
o
λ bar baz.bar
o

程序以这种方式打印源代码后,便可以执行任何操作。您可以修改文件的源代码,但是请记住,要打印的源代码是原始源代码。

这是一个代码高尔夫球,因此以字节为单位的最短程序获胜。


1
如果我们可以修改文件的源代码,是否意味着我们也可以阅读它?
FlipTack

1
@ Flp.Tkc好问题。老实说,我不知道。我不希望您通过阅读源代码来构造quine,但是如果您仅阅读源代码来修改文件,就可以了。
科纳·奥布莱恩

Answers:


6

果冻,12字节

“;⁾vṾ®ȯ©Ḣ”vṾ

这是一个尼拉迪亚链接。在线尝试!(包括用于十二次调用链接的代码。)

怎么运行的

“;⁾vṾ®ȯ©Ḣ”vṾ  Niladic link.

“;⁾vṾ®ȯ©Ḣ”    Set the left argument and the return value to s =: ';⁾vṾ®ȯ©Ḣ'.
           Ṿ  Uneval; yield r =: '“;⁾vṾ®ȯ©Ḣ”', a string representation of s.
          v   Eval; execute s as a Jelly program with argument r.

 ⁾vV          Yield 'vṾ'.
;             Concatenate r and 'vṾ', yielding q =: '“;⁾vṾ®ȯ©Ḣ”vṾ'.
    ®ȯ        Take the flat logical OR of the register (initially 0) and q.
              This replaces 0 with q in the first run, but it will yield the
              content of the register in subsequent runs.
      ©       Copy the result to the register.
       Ḣ      Head; pop and yield the first character of the register.
              This modifies the string in the register, so it holds one fewer
              character after each call.

另外,由于寄存器在第十二次调用后将保留一个空字符串,因此它再次处于错误状态,并且链接已准备好从头开始。调用链接24次将输出两次源代码,调用三次三次,等等。


我不知道Jelly,所以页脚到底要做什么?为什么^ 17?
Conor O'Brien

调用上方的链接(¢),标识函数(¹,在第一次调用后并不需要),将返回值设置为换行符(,隐式打印先前的返回值),然后重复。¹并且都是上标,但它们是无关的。我已将它们替换为不太混乱¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢;¢(调用,连接,重复)。
丹尼斯

12

Javascript-26个字节

定义f()一个字符一个字符地返回源代码。

n=0;f=x=>("n=0;f="+f)[n++]

字符用完后返回undefined。

n=0;f=x=>("n=0;f="+f)[n++]
for(i=0;i<30;i++){console.log(f())} //test harness


如果我没记错的话,您必须将函数调用包含在代码中。
Mama Fun Roll

@MamaFunRoll链接到相关的元文章?
Downgoat '16

我什么都不知道:P但是,我一直认为函数调用本身是quine的一部分。也许有什么我想念的?
Mama Fun Roll

@MamaFunRoll该规范专门允许使用函数,因此不需要调用。无论如何,对于这种特殊的挑战来说并没有多大意义。
丹尼斯,

好吧,只是确定一下。
Mama Fun

2

堆积,非竞争,34字节

[tostr ':!' + execCounter # out]:!

标准quine的变体。这是一个完整程序。这用于execCounter获取该程序专门运行了多少次。输出所有内容后出现错误。

在这里尝试!


2

,31字节

{Y"{Y (yRsRPy++v)}"(yRsRPy++v)}

匿名函数。在TIO上测试!

说明

从这个标准的Pip quine开始:

Y"Y yRsRPy"yRsRPy
Y"Y yRsRPy"        Yank that string into y
           yRsRPy  In y, replace the space with repr(y)

将其括在花括号中以使其起作用。现在,我们无需返回整个源,而是需要对其进行索引。对索引使用全局变量并在每次递增时,将满足“每次调用时下一个字符”的要求。v是最佳候选者,因为它已预初始化为-1。第一次增加它的索引为0,下一次1等等。

Pip具有循环索引,因此一旦函数打印出最后一个字符,它将从头开始。


1

Python,90个字节

标准Python quine的扩展(欢迎打高尔夫球的技巧):

def f(n=0,s='def f(n=0,s=%r):\n while 1:yield(s%%s)[n];n+=1'):
 while 1:yield(s%s)[n];n+=1

这是一个python 生成器函数,意味着您对其进行迭代,并且每次迭代都会在源代码中提供下一个字符。返回所有字符后,将崩溃IndexError

为了进行测试,只需将此脚本附加到程序的末尾:

source = ''
try:
    # Call generator, add characters to the string
    for char in f():
        source += char
except IndexError:
    # Generator has reached end of source code
    pass

print(source)

在线尝试!


1

*> <>13 21字节

" r:2+a1Fi1+:1F1+[ro;

创建一个名称\n为跟踪索引的文件。

这也许可以打更多的球,但是没有什么立即跳出来……

输出量

$ starfish incrementalquine.sf 
"$ starfish incrementalquine.sf 
 $ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
2$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
a$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
i$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
:$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
F$ starfish incrementalquine.sf 
1$ starfish incrementalquine.sf 
+$ starfish incrementalquine.sf 
[$ starfish incrementalquine.sf 
r$ starfish incrementalquine.sf 
o$ starfish incrementalquine.sf 
;$ starfish incrementalquine.sf

说明

" r:2+                 build the quine
      a1F              open file named "\n"
         i1+:          read input, increment by 1, duplicate
             1F        save incremented input to file
               1+[     increment input, copy that many values to a new stack
                  ro   output the character at the beginning of the new stack
                    ;  end

作弊增量式队列

a1Fi1+:0go1F;

说明

a1F            open file named "\n"
   i1+         read input and add 1 to it
      :0g      push the value at (input,0) to the stack
         o     output the value
          1F   save the incremented input to the file
            ;  exit

哈哈,我不知道您可以将文件命名为“ \ n”。尽管这从技术上来说是通过g指令读取源代码。
科纳·奥布莱恩

@ ConorO'Brien,嗯,很公平。嗯...
redstarcoder

*> <>是否具有某种堆栈索引?还是命令重复?然后,您可以将标准quine框架"your code goes here;用于> <>,​​然后访问堆栈中的第n个成员
Conor O'Brien 2016年

@ ConorO'Brien是的Teal Pelican向我展示了我的另一种诱骗奎因答案中的这种奎因变体:)。
redstarcoder '16

1
@redstarcoder我一直在研究quines(YAY!),我发现了一个不错的技巧,如果将r替换为#,您可以:1- the like; #; or [+ 1F1:+ 1iF1a-1:“目前无法测试,但我相信它会从您的代码中减少1个字节。> <> quines可以像#o <-1:”那样完成:D
蓝绿色鹈鹕

1

Mathematica,91个字节

评论非常欢迎;我仍在学习有关什么是适当的奎因的提法。

(If[!NumberQ[q], q = 0]; StringTake[ToString[#0]<>FromCharacterCode[{91, 93}], {++q}]) & []

定义一个不带参数重复调用的函数。在第91次调用之后,它将引发一个大错误并返回未评估的值。

有两个需要解决的问题:首先,我只想使用StringTake[ToString[#0]<>"[]"],但是ToString[]似乎删除了引号。所以我不得不更换"[]"FromCharacterCode[{91, 93}]。第二,Mathematica变量开始时未初始化,因此++qq定义之前我无法调用;这就是为什么If[!NumberQ[q], q = 0]需要缩写的原因。

无关的尾声:在查找时NumberQ,我了解到Mathematica具有一个称为TrueQ... 的函数,是的,True如果参数为,True并且参数为,False则返回False!(该实用程序还返回False所有其他参数。)


1

Microscript II,40 33字节

代码块文字,该语言与函数最接近:

{ss1K+>K>s#<v{o}sl*v!(123v)lKp<o}

运行后,它会重新放置x以使其更易于再次调用。


0

Bash(和zsh,ksh),39字节

a=`<$0`;pwd>>0;echo ${a:`wc -l<0`-1:1}

一旦程序被打印出来,它什么也不打印。

确保0当前目录中不存在并运行:

bash iquine.bash

欢迎来到PPCG!您有一个聪明的想法来增加索引。不幸的是,该答案看起来像是通过阅读其自己的源代码而起作用的,这意味着按照我们的标准,这不是有效的标准。如果您修改它以使用奎因技术而不是阅读其本身的源代码,那么它将是一个很好的答案。
DLosc
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.