每行的奎因


30

您的目标是创建一个可以无限打印的程序,并在每行之后添加一个新行。因此,如果您的程序是单行程序,那么它将在输出的每一行上重复执行。

程序:

A

输出:

A
A
A
...

规则

  • 它必须是完整的程序,而不是摘要或功能。
  • 该程序应永远循环,而不会出现堆栈溢出或递归限制错误。
  • 输出是标准输出或最接近的替代输出。
  • 不接受任何程序输入。
  • 不允许出现标准漏洞,例如打开程序的文件或访问外部资源。空程序不允许作为标准漏洞。
  • 如果您的程序代码以尾随换行符结尾,则这不算作成对字符之间的必要换行符,您必须打印另一个。
  • 最短的代码胜出!

标题看起来只有一线程序有资格吗?
圣保罗Ebermann

@PaŭloEbermann然后阅读问题描述。这是一个机智的标题,因为它押韵。这是有效的多行程序的示例:codegolf.stackexchange.com/a/57985/34718。您不能仅阅读标题就知道有关挑战的所有知识。
mbomb007'9

@PaŭloEbermann这只是while(1)println(your_code);
马修·罗

Answers:


19

裂变,7个字节

'!+!NR"

到目前为止,我发现了最短的Fission quine的一个相当简单的修改:我只是在使用非破坏性!代替,而是为换行符O添加了一个N

因此,总而言之,这是它的工作原理:控制流始于R正确的原子。"切换字符串模式,这意味着一切都将"打印到下一个:在这种情况下'!+!NR。这样"就可以打印和换行符了。'!将原子的质量设置为33,将其质量+增加为34(字符代码为")并!打印引号。N打印换行符,R在这种情况下现在是空操作,因此循环从头开始。

以下7字节解决方案也可以使用:

"NR'!+!

9

> <>,16个字节

'ard3*o50l2)?.~~

传统的<> quine使用太多os,因此我们使用循环进行打印。在每次跳转之前,我们先按5和0(要跳转到的位置的坐标),之后.如果有需要打印的内容,则跳转至,或者使用弹出前两个值~~

(由于我忘记了堆栈溢出规则,因此恢复为16版本。)


另一个选择是"ar00go50l2)?.[,对吗?
mbomb007'9

3
@ mbomb007我猜是,但是我更喜欢,d3*因为它g读取了您自己的源代码
Sp3000

8

CJam,13个字节

{_o"_g
"o1}_g

在线解释器在程序终止之前不会打印任何内容,因此您必须在Java解释器中进行测试。

说明

最后,一个广义的CJam quine不以_~

{_o"_g
"o1}

这只是推一个障碍。_g复制该块并重复执行,而堆栈的顶部为真(丢弃条件)。

现在在该块内部,该块的另一个副本仍在堆栈中。我们复制并用进行打印_o,然后在印刷_g后加上换行符(quines之间需要的额外换行符)"_g\n"o。最后,我们将a压入1堆栈以使循环重复进行,因为不幸的是,在CJam中,块不是真实的(或虚假的)。


7

蟒蛇2,39

在Python中并不是一件非常有趣的任务,因为将while循环添加到普通的Quine并不容易。

c='while 2:print"c=%r;exec c"%c';exec c

这不是打击堆栈吗?
Jesan Fafon 2015年

1
@JesanFafon不,如果尝试过,您会发现它没有。没有递归。
feersum

6

Perl 5.10 +,40 37字节

$_=q{say"\$_=q{$_};eval"while 1};eval

或(也是37个字节)

$_=q{{say"\$_=q{$_};eval";redo}};eval

-M5.010-E命令行标志调用,例如

$ perl -E '$_=q{say"\$_=q{$_};eval"while 1};eval'
$_=q{say"\$_=q{$_};eval"while 1};eval
$_=q{say"\$_=q{$_};eval"while 1};eval
$_=q{say"\$_=q{$_};eval"while 1};eval
...

感谢Ilmari Karonen从原始解决方案中削减了3个字节,这是:

eval while$_=q{say"eval while\$_=q{$_}"}

这以及上面较短的37字节解决方案,都是以下quine的简单变体,我在Ilmari的其他文章之一中第一次看到

$_=q{say"\$_=q{$_};eval"};eval

由于我在原始解决方案中添加的只是一个while循环,因此,他确实应得到大部分荣誉。:-)


很好,谢谢您的功劳。:-)最初的奎因是我自己设计的,尽管其他人可能早些时候已经独立发现了。顺便说一句,$_=q{say"\$_=q{$_};eval"while 1};eval否则$_=q{{say"\$_=q{$_};eval";redo}};eval会短几个字节。($_=q{say"\$_=q{$_};eval";eval};eval甚至会更短,但我怀疑它最终会用光堆栈。)
Ilmari Karonen

我希望你能出现!谢谢您提供较短的解决方案,我想您会想出更好的方法。但是当我在链接到的答案中看到它时,我对此感到非常震惊,我只需要自己尝试一下即可。:)说实话,我还没有完全把头包裹在奎因上,但是其他答案使我有更多的眼光。我不确定您是否起源于此,因为我看到您将此页面归功于最短的非作弊Perl quine(?!),但此quine没有任何归属(使用print代替say)。
ThisSuitIsBlackNotNot

