Um Quine em cada linha


30

Seu objetivo é criar um programa que se imprima indefinidamente, com uma nova linha após cada um. Portanto, se o seu programa for de uma linha, ele será repetido em todas as linhas da saída.

Exemplo

Programa:

A

Saída:

A
A
A
...

Regras

  • Ele deve ser um programa completo, não um trecho ou função.
  • O programa deve executar um loop para sempre, sem erros de limite de recursão ou excesso de pilha.
  • A saída é stdout ou a alternativa mais próxima.
  • Nenhuma entrada de programa é aceita.
  • As brechas padrão não são permitidas, como abrir o arquivo do programa ou acessar um recurso externo. Programas vazios não são permitidos como brechas padrão.
  • Se o código do seu programa terminar com uma nova linha à direita, isso não conta como a nova linha necessária entre as linhas e você deve imprimir outra.
  • - O código mais curto vence!

O título parece que apenas programas de uma linha se qualificam?
— Paŭlo Ebermann

@ PaŭloEbermann Leia a descrição do problema. É um título espirituoso porque rima. Aqui está um exemplo de um programa válido de várias linhas: codegolf.stackexchange.com/a/57985/34718 . Você não pode esperar saber tudo sobre um desafio apenas lendo o título.
— mbomb007

@ PaŭloEbermann É só while(1)println(your_code);
— Matthew Roh

Respostas:


19

Fissão, 7 bytes

'!+!NR"

Uma modificação bastante simples do quine de Fissão mais curto que encontrei até agora : estou simplesmente usando o não destrutivo em !vez de Oe adicionei um Npara nova linha.

Então, em suma, eis como funciona: o fluxo de controle começa no Rátomo certo. "alterna o modo de sequência, o que significa tudo até a próxima "impressão: neste caso '!+!NR. Isso deixa a "nova linha a ser impressa. '!define a massa do átomo em 33, a +incrementa em 34 (o código de caractere de ") e !imprime a citação. Nimprime uma nova linha e Ragora não funciona nesse caso, para que o loop recomeça.

A seguinte solução de 7 bytes também funciona:

"NR'!+!

9

> <> , 16 bytes

'ard3*o50l2)?.~~

A quina tradicional> <> usa muitos o s, então usamos um loop para impressão. Antes de cada salto, pressionamos 5 e 0 (as coordenadas de onde pular), após o qual pulamos .se ainda houver algo para imprimir ou exibimos os dois principais valores ~~.

(Revertida para a versão 16 desde que me esqueci da regra de estouro de pilha.)


Uma alternativa é "ar00go50l2)?.[, certo?
— mbomb007

3
@ mbomb007 eu acho, mas eu prefiro d3*uma vez glê o seu próprio código fonte
— SP3000

8

CJam, 13 bytes

{_o"_g
"o1}_g

O intérprete online não imprime nada antes que o programa termine, portanto, você precisará testá-lo no interpretador Java.

Explicação

Finalmente, uma solução CJam generalizada que não termina em _~.

{_o"_g
"o1}

Isso simplesmente empurra um bloco. _gduplica o bloco e o executa repetidamente enquanto a parte superior da pilha é verdadeira (descartando a condição).

Agora dentro do bloco, a outra cópia do bloco ainda está na pilha. Nós o duplicamos e imprimimos com _oe, em seguida, imprimimos _gseguidos por uma nova linha (a nova linha extra necessária entre linhas) com "_g\n"o. Finalmente, pressionamos um 1na pilha para que o loop se repita, porque, infelizmente, os blocos não são verdadeiros (ou falsos) no CJam.


7

Python 2, 39

Não é uma tarefa muito interessante em Python, pois é trivial adicionar o loop while a um quine normal.

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

Isso não estraga a pilha?
— Jesan Fafon

1
@JesanFafon Não, se você tentasse, veria que não. Não há recursão.
— feersum

6

Perl 5.10+, 40 37 bytes

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

ou (também 37 bytes)

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

Chame com o sinalizador de linha de comando -M5.010ou -E, por exemplo

$ 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
...

Agradeço a Ilmari Karonen por remover 3 bytes da minha solução original, que foi:

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

Isso, bem como as soluções mais curtas de 37 bytes acima, são todas variações simples do seguinte quine, que eu vi pela primeira vez em uma das outras postagens de Ilmari :

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

Como tudo o que adicionei na minha solução original foi um whileloop, ele realmente merece a maior parte do crédito. :-)


Bom, e obrigado pelo crédito. :-) O quine original é o meu próprio design, embora outra pessoa possa tê-lo descoberto independentemente anteriormente. Entre, $_=q{say"\$_=q{$_};eval"while 1};evalou $_=q{{say"\$_=q{$_};eval";redo}};evalseria alguns bytes mais curto. ( $_=q{say"\$_=q{$_};eval";eval};evalSeria ainda mais curto ainda, mas eu suspeito que irá , eventualmente, ficar sem pilha.)
— Ilmari Karonen

Eu estava esperando que você aparecesse! Obrigado pelas soluções mais curtas, achei que você sugeriria algo melhor; mas fiquei tão impressionado com isso quando o vi na resposta a que vinculei, apenas tive que tentar. :) Para ser sincero, ainda não entendi muito bem a questão, mas as respostas adicionais me dão mais a ver. Eu não tinha certeza se você o originou, porque eu o vi creditado com o menor Perl quine de menor trapaça de todos os tempos (?!) nesta página , mas não há atribuição para esse quine (usando em printvez de say).
— precisa saber é o seguinte

