Código mais curto para produzir saída infinita


121

Escreva o código mais curto possível que produz uma saída infinita.

Isso é tudo. Seu código será desqualificado apenas se parar de produzir saída em algum momento. Como sempre no código de golfe, o código mais curto vence.

Aqui está uma lista de respostas que eu acho realmente inteligentes, para que possam obter crédito:

Entre os melhores


118
Todas as respostas foram desqualificadas porque, em algum momento, a Terra será engolida pelo sol e, em algum momento, o universo morrerá: P
Maçaneta da porta

17
"Infinito até o computador travar" conta? <_ <
Izkata 10/11/2013

5
Se eu escrever o meu em Piet , posso contar os pixels do texto que os outros programas usaram? Acredito que o menor programa possível de repetição de Piet seria 6 pixels. Isso supera o Befunge se os pixels "off" ainda contam.
DampeS8N

9
@Izkata Portanto, qualquer resposta que trava o computador também é permitida: D
Enviado por

7
@ Doorknob Então, realmente, o desafio é produzir uma saída infinita em uma quantidade finita de tempo. Parece fácil o suficiente.
Sanchises

Respostas:


212

Befunge (1)

.

Saídas 0para sempre. Funciona porque nas linhas do Befunge são contornadas e você obtém 0se sair da pilha vazia.


6
Acho que temos um vencedor.
primo

96
Eu juro que tive uma aula de Java por aqui em algum lugar que era mais curto. 1
l0b0

56
Esse ponto agora me deu mais reputação do que minhas próximas duas respostas juntas.
marinus

3
Ah ... isso não é justo :) Vamos fazer assim: reduzo o tamanho dessa imagem em alguns pixels e a exibimos muito pequena .. Para que pareça um ponto? E chama mesmo? :)
Benjamin Podszun

4
Por que essa não é a resposta aceita?
Claudiu

101

x86 .COM Executável, 7

em hexadecimal:

b8 21 0e cd 10 eb fc

Os outros precisam de kilobytes ou mais de bibliotecas do sistema e tempo de execução. Voltar à rotina:

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

resultado

Você pode alterar o segundo byte ( 0x21, ou !) para alterar a saída.

Usa uma interrupção do BIOS para saída; não precisa do DOS, mas eu não tinha o QEMU configurado.


Explicação

O código da máquina corresponde ao seguinte conjunto:

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

A saída está toda na intchamada - por esta referência , int 0x10 com 0x0e em AH imprimirá o byte em AL na tela.

Sabendo que o registro AX é uma palavra de 16 bits composta por AH no byte alto e AL no byte baixo, podemos economizar uma carga extra (e, portanto, um byte no código da máquina) carregando-os juntos.


2
Uau. Isso é realmente bom
tbodt

46
o tamanho baixo do código de máquina deve valer mais pontos que as linguagens de alto nível.
pwned

12
Este é o código mais curto no sentido real.
microbian

4
Não só funciona, ele funciona mais rápido que todas as outras entradas. :)
Thane Brimhall

14
@ThaneBrimhall Qual é, de longe, o critério mais importante para um loop infinito ... Se meu computador desligar, eu quero que ele o faça da maneira mais eficiente!
precisa saber é o seguinte

91

Arquivo em lote do Windows, 2 caracteres

%0

Chama a si mesmo infinitamente.


12
Feche o segundo lugar, cara. Bem feito. Eu só vi uma resposta em que o Batch ganhou.
unclemeat

É realmente ótimo !!!
Qwertiy

Isso é incrível!
Patrick Purcell

Como funciona: %0não possui um @, por isso produzia constantemente algo parecido ...> %0. Porém, isso pode consumir toda a RAM em algum momento, uma vez que é recursivo.
Erik the Outgolfer

2
@EriktheOutgolfer pode ? Como isso não trava em algum momento devido à recursão infinita? Eu não vejo como isso pode continuar por várias horas
phil294

68

Befunge 98-2

,"