顺便说一句,运行了一段时间后,最后一个确实确实存在段错误。再次感谢,@ Ilmari!
ThisSuitIsBlackNotNot

其实,我有点退缩了-我绝对不是第一个发明这种quine的人,并且因为我以前肯定看过它(我在同一线程中张贴了我确实要称赞的那个),所以很可能我下意识地从那个线程或其他地方记住了它。
Ilmari Karonen

好吧,我没有指定来源。无论如何,谢谢您的3个字节,也谢谢您的原始灵感。
ThisSuitIsBlackNotNot

5

自修改Brainf ***(SMBF),14字节

尾随的换行符\n必须是文字的Unix换行符(ASCII代码10)。

[<[<]>[.>]<.]\n

说明:

该代码将指针移至其源代码的最左侧,然后将其全部打印,包括换行符(规则的b / c两次)。循环继续。


您的意思是,必须是\r
Ismael Miguel

@IsmaelMiguel号\n是换行符,并且是ASCII码10,因此源代码的十六进制转储将具有该0A字节的值。code.cside.com/3rdpage/us/newLine.html
mbomb007

1
@IsmaelMiguel不正确。键入代码时,实际上是按Enter键换行。\n通常在您的代码中算作2个字符和2个字节。我以这种方式键入内容以提高可读性,因为格式不能很好地在源代码末尾显示空白行。因此,我必须指定它是一个字节,而不是两个字节。
mbomb007's

2
\n始终是单个字符,称为换行符。甲换行符,但是,是字节的平台相关的序列。
丹尼斯

2
@丹尼斯也许是这样,但我不在乎。我不称其/为“ Solidus”,也不知道有人这样做。“ Newline”以开头n,这是转义字符,所以我称之为它。它比“回车”更接近“换行”。
mbomb007'9

3

PowerShell,143字节

$d='$d={0}{1}{0}{2}while(1){3}Write($d -f [char]39,$d,"`n",[char]123,[char]125){4}'
while(1){Write($d -f [char]39,$d,"`n",[char]123,[char]125)}

基于Rosetta Code PowerShell quine,我非常有信心这不是最短的。PowerShell中的字符串替换格式对此很讨厌,因为用于放置替换的相同定界符{}也分隔了代码块while{},因此我们必须使用[char]强制转换,从而使代码code肿。


3

欠载,25个字节

第一次,我尝试过类似的操作,但不确定是否遵循所有规则,因为它有两行。换行有点麻烦。

(::a~*S:a~*^
)::a~*S:a~*^

1
@ mbomb007每次迭代的输出是程序的两行。我在这里
MickyT

3

Befunge30 20字节

<,+55,*2+98_ #!,#:<"

流行的beunge quine的变体,它打印出换行符,如果结束该行,则在堆栈上弹出-1。
不幸的是,Befunge在一行中做事时变得冗长。我试图删除所有#可能的启动板(),但必须保留其中的一些启动板以跳过某些命令(例如,)。

变化:

30-20- >将基本Quine更改为我使用字符串输入进行的自定义。这样,分支就容易得多。