btw, o último realmente falha após um certo tempo. Mais uma vez obrigado, @Ilmari!
— precisa saber é o seguinte

Na verdade, eu recordo um pouco - definitivamente não sou o primeiro a inventar esse quine , e desde que eu definitivamente o tinha visto antes (eu publiquei o que eu reivindico algum crédito no mesmo segmento), é bem provável que eu me lembrava subconscientemente desse tópico ou de outro lugar.
— Ilmari Karonen 15/09/2015

Tudo bem, deixei a origem não especificada. Independentemente disso, obrigado pelos 3 bytes e pela inspiração original.
— precisa saber é o seguinte

5

Brainf com modificação automática *** (SMBF) , 14 bytes

A nova linha \nà direita precisa ser uma linha literal, Unix, (código ASCII 10).

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

Explicação:

O código move o ponteiro para a extrema esquerda do seu código-fonte e depois imprime tudo, incluindo a nova linha (duas vezes b / c da regra). O loop continua.


Quer dizer, tem que ser \r?
— Ismael Miguel

O @IsmaelMiguel No. \né uma nova linha e é o código ASCII 10, portanto, um dump hexadecimal do código-fonte teria o valor 0Adesse byte. code.cside.com/3rdpage/us/newLine.html
— mbomb007

1
@IsmaelMiguel Não é verdade. Ao digitar o código, você realmente pressiona a tecla Enter para uma nova linha. \ngeralmente conta como 2 caracteres e 2 bytes no seu código. Digitei dessa maneira para facilitar a leitura, pois a formatação não funciona bem para mostrar uma linha em branco no final do meu código-fonte. E então eu tive que especificar que era um byte, não dois.
— mbomb007

2
\né sempre um único caractere, chamado avanço de linha . Uma nova linha , no entanto, é uma sequência de bytes dependente da plataforma.
— Dennis

2
@ Dennis Talvez sim, mas eu não ligo. Não chamo de /"Solidus" e não conheço ninguém que o faça. "Newline" começa com um n, e esse é o caractere de escape, e é assim que eu o chamo. Está mais perto de "avanço de linha" do que de "retorno de carro".
— mbomb007

3

PowerShell, 143 bytes

$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)}

Baseado no quine do Rosetta Code PowerShell , estou bastante confiante de que esse não é o mais curto possível. A formatação de substituição de cadeia de caracteres no PowerShell é difícil para isso, porque os mesmos delimitadores para onde colocar as substituições {}também delimitam blocos de código while{}, por isso temos que usar a [char]conversão, que incha o código bastante.


3

Carga insuficiente, 25 bytes