Saídas ",,,,,,,,,,," para a eternidade.


2
Na verdade, um pouco inteligente.
tbodt 02/09

Obrigado. É estranho, a versão ", gera espaços (ou". Gera 32 32 32) usando a implementação mais comum do b98. Não faço ideia de onde isso acontece.
AndoDaan 02/09

1
É uma pena que tenha sido enterrado sob 82.395 respostas realmente ruins.
tbodt 3/09/14

7
@ tbodt Bem, de acordo com as especificações, meu pequeno programa tem toda a eternidade para avançar. Então ... dedos cruzados ...
AndoDaan

@AndoDaan:", cria uma cadeia de uma vírgula e INT_MAX-2 espaços, em seguida, imprime o último espaço para a pilha vai encher-se com uma vírgula INT_MAX-3 espaços, não é realmente eficiente..
YoYoYonnY

62

sh, 3 bytes

yes

saídas ycontinuamente


10
Embora yesseja um binário externo, e não faz parte do bash (a rigor).
Bob

55
No bash, (quase) tudo é um binário externo.
Johannes Kuhn

5
Normalmente você não tem um alias y=yese se o seu sistema não é esotérico, você pode assumir que yesestá no seu $PATH(consulte GNU Core Utilities ). Com sua lógica, é possível assumir constelações estranhas para cada solução.
Klingt.net # 28/13

5
Certo, mas isso não é apenas um bashrecurso: é uma parte básica do shell POSIX dos utilitários principais . (Ie: por favor, altere o título para sh: 3 caracteres ;-)
F. Hauri

2
Como o technosaurus diz, no busybox é um builtin, mas no sh não é, então você deve dizer sh + coreutils.
Erik the Outgolfer

42

Haskell: 8 caracteres

Fio antigo, mas divertido é

 fix show

em Haskell, imprime

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

para sempre, uma vez que está basicamente rodando

 let x = show x in x

Ele sabe que xé uma string, então o primeiro caractere é ", então isso precisa ser escapado \", mas saiba que \precisa ser escapado assim \\\x, e assim por diante.


... Uau. Agora eu estou querendo saber se fix$showteria sido :-) mais estética
John Dvorak

7
Como isso requer import Data.Function, e porque retorna a sequência, em vez de imprimi-la, questiono a imparcialidade da contagem de caracteres. Além disso, a cadeia é realmente "\" \\\ "\\\\\\\" \\\\\\\\\\\\\\\ "\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\ "\\\\\\\\\\\\\\\\ ...".
Anders Kaseorg

36

Arquivo em lote do Windows, 8 caracteres

:a
goto a

1
Isso não produz uma saída infinita, produz ...?
Maçaneta

38
ele faz ... sem @echo off, ele imprime "goto um" até você fechá-lo
Patrick Purcell

11
precisamos mor BAT por aqui
Einacio

35
Conto dez caracteres: :a\r\ngoto aporque o Windows usa CRLF
wchargin

1
Acabei de verificar usando um editor hexadecimal. 3a 61 0a 67 6f 74 6f 20funciona no meu windows 8 ...: P
YoYoYonnY

32

Brainfuck, 4

+[.]

Alternativamente,

-[.]

8
Nem \x01nem \xFFsão caracteres imprimíveis. Eu acho que não era uma exigência, no entanto: - /
John Dvorak

Uma maneira de fazer com que produza caracteres imprimíveis seria para substituir o + com, Isso significa que requer uma entrada embora
Prismo

31

Java, 54 caracteres

Melhor tentativa em Java:

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

7
Funcional, cumpre as regras, jogou golfe. Querendo saber por que foi votado.
manatwork

14
O java proíbe o for(;;)padrão clássico ? Que tal while(true)?
CodesInChaos

17
@CodesInChaos, Java normalmente não desabilita esses padrões e normalmente eu os consideraria mais limpos e mais idiomáticos. Aqui, apesar de estarmos tentando passar um loop infinito pelo compilador (esses formulários fazem com que o compilador se queixe de que o bloco estático {} não está saindo).
rico Smith

