n级衔尾蛇奎因


11

这种128语言的Quino Ouroboros(一个以另一种语言输出程序的程序,以另一种语言输出程序的程序(后来以125种语言输出),该程序输出原始程序)是非常令人印象深刻的。但不幸的是,它具有静态的迭代次数。

编写一个程序,其输出的程序(用另一种语言不是必需的,但它可以是),它输出一个程序,它输出一个程序等,其中n次迭代之后,输出原始程序首次(即,没有中间程序应该与原始程序相同,因为否则将忽略其输入的quine将起作用),其中n是作为输入提供的非负整数。输入不能仅仅是原始源代码中的数字(例如,放在x = <the value of n>程序的开头),它应该是以下之一:

  1. 作为命令行参数传递
  2. 从标准输入读取
  3. 作为参数传递给函数,该函数返回/输出新程序。

对于衔尾蛇的中间阶段,您的程序可以是功能齐全的程序,也可以是不带参数的函数,调用该函数时,它将返回/输出下一个。

您可能不会读取源文件本身,也可能不会使用任何类似于quine的内置函数(我不认为会有任何方法可以这样做,但是可能会有)

为了清楚起见,如果为n = 0,则程序应输出其自己的源代码。

如果为n = 1,则程序应输出另一个程序,该程序将输出原始源代码。

等等...

最小字节获胜!

编辑:

我应该写过“对于衔尾蛇的中间阶段,您的程序可以是没有输入的功能齐全的程序也可以是没有参数的功能”。如果您的程序输出链中的下一个,等待输入,这很好,但是您的程序不需要原始值n。



我们可以1索引n吗?因此n = 1打印装置的源代码,n = 2个的装置打印代码,用于将打印源代码等
过期数据

1
迭代版本是否还会有初始输入?假设我的第一个输入为3,然后运行输出的程序。还会有输入3还是根本没有输入?如果没有输入,我想我们应该处理这种情况,以防使用类似的东西getInput()而没有提供任何输入。还是我们可以说输入一些不为以后的迭代使用的随机数,以防止错误getInput()?Aka当前的Python答案有效吗?
凯文·克鲁伊森

我怀疑我们被要求做的是,给定一个整数n,输出一个程序,该程序是“微风” n迭代的“初始程序” ,并且我们的答案不应计为n迭代之一。它是否正确?
暴民埃里克(Erik the Outgolfer)

@KevinCruijssen我可能应该对此更加清楚。中间阶段不能有任何形式的输入。我猜如果程序输出下一个然后等待输入,那就好了。
Leo Tenenbaum

Answers:


5

05AB1E,28个字节

-4字节+修复,感谢Kevin Cruijssen

"34çìD«s<©di®ì"34çìD«s<©di®ì

在线尝试!


说明

这是通过将要打印的剩余数字附加到代码的前面来实现的,这意味着它以与输入相同的方式添加到堆栈中。在输入“ 0”的基本情况下,它不会在前面连接0。


d是非负数(>=0)而不是正数(>0)。问题是要检查d而不弹出它,您需要首先将其复制,但是随后还需要在迭代时将其丢弃0"quinsting"时将,否则它将输出重复的0。:(
Kevin Cruijssen,

"34çìD«s<©di®ì"34çìD«s<©di®ì可能需要28个字节(仍然非常接近您的预期方法)?(恐怕您当前的版本会迭代0"34çìD«s<Ddiì"34çìD«s<Ddiì-1该输出D。)
Kevin Cruijssen

4

符文附魔,39字节

"3X4+kSql1=c*?S:1-}C'LA-}!i:0)2*?~!'´@

在线尝试!

将是短的4个字节利用相同的策略,如果输入小于或等于在除05AB1E 10。但是,由于我们需要支持任意大的值,因此它变得更加复杂。

的数值n放在最前面,并使用解析为连续数字文字´"3X4+kSq是基本的quine代码。如果前面没有值,则堆栈长度将仅为1(五线组),否则为2,这l1=d*?决定了如何从此处处理内容。

  • 如果有值, S:1-}'LA2+-}运行:将值交换到顶部,减去1,将其复制,在副本的底部保留一个副本,得到该值的Log 10乘以100(得出该值自己的字符长度,再加上1对´),从所述字符串的末尾去除,许多字符(有效截断自行关闭结束时,两者其中不需要它,因为它具有错误的值)。C比其短1个字节,2+并得到相同的值。

  • 如果没有值,请从输入中读取一个。