Primeira vez que tentei algo assim e não tenho certeza se segue todas as regras, pois são algumas linhas. A nova linha foi um pouco dolorosa.

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

1
@ mbomb007 A saída por iteração são as duas linhas do programa. Eu testei aqui
— MickyT

3

Befunge , 30 20 bytes

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

Uma variação de um quine befunge popular que imprime uma nova linha e aparece -1 na pilha se terminar a linha.
Infelizmente, o Befunge fica detalhado ao fazer as coisas em uma linha. Tentei remover todas as barras de ativação ( #) que pude, mas algumas tiveram que ser deixadas para pular determinados comandos (como ,).

Alterar:

30-20 -> alterou o quine base para um personalizado que fiz que usa entrada de string. Dessa forma, a ramificação é muito mais fácil.

Velho:

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

Não acho que isso seja ideal, mas é aceitável por enquanto.


Você pode usar uma instrução get para obter um espaço e adicionar 2 a ele por um byte menor que 98+2/: <, + 55, + 2g1_ #!, #: <"
— MildlyMilquetoast

E empurre a citação e nova linha primeiro e reverter a impressora,-1g0:+5<>:#,_1"
— Jo rei


2

R, 34 bytes

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

para chamar a partir da linha de comando da seguinte maneira:

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

2

> <>, 31 29 bytes

Uma simples modificação da tradicional > <> quine .

"ar00gc0.0+efooooooooooooooo|

Para executar, cole-o aqui , clique em 'Enviar' e depois em 'Iniciar' (a execução sem animação não funciona). Sinta-se livre para aumentar a velocidade de execução.


"ar00gc0.0+feooooooooooooooo|é dois bytes mais curto.
— Cole

@ Obrigado Obrigado. Eu tinha pensado no espelho, mas esqueci de mudar depois de me desviar de um desafio diferente.
— mbomb007


@JoKing Já existe uma solução > <> mais curta .
— mbomb007 15/04


2

GolfScript, 16 bytes

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

Isso acabou parecendo muito com a entrada de Martin Büttner no CJam . Uma característica interessante é que, como se vê, a maneira mais curta de anexar ".do"ao bloco quando impresso é atribuí-lo ao terminador de linha n. (Obviamente, também precisamos incluir uma nova linha real na string, para substituir a que nnormalmente contém.) A mesma string (sendo verdadeira no GolfScript) também é deixada na pilha para que o doloop saia, garantindo que o loop corre para sempre.


1

BASH, 76 bytes

Não pude resistir, especialmente com o PowerShell aqui :)

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

O espaço em branco é importante para uma cópia EXATA.


1

Javascript (ES6), 64

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

Alternativamente (também 64)

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

A alternativa não causaria um estouro de pilha?
— Patrick Roberts

Não. Não há recursão, portanto, nada deve estar somando na pilha.
— DankMemes

Ok, acabei de testar os dois, você está correto sobre a solução alternativa, mas sua primeira solução falha e eu descobri o porquê. De acordo com a documentação do MDN sobre as funções de seta , "As funções de seta não expõem um objeto de argumentos ao código", portanto, a sua arguments.calleenão existe e gera um erro.
— Patrick Roberts

Interessante. Para mim, no Firefox Developer Edition 42.0a2 (13-09-2015), ambos funcionam. Acho que uma vez que o padrão seja totalmente adotado, o primeiro deixará de funcionar.
— DankMemes

Testei-os no Chrome mais recente desde que estava tentando jogar sua primeira solução em !vez de colocar parênteses e colocar a execução da função após o loop for para evitar a necessidade do corpo de ponto e vírgula for loop que salvaria (eu acho) 4 bytes
— Patrick Roberts

1

Microscript , 22 bytes