旧:

:0g,:93*`>0-10 #,+$#: #5 _1+>

我认为这不是最佳选择,但目前可以接受。


您可以使用get指令来抢占一个空格,并向其中添加2个字符,使其比98+2/以下字符短一个字节:<,+ 55,+ 2g1_#!,#:<“
MildlyMilquetoast

并先推引号和换行符并反转打印机,-1g0:+5<>:#,_1"
Jo King


2

R,34个字节

repeat{write(commandArgs()[5],'')}

从命令行调用如下:

Rscript -e "repeat{write(commandArgs()[5],'')}"

2

> <>,31个 29字节

对传统> <> quine的简单修改。

"ar00gc0.0+efooooooooooooooo|

要运行,请将其粘贴在此处,单击“提交”,然后单击“开始”(不运行动画不起作用)。随意提高执行速度。


"ar00gc0.0+feooooooooooooooo|是短两个字节。
2015年

@科尔谢谢。我曾考虑过镜子,但是在遇到其他挑战后忘了更换镜子。
mbomb007'9


@JoKing已经有了一个更短的> <> 解决方案
mbomb007

2

Python 2,48个字节

c='c=\'%s\';while 1:print c%c';while 1:print c%c

2

GolfScript,16个字节

{.".do
":n\p}.do

最终看起来很像MartinBüttner的CJam条目。事实证明,一个有趣的功能是,".do"在打印块时追加到块的最短方法是将其分配给行终止符n。(当然,我们还需要在字符串中包括一个实际的换行符,以替换n通常包含的换行符。)同一字符串(在GolfScript中是真实的)也留在堆栈上,do以弹出循环,确保循环永远运行。


1

BASH,76个字节

只是无法抗拒,尤其是在这里使用PowerShell :)

while true;do
a ()
{
    echo while true\;do
    declare -f a
    echo a\;done
}
a;done

空格对于精确复制很重要。


1

Javascript(ES6),64

for(;;(_=>console.log(`for(;;(_=>${arguments.callee})());`))());

可替代的(也是64)

a="for(;;)console.log(`a=${JSON.stringify(a)};eval(a)`)";eval(a)

替代方案不会导致堆栈溢出吗?
Patrick Roberts

不会。没有递归,因此堆栈上不应添加任何内容。
DankMemes 2015年

好的,我刚刚对它们都进行了测试,您对替代解决方案是正确的,但是您的第一个解决方案失败了,我知道了原因。根据MDN关于箭头函数的文档,“箭头函数不会向其代码公开参数对象”,因此您的箭头arguments.callee不存在并引发错误。
Patrick Roberts

有趣。对于Firefox开发人员版42.0a2(2015-09-13)的我来说,两者都可以工作。我想一旦该标准被完全采用,第一个将停止工作。
DankMemes

我尝试在最新的chrome上测试它们,因为我尝试使用第一个解决方案!而不是将括号括起来,而是将函数执行放在for循环之后,以避免需要for循环分号主体,这样可以节省(我认为)4个字节
Patrick罗伯茨

1

缩图稿,22字节

"f1{CqxCanx"f1{CqxCanx

基于从Esolangs文章奎因:"fCqxah"fCqxah。充分利用了该语言根据需要自动附加右花括号的事实,如果没有该括号,则该花括号的长度将增加两个字节。


1

批处理,10个(文件名长度加4)

不知道这是否符合两个原因:

  • 从技术上讲,Windows命令外壳可能会或可能不会产生文本方面的副作用,这取决于它的配置方式。
  • 该程序通过名称来调用自身,我不确定规则(特别是“禁止打开程序文件”规则)是否禁止这样做。它不是为了阅读和打印文本而开放。它只是在重新运行本身。此外,文件系统结构是老式批处理脚本的组成部分(有时甚至被用于存储程序状态等)。因此,我不确定这是否违反了第5条规则。

代码(对于名为q.bat的程序):

echo on&&q

2
我知道我会允许使用它,因为它不是最短的,而且它是创意和独特的。它不是在读取源代码,而是在执行自身。
mbomb007'9

1
由于文件名不是任意的,因此至少应将文件名添加到字节数中。
马丁·恩德

1
我相信您可以使用,echo on&&%0尽管我害怕尝试。
DankMemes

1
更新:echo on&&%0不起作用。%0在输出中显示为展开,并且窗口(7位,32位,在VM中运行)很快终止了整个过程。
DankMemes 2015年

1
我认为您可以省略此.bat部分
SuperJedi224

1

锡兰210个 208字节

当然,这不会赢任何东西。

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

原版的:

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(true){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(true){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

从两天前通过添加while(true){...}循环修改了Quine,所以我从普通Quine的185个字节增加到210个(不再需要尾随换行符了)。但是后来我发现while(1<2){...}循环还要短两个字节:

shared void u(){value q="\"\"\"";value t="""shared void u(){value q="\"\"\"";value t=""";value b="""while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}""";while(1<2){print(t+q+t+q+";value b="+q+b+q+";"+b);}}

(锡兰没有for(;;)像Java那样的循环,该循环也需要大括号。)


1

PowerShell,132107字节

$a='$a={0}{1}{0};for(){2}$a-f[char]39,$a,[char]123,[char]125{3}';for(){$a-f[char]39,$a,[char]123,[char]125}

基于Rosetta Quine(与@AdmBorkBork相同),尽管不使用格式化来替换字符串...也许切换到for循环并使用格式化是最好的?

我敢肯定,如果AdmBorkBork回来了,他们会击败很多:P

编辑找出for循环和替换,这一切都要感谢我的前任:)

旧尝试:

$a='$a=;for(){$a.substring(0,3)+[char]39+$a+[char]39+$a.substring(3)}';for(){$a.substring(0,3)+[char]39+$a+[char]39+$a.substring(3)}


1

Java 10,194个字节

interface M{static void main(String[]a){for(var s="interface M{static void main(String[]a){for(var s=%c%s%1$c;;)System.out.println(s.format(s,34,s));}}";;)System.out.println(s.format(s,34,s));}}

说明:

在线尝试(60秒后超时)。

interface M{                    // Class
  static void main(String[]a){  //  Mandatory main-method
    for(var s="interface M{static void main(String[]a){for(var s=%c%s%1$c;;)System.out.println(s.format(s,34,s));}}";
                                //   Unformatted source code
        ;)                      //   Loop indefinitely
       System.out.println(      //    Print with trailing new-line:
         s.format(s,34,s));}}   //     The formatted source code

-part:

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

挑战部分:

  • for(;;) 用于无限循环。
  • System.out.println(...) 用于打印尾随换行符





1

Brachylog,16个字节

∋"∋~kgjẉ₁⊥"gjẉ₁⊥

您不能完全在线上尝试它,但是我已经验证了它可以在我的安装中使用。

Brachylog,18个字节

∋"∋~kgjw₁⊥~n"gjw₁⊥

在线尝试!

从替代版本的改编本奎因,用劈我最初设计为回溯BOGO排序的所有东西。~n之所以要花两个字节,是因为(用尾随换行符打印的通常方法)在TIO上的字符编码遇到了一些奇怪的问题,并且插入到字符串文字中的实际换行符通过~kas 打印\n

               w      Print
 "∋~kgjw₁⊥~n"         "∋~kgjw₁⊥~n"
∋                     which is an element of
                      the (unused and unconstrained) input
                ₁     formatted
          ~n          (so that the ~n is replaced with a newline)
             gj       with itself
   ~k                 (so that the ~k is replaced with the string in quotes),
                 ⊥    then try again.

因为w₁将输入作为列表[string to be formatted, formatting arguments],所以将字符串包装在列表中,g然后将其与自身连接起来,j可以对其进行自身格式化。而且由于没有给程序提供任何输入,因此在程序开始时隐式存在的输入变量可以采用任何值,因此可以将其限制为包含"∋~kgjw₁⊥~n"作为元素的无数个列表之一,从而创建一个打印源程序击中时返回的选择点


1

Python 3.6,48 43字节。

-5个字节,感谢@Jo King

x='while 1:print("x=%r;exec(x)"%x)';exec(x)

您可以%r用来节省对它们'的转义。43个字节
Jo King

这给出了python 3.8的41:P
仅ASCII的

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.