2
@Mechanicalsnail Sim, blocos estáticos não pode executar sozinha desde java 7.
Fabinout

1
@ OliverNi Mas você não pode usar o staticbloco.
Okx 01/09/17

30

Bash, 4 bytes

$0&$

Saídas ./forever2.sh: line 1: $: command not foundcontinuamente.

Por $0ser em segundo plano, cada pai morre após o comando inválido $e, portanto, a pilha / memória não é consumida e isso deve continuar indefinidamente.

Estranhamente, a produção fica cada vez mais lenta com o tempo. toprelata que o uso da CPU do sistema é próximo de 100%, mas existem processos de memória ou CPU-hog. Presumivelmente, alguma alocação de recursos no kernel fica cada vez menos eficiente.


2
talvez um comportamento de stdout ou similar ...
masterX244

1
a liberação de recursos está competindo com os processos de bifurcação / Para interrompê-lo, você não pode interromper o processo, pois o PID muda. A única maneira de pará-lo é renomear o script para que ele $0falhe.
Emmanuel

29

LOLCODE (36)

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

Pensei que eu daria uma chance ao LOLCODE, com uma quantidade surpreendentemente grande de funcionalidades.


2
Não precisa perguntar sobre o stdio.
cat

Na versão repl.it do LOLCODE, você não precisa HAIeKTHXBYE
MilkyWay90

24

JavaScript: 14

AVISO: você realmente não deseja executar isso no seu navegador

for(;;)alert()

31
Basta marcar "Impedir que este site abra mais caixas de diálogo".
Johannes Kuhn

1
@JohannesKuhn não verifique isso e você precisa reiniciar #
Ilya Gazman 11/11

8
Ou simplesmente não faça nada e ele não exibirá mais nenhuma saída.
Johannes Kuhn

apenas correndo alert()me dá esse erroError: Not enough arguments [nsIDOMWindow.alert]
Clyde Lobo

3
É realmente uma saída infinita, quando o processo é bloqueado e a execução interrompida até a interação humanóide?
Morten Bergfall

24

Máquina de Turing - 6 caracteres:

#s->1Rs

onde #está o símbolo em branco (na fita por padrão), sdescreve o único estado existente (início), 1está imprimindo um dígito, Rsignifica mudar para a direita e, sno final, permanecer no mesmo estado.


3
Eu conto 7 caracteres !?
F. Hauri

9
Talvez na notação mais comum de 5 tuplas , isso seria escrito simplesmente como os 5 caracteres s#1Rs(estado atual, símbolo atual, símbolo a escrever, direção a mudança, próximo estado).
res

19

Haskell, 10

print[1..]

Eu acho que esse é o código mais curto para

  1. Imprima alguma coisa.
  2. Crie uma estrutura de dados infinita Showe capaz.

Para os interessados, imprime:

[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
Existe alguma razão para você escolher o número mágico 32 para parar?
Ike

12
Parecia bom e redondo, pois também preenchia o espaço do bloco de código o melhor possível, sem a necessidade de uma próxima linha.
Shiona

2
Se a máquina tiver uma quantidade finita de memória, ela poderá terminar quando o número inteiro ficar muito grande para armazenar na memória?
Jeppe Stig Nielsen

3
@JeppeStigNielsen Sim. No entanto, um número inteiro que preencheria até um megabyte de memória seria 2 ^ (2 ^ 20), ou em torno de 6,7 * 10 ^ 315652. Até um gigabyte de memória e o número se tornaria 2 ^ (2 ^ 30), um monstro com quase meio bilhão de dígitos. Tenho certeza de que, se tentássemos imprimir a série, a morte por calor do universo nos atingiria antes que a memória acabasse. E falha no disco rígido muito antes disso.
Shion

5
Nos comentários abaixo do OP, é mencionado que 'infinito até o computador travar' também conta.
11684

19

Marbelous 4

24MB

Marbelous surpreendentemente se sai bem aqui. Isso publicará uma quantidade infinita de cifrões $, embora atinja o limite da pilha rapidamente.

Como funciona.

24 é uma linguagem literal, que cairá do quadro e será impressa em STDOUT como seu caractere ascii correspondente. MB é o nome implicitamente dado à placa principal, uma vez que a placa principal não tem nenhuma entrada, ela acionará todos os ticks. E como as células são avaliadas da esquerda para a direita, o literal sempre será impresso antes da próxima chamada recursiva.

Portanto, isso é equivalente a este pseudocódigo:

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

Uma solução sem recursão infinita 11

24@0
@0/\..

Este funciona rodando o literal entre dois portais @0, sempre que o 24 atinge o mais baixo, @0ele é transportado para a célula abaixo do superior @0. Nas terras do /\, que é um operador de clone, coloca uma cópia do mármore (literal) à sua esquerda (de volta ao portal) e outra à sua direita. Essa cópia copiada então cai fora do quadro (já que ..é uma célula vazia) e é impressa em STDOUT. No pseudocódigo, isso seria traduzido para:

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

Uma solução mais curta sem recursão infinita 9

24
\\/\..

Este constantemente joga o mármore entre um clonador e um defletor, colocando uma cópia na célula mais à direita, para ser jogada fora do tabuleiro. No pseudocódigo, seria algo como:

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

Nota

As ..células são necessárias nas duas últimas placas, uma vez que os mármores cairiam da placa (e seriam descartados) caso contrário. Para uma diversão extra, você substitui o 24mármore por FFe a ..célula vazia por a ??, que transforma qualquer mármore em mármore entre 0 e seu valor atual antes de soltá-lo. Adivinhe como isso seria no STDOUT.


faça seu "/ \ / \" "\\ / \" para evitar a produção de mármore extra na borda esquerda? melhoria puramente estética.
Sparr

@ Parr, ponto tomado, eu editei o post.
overactor

5
Esta solução não deve ter 25165824 bytes (24 MB)? ; P
HyperNeutrino

18

C, 23 caracteres

Um pouco mais curto que a melhor resposta C / C ++ até agora. Imprime linhas vazias infinitamente (mas, se compiladas sem otimizações, sobrecarrega a pilha).

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

1
22 caracteres: putc(0)(ou 1, ou 2, ... ou 9). Isso funcionaria?
CompuChip

@CompuChip, putcrequer 2 parâmetros.
ugoren

10
@ tdbot, observe que esta é a resposta aceita. Agradeço o elogio, mas não consigo entender o porquê. Existe uma resposta
ugoren

@ tbodt, não tdbot. ftfy
nyuszika7h

5
@ nyuszika7h, Desta forma, eu poderia mostrar o quão modesto eu sou, mantendo a repetição de 15.
Ugoren

14

Python 3: 15, 17 ou 18 caracteres

A resposta de mdeitrick é mais longa no Python 3, que substitui a printinstrução por uma chamada de função (15 caracteres):

while 1:print()

Este ainda é o mais curto que encontrei no Python 3. No entanto, existem algumas maneiras mais interessantes de imprimir em um loop infinito que têm apenas alguns caracteres a mais.

  • print()retorna None, que! = 9, tornando-o um loop infinito; o 8é um no-op que substitui pass(18 caracteres):

    while print()!=9:8
    
  • iter(print, 9)define um iterável que retorna a saída print()até que seja igual 9(o que nunca acontece). anyconsome a entrada iterável procurando um valor verdadeiro, que nunca chega, pois print()sempre retorna None. (Você também pode usar seto mesmo efeito.)

    any(iter(print,9))
    
  • Ou, podemos consumir o iterável testando se ele contém 8(17 caracteres):

    8in iter(print,9)
    
  • Ou descompacte-o usando o operador splat :

    *_,=iter(print,9)
    
  • A maneira mais estranha que pensei é usar a desestruturação de splat dentro de uma chamada de função function(*iterable),. Parece que o Python tenta consumir todo o iterável antes mesmo de tentar a chamada de função - mesmo que a chamada de função seja falsa. Isso significa que nem precisamos de uma função real, porque o erro de tipo só será gerado depois que o iterável estiver esgotado (ou seja, nunca):

    8(*iter(print,9))
    

*iter(print,1),funciona e possui apenas 15 caracteres, mas consome bastante memória.
ivzem


14

x86 .COM Executável, 5 bytes

saída de conjunto de caracteres ASCII sem fim

em hexadecimal:

40 CD 29 FF E6

em asm:

inc ax
int 0x29
jmp si

Explicação:

inc axincrementa o registro AX em um. int 0x29é a rotina "fast put char" do MSDOS, que simplesmente gera o valor em AL (a parte baixa do AX) e avança o cursor em um. jmp sié apenas uma maneira estranha de voltar ao topo, já que o registro SI é 0x100 em quase todos os sistemas operacionais semelhantes ao DOS, que também é onde um programa .com é iniciado;) Também é possível fazer um salto curto, o que também usa 2 bytes.