"f1{CqxCanx"f1{CqxCanx

Com base na Quine do artigo Esolangs: "fCqxah"fCqxah. Explora o fato de que o idioma anexa automaticamente chaves de fechamento conforme necessário, sem o qual seriam dois bytes mais longos.


1

Lote, 10 (+ 4 para o tamanho do nome do arquivo)

Não tenho certeza se isso está qualificado por dois motivos:

  • Tecnicamente, pode haver ou não efeitos colaterais de texto no shell de comando do Windows, pois isso depende de como está configurado.
  • Este programa se chama pelo nome e não tenho certeza se isso é proibido pelas regras (especificamente a regra "sem abertura do arquivo de programa"). Não está se abrindo para fins de leitura e impressão do texto; está simplesmente se re-executando. Além disso, a estrutura do sistema de arquivos é parte integrante dos scripts em lote da velha escola (muitas vezes sendo usados ​​para armazenar o estado do programa etc.). Como tal, não tenho certeza se isso viola a 5ª regra ou não.

O código (para um programa chamado q.bat):

echo on&&q

2
Entendo que vou permitir, já que não é o mais curto, e é criativo e único. E não estava lendo o código fonte, mas executando-se.
— mbomb007

1
Como o nome do arquivo não é arbitrário, você deve adicionar pelo menos o nome do arquivo à contagem de bytes.
— Martin Ender

1
Eu acredito que você poderia usar, echo on&&%0embora eu tenha medo de tentar.
— DankMemes

1
Atualização: echo on&&%0não funciona. %0é exibido como expandido na saída e o Windows (7, 32 bits, executando em uma VM) finaliza tudo rapidamente.
— DankMemes 12/09

1
Eu acho que você pode omitir a .batparte
— SuperJedi224 15/09/2015

1

Ceilão , 210 208 bytes

Claro que isso não vai ganhar nada ...

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);}}

Original:

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);}}

Eu modifiquei meu Quine de dois dias atrás , adicionando o while(true){...}loop, então venho dos 185 bytes do Quine simples para 210 (não preciso mais do caractere de nova linha à direita). Mas então eu descobri que umwhile(1<2){...} loop é até dois bytes mais curto:

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);}}

(O Ceilão não possui for(;;)loop como Java, e as chaves também são necessárias para esse loop.)


1

PowerShell, 132 107 bytes

$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}

Baseado no Rosetta Quine (o mesmo que @AdmBorkBork), embora não use a formatação para substituir a string ... talvez seja melhor alternar para um loop for e usar a formatação?

Tenho certeza que se o AdmBorkBork voltar, eles vencerão muito: P

EDITAR Descobri o loop for e substituições, tudo graças ao meu antecessor :)

Antiga tentativa:

$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 bytes

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));}}

Explicação:

Experimente online (o tempo limite termina após 60 s).

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:

  • A String scontém o código fonte não formatado.
  • %sé usado para inserir esta String em si mesma com o s.format(...).
  • %c, %1$cE o34 são usados para formatar as aspas.
  • s.format(s,34,s) coloca tudo junto

Parte do desafio:

  • for(;;) é usado para fazer um loop indefinidamente.
  • System.out.println(...) é usado para imprimir com nova linha à direita





1

Braquilog , 16 bytes

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

Você não pode experimentá-lo online , mas verifiquei que ele funciona na minha instalação.

Braquilog , 18 bytes

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

Experimente online!

Adaptado da versão alternativa deste quine , com um hack de backtracking que eu havia inventado inicialmente para um bogoort de todas as coisas. Gasta dois bytes ~nporque ẉ(o meio usual de impressão com uma nova linha à direita) atinge alguns problemas estranhos com a codificação de caracteres no TIO, e uma nova linha real inserida na string literal é impressa ~kcomo \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.

Como w₁recebe a entrada como uma lista [string to be formatted, formatting arguments], agrupar uma sequência em uma lista ge concatená-la consigo mesma jpermite que ela seja formatada consigo mesma. E como nenhuma entrada é fornecida ao programa, a variável de entrada que está implicitamente presente no início do programa pode assumir qualquer valor, portanto, pode ser restringida a uma das infinitas listas que contêm "∋~kgjw₁⊥~n"como elemento, criando uma única ponto de escolha a ser retornado para quando, após imprimir sua fonte, o programa for acessado ⊥.


1

Python 3.6, 48 43 bytes.

-5 bytes graças a @Jo King

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

Você pode usar %rpara economizar em escapar desses '. 43 bytes
— Jo King

que dá 41 para python 3.8: P
— somente ASCII

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.