在这个挑战中,您将编写一个程序,该程序输出的程序是原始程序长度的两倍。输出的程序应以长度两倍的程序输出一个新程序。
例子
如果我的程序是a
:
< a
> aa
< aa
> aaaa
< aaaa
> aaaaaaaa
规则
- 没有内置奎因
- 原始程序必须至少一个字节
- 该序列理论上应该无限工作
- 您的程序不允许读取任何内容(文件,stdio)
您的分数是原始程序的大小。
在这个挑战中,您将编写一个程序,该程序输出的程序是原始程序长度的两倍。输出的程序应以长度两倍的程序输出一个新程序。
如果我的程序是a
:
< a
> aa
< aa
> aaaa
< aaaa
> aaaaaaaa
您的分数是原始程序的大小。
Answers:
{"_~"+_}_~
{"_~" e# Generalised quine framework, leaves the block and the string "_~"
e# on the stack.
+ e# Prepend the block to the string.
_ e# Duplicate the resulting array.
}_~
感谢@Doᴡɴɢᴏᴀᴛ的帮助!
原始的[37个字节]:
f=_=>'f='+'_'.repeat((10+f).length)+f
子[74个字节]:
f=______________________________________=>'f='+'_'.repeat((10+f).length)+f
孙子[148字节]:
f=________________________________________________________________________________________________________________=>'f='+'_'.repeat((10+f).length)+f
备用(通过打印到控制台,并作为完整程序):
原始的[61字节]:
f=_=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()
子级[122字节]:
f=______________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()
孙子[244字节]:
f=________________________________________________________________________________________________________________________________________________________________________________________=>console.log(`f=${'_'.repeat((0+f).length+5)+f};f()`);f()
怎么运行的!
1. f=_=>
将函数f定义为console.log(...)
2. ;f()
运行功能f。
3. (在功能f中)
console.log(...)
打印以下内容:
f=
文字“ f =“${'_'.repeat((0+f).length+5)
重复f长度的“ _”,以解决不包含在f字符串化中的字符的问题+f}
函数f的字符串化;f()
文字“; f()”笔记
console.log
是必要的,而不是alert
因为alert
它似乎不能很好地处理长字符串(至少在我的机器/浏览器配置中)_
'插入功能f的(未使用)参数的名称中,以确保将它们包含在f的字符串化中。console.log
与第一种解决方案相比,第二种解决方案的主要改进(除了摆脱):10
在函数中添加而不是将0
其强制转换为字符串会使它增加一个字节,从而省去了随后在长度上加1的麻烦,从而节省了一个字节。0+f
还应该将函数转换为字符串
(f=_=>`(f=${'_'.repeat((0+f).length+5)+f})()`)()
"66*2-rIDdr$O.
"66*2- $O. Standard quine formulation
r Reverse stack
I Push length of stack
D Pop n and duplicate top of stack n times
d Duplicate top of stack
r Reverse stack
r
s 之间的位的作用是将结束时间重复足够的次数,以满足倍增准则。.
是“停止程序”字符,因此最后的许多句点除了在那里都无济于事。
{: ".~"]}.~
{: ".~"]}.~
{ } Define and push a code block.
.~ Push a copy and execute it.
: Save the code block in the space character.
Every subsequent space will now execute the code block.
".~" Push that string.
] Wrap the entire stack in an array.
如果上述源代码执行一次,则堆栈将最终显示为
["" {: ".~"]} ".~"]
其中开头的空字符串对应于堆栈的初始状态(空输入)。
源代码的两个副本将保留最终状态
[["" {: ".~"]} ".~"] {: ".~"]} ".~"]
等等。
执行源代码后,解释器将执行以下操作:
它将整个堆栈包装在一个数组中,然后将该数组压入堆栈。
对于源代码的单个副本,堆栈现在包含
["" {: ".~"]} ".~"] [["" {: ".~"]} ".~"]]
执行该命令puts
的目的是打印包裹的堆栈,然后换行。
puts
被定义为{print n print}
,因此执行以下操作。
print
打印堆栈的包装副本而不检查它(即,不将其转换为字符串表示形式)。这发送
{: ".~"]}.~
到STDOUT并从堆栈顶部弹出堆栈副本。
堆栈现在包含
["" {: ".~"]} ".~"]
执行我们之前定义的代码块。
:
首先保存["" {: ".~"]} ".~"]
空格字符,然后压入".~"
自身并将]
堆栈包装成数组。
n
推送由单个换行符组成的字符串。
堆栈现在包含
[["" {: ".~"]} ".~"] ".~"] "\n"
再次执行。但是,当我们第一次调用它时已重新定义它,现在它包含一个数组,而不是代码块。
实际上,它推动["" {: ".~"]} ".~"]
,将堆栈保留为
[["" {: ".~"]} ".~"] ".~"] "\n" ["" {: ".~"]} ".~"]
最后,print
在不检查的情况下打印最上面的堆栈项目,然后发送
{: ".~"]}.~
到STDOUT。
⟮ô`\u27ee⦃ᶈ0}\u27ef
`ď2)⟯
请注意,后面有换行符。
标准奎因: ⟮ⒸⅩ222+ᶈ0
修改内容:
ô
函数输出所有结果,而不是最后结果(使用隐式输出完成)\u27ee⦃ᶈ0}\u27ef\n
并关闭复制块,以防止与以后的复制块发生冲突。ď2
以重复串两次。