Fontes:

Valores Iniciais do MSDOS

Sizecoding WIKI


13

Bitxtreme , 0,25 bytes

Representação binária:

00

A partir da documentação:

O primeiro bit de cada par é um ponteiro para a posição de memória que mantém o valor a subtrair do acumulador. O resultado é armazenado na mesma posição de memória apontada pelo operando. Se o resultado for negativo (os bits estão na representação do complemento de dois), o segundo bit do par será adicionado ao PC atual, módulo 2.

O contador de programa e o acumulador são inicializados em zero; então, o conteúdo do local da memória 0 é subtraído do acumulador. Isso passa a ser 0, deixando o acumulador em zero. Como não houve transporte, o segundo bit não é adicionado ao contador do programa.

O contador de programa é então incrementado em 2 módulos 2, enviando-o de volta ao início e causando um loop infinito. Em cada etapa, o local especial da memória 0 é modificado, fazendo com que seu conteúdo (a 0) seja gravado na saída.

Pode-se argumentar que esse programa deve ser pontuado como 1 byte, porque o intérprete oficial do Python exige preenchimento zero. No entanto, não acho que o preenchimento zero seja realmente um código .


12

Resumo: Ruby - 9, Golfscript - 6,> <> - 2, Espaço em branco - 19, Perl - 2

