产生无限输出的最短代码


121

编写可以产生无限输出的最短代码。

就这样。您的代码只有在某个时候停止产生输出时,才被取消资格。与代码高尔夫一样,最短的代码获胜。

这是我认为非常聪明的答案列表,因此可以得到好评:

排行榜


118
所有答案均不符合条件,因为地球将在某个时候被太阳吞噬,宇宙将在某个时间死亡:P
Doorknob

17
“无限直到您的计算机崩溃”计数吗?<_ <
Izkata

5
如果我用Piet编写我的代码,是否可以计算其他程序使用的文本像素?我相信最小的重复Piet程序将是6像素。如果“关闭”像素仍算在内,那将击败Befunge。
DampeS8N 2013年

9
@Izkata这样崩溃您的计算机的任何回答也是允许的:d
ɐɔıʇǝɥʇuʎs

7
@Doorknob实际上,挑战在于如何在有限的时间内产生无限的输出。听起来很容易。
桑契斯2015年

Answers:


212

Befunge(1)

.

0永远输出。之所以起作用,是因为在Befunge中,行会环绕,并且0如果您从空堆栈中弹出,则会得到提示。


6
我认为我们有一个赢家。
2013年

96
发誓我在这里的Java类比较短。+1
l0b0

56
现在,这一点使我获得了比下两个答案加起来还要多的声誉。
marinus

3
噢...这不公平:)让我们这样做:我将该图像的尺寸减小了几个像素,并且我们将其显示得非常小。甚至叫它?:)
Benjamin Podszun 2014年

4
为什么这不是公认的答案?
Claudiu 2014年

101

x86 .COM可执行文件,7

十六进制:

b8 21 0e cd 10 eb fc

其他需要千字节或更多的系统库和运行时。回归本源:

$ echo -ne '\xb8!\xe\xcd\x10\xeb\xfc' > A.COM
$ dosbox A.COM

output

您可以更改第二个字节(0x21!)以更改输出。

使用BIOS中断进行输出;不需要DOS,但是我没有设置QEMU。


说明

机器代码与以下程序集相对应:

        mov     ax, 0x0e21
again:  int     0x10
        jmp     again

输出全部在int调用中-根据此引用,AH中的int 0x10和0x0e会将AL中的字节打印到屏幕上。

知道寄存器AX是由高字节AH和低字节AL组成的16位字,我们可以通过将它们一起加载来节省额​​外的负载(从而节省机器代码中的一个字节)。


2
哇。这真的很好
tbodt

46
低机器码长度应该比高级语言更有价值。
2014年

12
这是真正意义上最短的代码。
microbian

4
它不仅起作用,而且比所有其他条目都快。:)
Thane Brimhall 2014年

14
@ThaneBrimhall当然,这是到目前为止无限循环的最重要标准...如果我的计算机挂起,我希望它以最有效的方式来完成!
kratenko

91

Windows批处理文件,2个字符

%0

无限调用自己。


12
伙计,第二名。做得好。我只看过一个答案,批处理赢得了它。
2014年

真的很棒!!!
Qwertiy 2014年

这太棒了!
Patrick Purcell 2015年

运作方式:%0没有@,因此会不断输出...> %0。由于这是递归的,因此这可能会占用整个RAM。
暴民埃里克(Erik the Outgolfer)

2
@EriktheOutgolfer 可能吗?这将如何不会在由于无限递归某些时候崩溃?我看不到这种情况如何持续多个小时
phil294

68

Befunge 98-2

,"

输出“ 、、、、、、、、、、、”,代表永恒。


2
其实有点聪明。
tbodt 2014年

谢谢。奇怪的是,版本使用最常见的b98实现输出空格(或“。输出32 32 32”)。不知道从哪里得到它。
AndoDaan 2014年

1
真是太糟糕了,它被埋在82,395个非常糟糕的答案下。
tbodt 2014年

7
@tbodt好吧,根据规范,我的小程序具有永恒的魅力。所以……手指交叉了……
AndoDaan 2014年

@AndoDaan:”创建一个逗号和INT_MAX-2位的字符串,然后打印的最后空间,所以堆栈将填补自己用逗号INT_MAX-3的空间,没有真正有效的。
YoYoYonnY