无论如何::0)2*?复制并与零进行比较。

  • 如果非零推´

  • 如果为零,则弹出值。我们可以欺骗使用!而不是2?并保存一个字节,因为当´尝试执行第一个字节时,它看到的是非数字的,并立即在同一位置退出数字模式。

从上到下打印整个堆栈。


3

Java 10,145个字节

n->{Long N=n;var s="n->{Long N=%s;var s=%c%s%2$c;return s.format(s,N>0?N-1+%2$cL%2$c:%2$cn%2$c,34,s);}";return s.format(s,N>0?N-1+"L":"n",34,s);}

在线尝试查看一些迭代的输出

说明:

说明:

  • var s包含未格式化的源代码
  • %s 用于将String本身放入 s.format(...)
  • %c%1$c34用于格式化双引号
  • s.format(s,34,s) 放在一起

挑战部分:

第一个lambda函数将long输入作为参数。

  • Long N=n;在第一次迭代中将其设置为变量。或Long N=%s;用于下一次迭代。
  • 三元检查N>0?N-1+"L":"n"%s用value 填充此值N-1L因为它很长,所以将其转换为String %s,如果N大于1 ,则将其转换为String 。如果N为0,则代替(初始输入为0或这是Interquine的最后一次迭代-'循环”),则将其%s替换为首字母n

规范说中间输出必须是完整程序或无参数的函数
Ignorance的实施方式

@EmbodimentofIgnorance我知道,这就是我所拥有的。第一个lambda函数采用一个long函数参数,其他lambda函数采用一个未使用的Void参数,我也经常用它来挑战,因为v->它比短1个字节,因此不接受任何输入()->
凯文·克鲁伊森

2

Haskell中195个 164字节

main=putStr(x++show x++"\na=")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr
x="main=putStr(x++show x++\"\\na=\")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr\nx="
a=0

在线尝试!

这使用了非常简单的quine技术。我们使用a设置为数字的变量对其进行修改。如果该数字为零(在开始时为零),我们将输入并输出a设置为输入数字的源。如果a不为零,a则将源设置为少一。这样a,在输出原始源之前,递减计数到零。



2

R,92字节

f=function(n=-1){gsub("\\s","",paste("f=",sub("-?\\d+",n-1,paste(deparse(f),collapse=""))))}

在线尝试!

如果deparse被视为作弊,则可以选择以下方法:

R,108个字节

function(n=-1){s="function(n=%d){s=%s%s%2$s;sprintf(s,n-1,intToUtf8(34),s)}";sprintf(s,n-1,intToUtf8(34),s)}

在线尝试!


1

Perl 6,44个字节

<say '<',S{\d+}=get||0-1,'>~~.EVAL'>~~.EVAL

在线尝试!

通过标准输入获取输入,并返回唯一更改为第一个数字的程序。然后,每个后续程序将输出相同的程序,但递减的编号除外。



1

Python 3.8(预发布)60 56 55 53字节

lambda n=-1,s='lambda n=%d,s=%r:s%%(~-n,s)':s%(~-n,s)

在线尝试!

-2个字节,感谢Jo King

从53字节版本开始,还可以在Python 2和Python 3中使用。


中间函数似乎不是完整的程序,也不是不带参数的函数。
肯尼迪

毫无疑问,该海象运算符:=是Python的一个受欢迎的补充。
mbomb007 '19

“对于衔尾蛇的中间阶段,您的程序可以是功能齐全的程序,也可以是不带参数的函数,调用该函数时,它将返回/输出下一个。”
mbomb007 '19

@NickKennedy已更新为符合规范,并且偶然保存了4个字节。
7

1
53个字节不使用:=
Jo King
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.