Um idioma que eu conheço e dois que nunca usei antes: D
EDIT: Perl, um não funcionou quando instalei o Perl para experimentá-lo :(

Ruby, 9

loop{p 1}

Simplesmente imprime 1 em linhas separadas continuamente.

Além disso, várias alternativas:

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

Solução de 10 caracteres:

p 1while 1

Fiquei realmente surpreso por poder remover o espaço entre o primeiro 1e o while, mas aparentemente funciona

Golfscript, 6

{1p}do

Meu primeiro programa Golfscript! : P

> <> ( Peixe ), 2

1n

Espaço em branco , 19

lssslssstltlsslslsl

Onde srepresenta um espaço, trepresenta uma guia e lum avanço de linha.


11
Toda vez que alguém digita as palavras "Eu não tenho Perl", Deus mata um gatinho.
Primo

2
@primo: P Bem, pelo menos agora eu faço.
Maçaneta

2
Isso é código de golfe. Crie uma resposta por envio.
JB

21
@primo Bom, eu odeio gatos. E eu não tenho Perl.
SQB 15/01

5
O programa GS {1p}doapenas imprime 1e sai, porque o do é uma sequência de exec-pop-test que continua apenas se for verdadeira. (Como não há entrada, a pilha é inicialmente "", que, após a execução de 1p, é exibida e testa falso.) Apenas adicionar um dup funcionará, por exemplo, {1.p}do(a 7 bytes).
res

12

C, 25 24

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

4
s/while/main/
ugoren

2
Não tenho certeza de que haja uma exceção de stackoverflow em C, mas algo de ruim acontecerá quando a memória ficar sem memória.
Ilya Gazman 11/11

9
Otimização do tailcall ftw.
Johannes Kuhn

4
@JohannesKuhn: não é uma chamada de cauda. Se tivesse sido return main(puts("1")), havia sido uma chamada de emergência.
marinus

4
@psgivens. Na função ca sem nenhum parâmetro, é possível ter qualquer quantidade de parâmetros. Somente uma assinatura methodName(void)aceita exatamente zero parâmetros.
James Webster

12

> <> (Peixe) , 2

Uma maneira criativa de usar a infinita caixa de códigos de peixes:

"o

Como o ponteiro de instruções retorna ao início da linha após atingir o final, esse código pode ser essencialmente lido como

"o"o

o que significa 'leia a string "o" e depois a produza'.

Você pode testar o código aqui


11

perl, 10 caracteres

Aqui está outra solução de 10 char perl com algumas vantagens diferentes. Especificamente, ele não requer o sinalizador -n ou a entrada do usuário para iniciar. No entanto, ele continua comendo memória ad infinitum.

warn;do$0

salve em um arquivo, execute esse arquivo e você obtém, por exemplo:

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.

Você não poderia reduzir esse uso say(que sempre imprime uma nova linha, mesmo que não consiga encontrar um argumento de qualquer lugar) warn? (Isso requer a seleção de uma variante Perl moderno usando -M5.010, mas que não contam contra a sua contagem de caracteres.)

10

dc , 7

[pdx]dx

imprime 'pdx \ n' infinitamente várias vezes.


10

VBA: 12

O áudio é emitido, certo?

do:beep:loop

Coloque isso no arquivo MS office habilitado para macro favorito do seu colega de trabalho 'favorito' para se divertir!

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

Pontos de bônus se eles estiverem usando fones de ouvido.


Dang, eu estava olhando as respostas para ver se alguém já havia pensado em imprimir o sino. 1
mbomb007

9

Semente , 4 bytes

99 5

Experimente online! Saídas 11infinitamente

Gera o seguinte programa 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
/

Experimente online!


A parte relevante é exatamente isso:

[>1'.b
/

bempurra 11para a pilha e a .imprime. 1e 49também são enviados para a pilha, mas nunca são impressos.

Animação do código em execução:

insira a descrição da imagem aqui


1
Isso acabará por ficar sem memória se os valores forem continuamente enviados para a pilha sem serem exibidos?
caird coinheringaahing

8

C, 26 25 24 (sem recursão)

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

Imprime '\n'caracteres sem fim . Esse é um byte mais longo que a resposta C mais curta, mas não depende da otimização da chamada de cauda para evitar o transbordamento da pilha.


2
Você pode raspar um personagem usando for(;;)no lugar dewhile(!
Alex Gittemeier

1
não !como ele continua produzindo\n
l4m2

7

R, 13 caracteres

repeat cat(1)

repeat cat(1)deve trabalhar
Dason

@ Jason você está certo. Não faço ideia por que insisto em colocá-los sempre.
plannapus

7

PowerShell 2.0: 17 11 8

Minha solução inicial:

while(1 -eq 1){1}

Graças a res:

while(1){1}

Acho que Danko Durbić tem o vencedor aqui. Não sei ao certo por que isso deve funcionar, mas funciona e não consigo pensar em nada mais curto até agora.

for(){1}

1
Tente while(1){1}.
res

@res Eu ia cortá-lo em dois com, while($true){1}mas sua solução definitivamente vence - eu esqueci isso no PowerShell $true -eq 1. Poste isso como resposta e eu vou lhe dar um voto.
Iszi

Sinta-se à vontade para editá-lo no seu, se quiser.
res

6
Tente for(){1}.
Danko Durbić 14/11

@ DankoDurbić Você pode explicar por que isso funciona? Eu não entendo direito. Parece que deveria me enganar.
Iszi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.