62

sh,3个字节

yes

y连续输出


10
虽然yes是外部二进制文件,但不是bash的一部分(严格来说)。
Bob

55
在bash中,(几乎)所有内容都是外部二进制文件。
Johannes Kuhn

5
通常,您没有别名,y=yes并且如果您的系统不是深奥的,则可以假定它yes在您的别名中$PATH(请参阅GNU Core Utilities)。通过您的逻辑,可以为每个解决方案假设一个奇怪的星座。
klingt.net

5
是的,但这不仅是一项bash功能:我不是核心utilsPOSIX shell基本部分。(即:请更改sh的标题:3个字符;-)
F. Hauri 2014年

2
正如技术专家所说,在busybox中它是内置的,但在sh中则不是,所以您必须说sh + coreutils。
暴民埃里克(Erik the Outgolfer)

42

Haskell:8个字符

旧线程,但有趣的是

 fix show

在Haskell中,它会打印

\\\\\\\\\\\\\....

永远,因为它基本上在运行

 let x = show x in x

它知道这x是一个字符串,因此第一个字符是",因此需要使用进行转义\",但是知道\需要进行转义\\\x,依此类推。


... 哇。现在,我想知道是否fix$show会更美观:-)
约翰·德沃夏克

7
因为这需要import Data.Function,并且因为它返回字符串而不是打印字符串,所以我质疑字符计数的公平性。另外,该字符串实际上是“ \” \\\“ \\\\\\\” \\\\\\\\\\\\\\\“ \\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\ “\\\\\\\\\\\\\\\\\ ......”
安德斯Kaseorg

36

Windows批处理文件,8个字符

:a
goto a

1
这不会产生无限的输出,是吗?
门把手

38
它确实...没有关闭@echo,它会打印“ goto a”,直到您关闭它为止
Patrick Purcell,

11
我们需要在这里附近
玩耍

35
我数了十个字符::a\r\ngoto a因为Windows使用CRLF
wchargin

1
@WChargin我刚刚使用十六进制编辑器进行了检查。3a 61 0a 67 6f 74 6f 20在我的Windows 8上工作...:P
YoYoYonnY 2015年

32

Brainfuck,4岁

+[.]

或者,

-[.]

8
无论\x01也不\xFF是可打印字符。我想这不是必须的,但:-/
John Dvorak

一种方法,使其输出可打印字符将与替换+,它意味着它需要一个输入,虽然
PRISMO

31

Java,54个字符

Java的最佳尝试:

class A{static{for(int i=0;i<1;)System.out.print(1);}}

7
功能齐全,符合规定,打高尔夫球。想知道为什么它被否决了。
manatwork

14
Java是否禁止经典for(;;)模式?那while(true)
CodesInChaos

17
@ CodesInChaos,Java通常不会禁止这些模式,通常我会认为它们更简洁,更惯用。在这里,尽管我们试图绕过编译器进行无限循环(这些形式导致编译器抱怨static {}块未退出)。
Rich Smith

2
@Mechanicalsnail是的,静态块不能单独由于Java 7运行
Fabinout

1
@OliverNi但是您不能使用该static块。
Okx

30

Bash,4个字节

$0&$

产出 ./forever2.sh: line 1: $: command not found连续。

因为 $0是有背景的,所以每个父对象都会在invalid命令之后死掉$,因此堆栈/内存不会被耗尽,并且应该无限期地继续下去。

奇怪的是,随着时间的推移,输出变得越来越慢。 top报告系统CPU使用率接近100%,但是存在内存或CPU占用进程。大概内核中的某些资源分配效率越来越低。


2
也许是stdout或类似行为...
masterX244

1
释放资源正在与派生进程竞争/要停止它,您不能杀死进程,因为PID更改的唯一方法是停止它,而是重命名脚本,因此$0失败。
伊曼纽尔

29

洛码(36)

HAI IZ 1<2? VISIBLE "0" KTHX KTHXBYE 

以为我会试一试LOLCODE,它具有令人惊讶的大量功能。


2
无需询问stdio。

在LOLCODE的repl.it版本,则不需要HAIKTHXBYE
MilkyWay90

