写一个时间机器奎因


21

编写一个程序,将一个字符串和一个整数作为输入n,并输出:

  1. n之前传递给程序的字符串;
  2. 一个新程序,将用于下一次调用。

您不能在程序外部存储任何数据,并且程序不能调用链中的先前程序。如果该字符串不存在,则输出一个空字符串(但仍输出下一个程序)。

运行示例,在该示例中,我program_n对每个后续程序都使用了这种表示法(当然,[This text is the nth program]它将被实际的代码替换。)

$ program_1 "One" 1
[This text is the second program]
$ program_2 "Two" 1
One
[This text is the third program]
$ program_3 "Three" 2
One
[This text is the fourth program]
$ program_4 "Four" 2
Two
[This text is the fifth program]
$ program_5 "Five" 1
Four
[This text is the sixth program]

新程序的代码是否应该以字符串形式输出?还是应该将其保存到文件中并输出文件名?
Mego 2015年

@Mego将其输出为字符串(即输出到STDOUT)。您无需实施将新程序复制到文件的操作。
2015年

“什么都不输出”是指输出下一个程序,而不输出(不存在)字符串吗?
Mego 2015年

@Mega是的,这就是我的意思。
2015年

您也可以将program_n+1s 添加到输出行,就像[program_3, One]您希望看到的那样。如果两个输出都进入标准输出,应该如何将它们分开?还可以使用功能代替完整程序吗?
randomra 2015年

Answers:


4

果酱,25岁

L{\_l~(>1<lN+a@+`@"_~"}_~

在线尝试

说明:

L      push an empty array (this is the array of previous strings)
{…}    push this block
_      duplicate the block
~      execute the 2nd copy (the stack contains the array and the block)

块:

\      swap the array with the block
_      duplicate the array
l      read a line from the input (containing the integer n)
~(     evaluate n and decrement it
>      slice the array starting at that position
1<     slice the resulting array to keep only the first string (if any)
l      read the 2nd line from the input (containing the string)
N+     append a newline
a      wrap in an array
@      bring the previous array to the top
+      concatenate the arrays, thus prepending the new string
`      convert the array to its string representation
@      bring the block to the top
"_~"   push this string

最后,将自动打印所请求的字符串(如果有),数组的表示形式,块和字符串“ _〜”。


2

Python,221字节

import sys
o,p=[''],r'import sys;a,o,p=int(sys.argv[2]),[{2},{0}],{1};print o[a] if len(o)>a else "","\n",p.format(`sys.argv[1]`,`p`,",".join(`s`for s in o))'
print '\n',p.format(`sys.argv[1]`,`p`,','.join(`s`for s in o))

为了轻松进行测试,请使用./thisgolf.py "yourfirststring" | python -c "import sys;exec(sys.stdin.read().split('\n')[1])" "your second string" <N>,并根据需要重复最后一位。


2

Python 2,207字节

def r(O,R):import sys,marshal as m;a=sys.argv;b=int(a[2]);O.extend(["",""]*b);O[b]=a[1];print"%s\nfrom marshal import*;c=%r;i=lambda:0;i.__code__=loads(c);i(%r,i)"%(O[0],m.dumps(R.__code__),O[1:])
r([""],r)

建立在我的另一个quine但可以更改程序的基础上,此任务比较简单,因此我可以进一步打高尔夫球。如果我能够将输入输入到stdin,则它应该短得多。


0

的Javascript ES6,130个 128 121 120 113字节

a=[];b=_=>{a.push(prompt());console.log((a[a.length-prompt()-1]||"")+`
a=`+JSON.stringify(a)+";b="+b+";b()")};b()

降至87:a = []; b = _ =>(a.push(prompt()),[a [a.length-prompt()-1] ||“”,`a = ‌ [$ { a}]; b = $ {b}; b()`]); b()
Mama Fun Roll

哦。这样吧 它是66个字节:a = [],b =(x,y)=>(a.push(x),`$ {a [a.length-y-1] ||“”} \ na = [$ { a}]; b = $ {b}`)_____ \n替换为实际的换行符。
Mama Fun

然后尝试a = [],b =(x,y)=>(a.push(x),`$ {a [a.length-y-1] ||“”} \ na = $ {JSON.stringify (a)}; b = $ {b}`),这留给您80个字节(当然,在替换\ n之后)。(如果您的代码仍然有问题,可能是REPL片段,那么我还有其他建议:P)。
Mama Fun

最近的一些修订中的一些具有不兼容的输出格式。回滚到上一个兼容版本。
SuperJedi224
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.