24

的JavaScript:14

警告:您确实不想在浏览器中运行它

for(;;)alert()

31
只需选中“防止该网站打开更多对话框”。
Johannes Kuhn

1
@JohannesKuhn不需要检查,您需要重新启动
Ilya Gazman

8
或者什么也不做,它不显示任何进一步的输出。
Johannes Kuhn

刚运行alert()给我这个错误Error: Not enough arguments [nsIDOMWindow.alert]
Clyde Lobo 2014年

3
当进程被阻塞并停止执行直到类人动物交互时,它真的是无限的输出吗?
Morten Bergfall 2014年

24

图灵机-6个字符:

#s->1Rs

其中#的空白符号(默认情况下在磁带上)是空白,s描述唯一存在的(开始)状态,1正在打印一个数字,R表示向右移动,s最后是保持相同状态。


3
我算7个字符!?
F. Hauri

9
在可能的最常见的5元组表示法,这将被简单地写为5个字符s#1Rs(电流状态时,电流-符号,符号到写入,方向对移位,下一状态)。
res

19

哈斯克尔(10)

print[1..]

我认为这是最短的代码

  1. 打印出来的东西。
  2. 创建一个无限的Show:able数据结构。

对于那些感兴趣的人,它会打印:

[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,...

4
您是否出于任何原因选择了魔术数字32停下来?
ike13年

12
看起来不错,很圆,它也尽可能地填充了代码块空间,而无需下一行。
shiona

2
如果计算机内存有限,那么当整数变得太大而无法容纳在内存中时,它可能会终止?
Jeppe Stig Nielsen

3
@JeppeStigNielsen是的。但是,即使将填充一个兆字节的内存,也将是2 ^(2 ^ 20),即6.7 * 10 ^ 315652。达到一个千兆字节的内存,这个数字将变成2 ^(2 ^ 30),这是一个几乎有十亿位数的怪物。我非常确定,如果我们尝试打印该系列作品,那么在内存耗尽之前,宇宙的热死会袭击我们。而硬盘故障的方法就在此之前。
shiona 2013年

5
在OP下方的注释中,提到“无限直到计算机崩溃”也很重要。
3684年

19

万宝龙 4

24MB

Marbelous在这里表现出色。这将发布无限数量的美元符号$,尽管它将很快达到堆栈限制。

这个怎么运作。

24是语言文字,它将从面板上掉下来并打印为STDOUT作为其相应的ascii字符。MB是隐式给予主板的名称,因为主板没有输入,它将触发每个刻度。并且由于单元是从左到右求值的,因此文字将始终在下一个递归调用之前打印。

因此,这与以下伪代码等效:

MB() {
    print('$');
    while(true) MB();
}

没有无限递归的解决方案11

24@0
@0/\..

这个方法是通过在两个入口之间循环文字来工作的@0,每当24个击中下部时,@0它将被传送到上部下方的单元中@0。它落在上/\,它是一个克隆运算符,它将一个大理石(文字)副本放在其左侧(在门户背面)上,将另一副本放在其右侧。然后,该层从板上掉下来(因为它..是一个空单元),并打印到STDOUT。用伪代码,这将转换为:

MB() {
    while(true) print '$'
}

没有无限递归的较短解决方案9

24
\\/\..

这个人不断地将大理石扔向克隆器和偏转器之间,将一个副本放在最右边的单元上,然后从板上掉下来。用伪代码看起来像:

MB() {
    List charlist = ['$'];
    while(true) {
        charlist.add(charlist[0];
        charlist.add(charlist[0];
        charlist.pop();
        print(charlist.pop());
        // Wait, what?
    }
}

注意

..最后两个板上的单元格是必需的,因为否则大理石会从板上降落(并丢弃)。为了给您带来更多乐趣,您可以用替换24大理石FF,将空..单元格替换为??,这会将任何大理石转换为介于0和当前值之间的大理石,然后再将其放下。猜猜在STDOUT上会是什么样子。


使您的“ / \ / \”“ \\ / \”避免在左边缘产生多余的大理石?纯粹的美学改进。
Sparr 2015年

@Sparr,要点,我已经编辑了帖子。
overactor

5
此解决方案不应该是25165824字节(24MB)吗?; P
HyperNeutrino

18

C,23个字符

到目前为止比最佳C / C ++答案略短。无限打印空行(但是如果不进行优化而编译,则会溢出堆栈)。

main(){main(puts(""));}

1
22个字符:(putc(0)或1或2,...或9)。那行得通吗?
CompuChip 2014年

@CompuChip,putc需要2个参数。
ugoren 2014年

10
@tdbot,请注意,这是公认的答案。感谢您的赞美,但不明白为什么。答案
ugoren 2014年

@tbodt,而不是tdbot。ftfy
nyuszika7h 2014年

5
@ nyuszika7h,这样我就可以展示我的谦虚,同时坚持15个代表。
ugoren 2014年

14

Python 3:15、17或18个字符

mdeitrick的答案在Python 3中更长,它用print函数调用(15个字符)代替了该语句:

while 1:print()

这仍然是我在Python 3中发现的最短的时间。但是,在无限循环中有一些更有趣的打印方式,它们的长度只有几个字符。

  • print()return None,!= 9,使其成为无限循环;的8是无操作该可代替pass(18个字符):

    while print()!=9:8
    
  • iter(print, 9)定义一个迭代器,该迭代器返回的输出print()直到它等于9(永远不会发生)。any使用可迭代的输入来寻找真实值,此值自print()返回始终返回None。(您也可以使用set相同的效果。)

    any(iter(print,9))
    
  • 或者,我们可以通过测试迭代器是否包含8(17个字符)来使用该迭代器:

    8in iter(print,9)
    
  • 要么, 使用splat运算符解压缩它

    *_,=iter(print,9)
    
  • 我想到的最奇怪的方法是在函数调用中使用splat分解function(*iterable)。似乎Python甚至在尝试函数调用之前就尝试消耗整个可迭代对象,即使该函数调用是伪造的。这意味着我们甚至不需要真正的函数,因为类型错误只会在迭代器用完后抛出(即从不):

    8(*iter(print,9))
    

*iter(print,1),可以工作并且只有15个字符,但是确实消耗了很多内存。
ivzem


14

x86 .COM可执行文件,5字节

endless ASCII char set output

十六进制:

40 CD 29 FF E6

在asm中:

inc ax
int 0x29
jmp si

说明:

inc ax 将寄存器AX加1。 int 0x29是MSDOS的“快速放置字符”例程,该例程仅输出AL(AX的低位部分)中的值并将光标前移一个。jmp si只是跳回顶部的一种怪异方法,因为在几乎每个类似于DOS的操作系统上,寄存器SI都是0x100,这也是.com程序的起始位置;)也可以执行短跳转,这也可以使用2个字节。

资料来源:

MSDOS起始值

尺寸编码WIKI


13

Bitxtreme,0.25字节

二进制表示形式:

00

从文档中:

每对的第一位是指向存储位置的指针,该位置保存要从累加器中减去的值。结果存储在操作数指向的相同存储位置。如果结果为负(位以二进制补码表示),则该对的第二位将以模2形式添加到当前PC。

程序计数器和累加器初始化为零;然后,从累加器中减去存储单元0的内容。恰好为0,累加器为零。由于没有进位,因此第二位不会添加到程序计数器中。

然后,程序计数器将以2模2递增。将其发送回起点,并导致无限循环。在每个步骤中,特殊存储位置0都会被修改,从而导致其内容(0)写入输出。

可以说该程序应记为1个字节,因为Python中的官方解释器需要零填充。但是,我认为零填充不是真正的代码


12

摘要:Ruby-9,Golfscript-6,> <>-2,空白-19,Perl-2

我知道一种语言,而我从未用过两种语言:D
编辑:安装Perl尝试它时Perl没用:(

露比9岁

loop{p 1}

只需连续在单独的行上打印1。

此外,还有很多替代方案:

loop{p''} # prints [ "" ]  on separate lines continually
loop{p p} # prints [ nil ] on separate lines continually

10个字符的解决方案:

p 1while 1

实际上我很惊讶我可以删除第一个1和第二个之间的空间while,但是显然可以

Golfscript,6岁

{1p}do

我的第一个Golfscript程序!:P

> <>(),2

1n

空格,19

lssslssstltlsslslsl

其中,s代表空格,t代表制表l符和换行符。


11
每当有人键入“我没有Perl”字样时,上帝就会杀死一只小猫。
2013年

2
@primo:P至少现在我知道了。
门把手

2
这是代码高尔夫。请为每个提交创建一个答案。
JB 2014年

21
@primo很好,我讨厌猫。而且我没有Perl。
SQB 2014年

5
GS程序{1p}do仅打印1并退出,因为do是一个exec-pop-test序列,仅在测试为true时才继续。(由于没有输入,因此堆栈最初""是,在exec of 1p之后被弹出并测试为false。)尽管如此,仅添加dup即可{1.p}do(例如7字节)。
2014年

12

C 25 24

main(){main(puts("1"));}

4
s/while/main/
ugoren

2
我不确定C中是否存在stackoverflow异常,但是当内存不足时,会发生一些不良情况。
伊利亚·加兹曼

9
尾调用优化。
Johannes Kuhn

4
@JohannesKuhn:这不是尾巴。如果是这样的return main(puts("1"))话,那将是一次尾声。
marinus 2013年

4
@psgivens。在ca函数中,不带任何参数的参数可以包含任意数量的参数。仅签名的methodName(void)接受完全为零的参数。
James Webster


11

perl,10个字符

这是另一个10个字符的perl解决方案,具有一些不同的权衡。具体来说,它不需要-n标志或用户输入即可启动。然而,它确实使记忆力无限。

warn;do$0

保存到文件,执行该文件,您会得到例如:

Warning: something's wrong at /tmp/foo.pl line 1.
Warning: something's wrong at /tmp/foo.pl line 1.
Warning: something's wrong at /tmp/foo.pl line 1.

您不能使用say(使它始终打印换行符,即使它无法从任何地方找到参数)来使它更短warn吗?(这需要使用来选择现代的Perl变体-M5.010,但这不会影响您的字符数。)


10

VBA:12

音频输出了吧?

do:beep:loop

将其放入“最喜欢的”同事最喜欢的启用了宏的MS Office文件中,以获取“乐趣”!

Private Sub Workbook_Open()
    Do:Beep:Loop
End Sub

如果他们使用耳机,则可获赠积分。


当,我正在寻找答案,看看是否有人考虑过印刷铃铛炭。+1
mbomb007'4

9

种子,4个字节

99 5

在线尝试!11无限输出

生成以下Befunge-98程序:

[glzgx"Lz^v*M7TW!4:wi/l-[, s44~s;|Sa3zb|u<B/-&<Y a@=nN>Nc%}"gq!kCW $1{2hyzABRj*glr#z(@Zx@xT=>1'.b
/

在线尝试!


相关的部分就是这样:

[>1'.b
/

b11入堆栈并.打印。1并且49也被推入堆栈,但从未实际打印过。

运行代码的动画:

enter image description here


1
如果将值连续不断地推入堆栈而不弹出,这是否最终会耗尽内存?
Caird coinheringaahing

8

C,26 25 24(无递归)

main(){for(;;puts(""));}

打印无尽的'\n'字符。这比最短的C答案长一个字节,但不依赖尾部调用优化来避免堆栈溢出。


2
您可以使用for(;;)while(!
Alex Gittemeier(

1
否,!因为它一直在输出\n
l4m2,18年


7

PowerShell 2.0:17 11 8

我最初的解决方案:

while(1 -eq 1){1}

感谢res:

while(1){1}

我认为DankoDurbić在这里有赢家。我什至不知道为什么这应该起作用,但是它可以起作用,到目前为止,我想不起任何更短的事情。

for(){1}

1
尝试while(1){1}
解析度

我打算用@res将它减少两个,while($true){1}但您的解决方案肯定会胜出-我在PowerShell中忘记了这一点$true -eq 1。将其发布为答案,我将给您投票。
Iszi 2013年

如果愿意,可以将其随意编辑。
res

6
尝试for(){1}
DankoDurbić13年

@DankoDurbić您能解释一下为什么起作用吗?我不太明白。似乎对我来说是错误的。
Iszi 2013年
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.