Una línea en cada línea

30

Su objetivo es crear un programa que se imprima indefinidamente, con una nueva línea después de cada uno. Por lo tanto, si su programa es de una sola línea, se repetirá en cada línea de la salida.

Ejemplo

Programa:

A

Salida:

A
A
A
...

Reglas

  • Debe ser un programa completo, no un fragmento o función.
  • El programa debería repetirse para siempre sin desbordamiento de pila o errores de límite de recursión.
  • La salida es stdout o la alternativa más cercana.
  • No se acepta entrada de programa.
  • Las lagunas estándar no están permitidas, como abrir el archivo del programa o acceder a un recurso externo. Los programas vacíos no están permitidos como un vacío legal estándar.
  • Si el código de su programa termina con una nueva línea final, esto no cuenta como la nueva línea necesaria entre las líneas, y debe imprimir otra.
  • - ¡El código más corto gana!
mbomb007
fuente
¿El título parece que solo califican los programas de una línea?
Paŭlo Ebermann
@ PaŭloEbermann Luego lea la descripción del problema. Es un título ingenioso porque rima. Aquí hay un ejemplo de un programa válido de varias líneas: codegolf.stackexchange.com/a/57985/34718 . No puedes esperar saber todo sobre un desafío solo leyendo el título.
mbomb007
@ PaŭloEbermann Es justo while(1)println(your_code);
Matthew Roh

Respuestas:

19

Fisión, 7 bytes

'!+!NR"

Una modificación bastante simple de la quine de fisión más corta que he encontrado hasta ahora : simplemente estoy usando la no destructiva en !lugar de Oy agregué una Npara nueva línea.

En resumen, así es como funciona: el flujo de control comienza en el Rcon un átomo a la derecha. "alterna el modo de cadena, lo que significa todo hasta que "se imprima el siguiente : en este caso '!+!NR. Eso deja la "y la nueva línea para imprimir. '!establece la masa del átomo en 33, la +incrementa a 34 (el código de caracteres de ") e !imprime la cita. Nimprime una nueva línea y Rahora no funciona en este caso, por lo que el ciclo comienza de nuevo.

La siguiente solución de 7 bytes también funciona:

"NR'!+!
Martin Ender
fuente
9

> <> , 16 bytes

'ard3*o50l2)?.~~

La tradicional> <> quine usa demasiados os, así que usamos un bucle para imprimir. Antes de cada salto, presionamos 5 y 0 (las coordenadas de hacia dónde saltar), después de lo cual saltamos .si todavía hay algo para imprimir o aparecen los dos valores superiores ~~.

(Volví a la versión 16 ya que olvidé la regla de desbordamiento de pila).

Sp3000
fuente
Una alternativa es "ar00go50l2)?.[, ¿verdad?
mbomb007
3
@ mbomb007 Supongo, pero prefiero d3*ya que glee su propio código fuente
Sp3000
8

CJam, 13 bytes

{_o"_g
"o1}_g

El intérprete en línea no imprime nada antes de que finalice el programa, por lo que tendrá que probar esto en el intérprete de Java.

Explicación

Finalmente, una quine CJam generalizada que no termina en _~.

{_o"_g
"o1}

Esto simplemente empuja un bloque. _gduplica el bloque y lo ejecuta repetidamente mientras la parte superior de la pila es verdadera (descartando la condición).

Ahora dentro del bloque, la otra copia del bloque todavía está en la pila. Lo duplicamos e imprimimos con _oy luego imprimimos _gseguido de una nueva línea (la nueva línea adicional requerida entre las líneas) con "_g\n"o. Finalmente, empujamos a 1a la pila para que se repita el ciclo, porque desafortunadamente, los bloques no son verdaderos (o falsos) en CJam.

Martin Ender
fuente
7

Pitón 2, 39

No es una tarea muy interesante en Python, ya que es trivial agregar el ciclo while a una quine normal.

c='while 2:print"c=%r;exec c"%c';exec c
Feersum
fuente
¿No explota esto la pila?
Jesan Fafon
1
@JesanFafon No, si lo intentaras verías que no. No hay recursividad.
feersum
6

Perl 5.10+, 40 37 bytes

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

o (también 37 bytes)

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

Invocar con el indicador de línea de comando -M5.010o -E, por ejemplo

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

Gracias a Ilmari Karonen por eliminar 3 bytes de mi solución original, que fue:

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

Esto, así como las soluciones más cortas de 37 bytes anteriores, son variaciones simples de la siguiente frase, que vi por primera vez en una de las otras publicaciones de Ilmari :

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

Como todo lo que agregué en mi solución original fue un whilebucle, realmente merece la mayor parte del crédito. :-)

ThisSuitIsBlackNot
fuente
Agradable, y gracias por el crédito. :-) El quine original es mi propio diseño, aunque es posible que alguien más lo haya descubierto de forma independiente antes. Por cierto, $_=q{say"\$_=q{$_};eval"while 1};evalo $_=q{{say"\$_=q{$_};eval";redo}};evalsería unos pocos bytes más cortos. ( $_=q{say"\$_=q{$_};eval";eval};evalsería aún más corto aún, pero sospecho que eventualmente se quedará sin pila).
Ilmari Karonen
¡Esperaba que aparecieras! Gracias por las soluciones más cortas, pensé que llegarías a algo mejor; pero esto me impresionó mucho cuando lo vi en la respuesta a la que me uní, solo tuve que intentarlo yo mismo. :) Para ser honesto, todavía no he entendido bien quines, pero las respuestas adicionales me dan más para mirar. No estaba seguro de si originaste esto porque te vi acreditado con la quine Perl más corta y no engañosa jamás (?!) en esta página , pero no hay atribución para esta quine (usando en printlugar de say).
ThisSuitIsBlackNot
por cierto, el último realmente segfault después de correr por un tiempo. Gracias de nuevo, @Ilmari!
ThisSuitIsBlackNot
En realidad, lo retiro un poco: definitivamente no soy el primero en inventar esa quine , y dado que definitivamente la había visto antes (publiqué la que sí reclamo en el mismo hilo), es muy probable que inconscientemente lo recordaba de ese hilo, o de otro lugar.
Ilmari Karonen
Muy bien, he dejado el origen sin especificar. De todos modos, gracias por los 3 bytes y gracias por la inspiración original.
ThisSuitIsBlackNot
5

Brainf *** auto modificable (SMBF) , 14 bytes

La nueva línea final \ndebe ser una nueva línea literal, Unix, (código ASCII 10).

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

Explicación:

El código mueve el puntero al extremo izquierdo de su código fuente, luego lo imprime todo, incluida la nueva línea (dos veces b / c de la regla). El ciclo continúa.

mbomb007
fuente
¿Quieres decir que tiene que ser \r?
Ismael Miguel
@IsmaelMiguel No. \nes una nueva línea y es el código ASCII 10, por lo que un volcado hexadecimal del código fuente tendría el valor 0Apara ese byte. code.cside.com/3rdpage/us/newLine.html
mbomb007
1
@IsmaelMiguel No es cierto. Cuando escribe código, en realidad presiona la tecla Intro para una nueva línea. \ngeneralmente cuenta como 2 caracteres y 2 bytes en su código. Lo escribí de esta manera para facilitar la lectura, ya que el formato no funciona bien para mostrar una línea en blanco al final de mi código fuente. Y entonces tuve que especificar que era UN byte, no dos.
mbomb007
2
\nsiempre es un solo carácter, llamado salto de línea . Un salto de línea , sin embargo, es una secuencia dependiente de la plataforma de bytes.
Dennis
2
@ Dennis Quizás, pero no me importa. No llamo /un "Solidus", y no conozco a nadie que lo haga. "Newline" comienza con un n, y ese es el carácter de escape, así que así lo llamo. Está más cerca del "avance de línea" que del "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)}

Basado del Código Rosetta PowerShell Quine , estoy bastante seguro de que este no es el más corto posible. El formato de reemplazo de cadenas en PowerShell es difícil para esto, porque los mismos delimitadores para dónde colocar los reemplazos {}también delimitan los bloques de código while{}, por lo que tenemos que usar la [char]conversión, que hincha el código un montón.

AdmBorkBork
fuente
3

Baja carga, 25 bytes

La primera vez que probé algo como esto y no estoy seguro si sigue todas las reglas, ya que se trata de un par de líneas. La nueva línea fue un poco dolorosa.

(::a~*S:a~*^
)::a~*S:a~*^
MickyT
fuente
1
@ mbomb007 La salida por iteración son las dos líneas del programa. Lo probé aquí
MickyT
3

Befunge , 30 20 bytes

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

Una variación de una popular quine befunge que imprime una nueva línea y aparece -1 en la pila si termina la línea.
Desafortunadamente, Befunge se vuelve detallado cuando hace cosas en una línea. Traté de eliminar todos los launchpads ( #) que pude, pero tuve que dejar algunos para omitir ciertos comandos (como ,).

Cambios:

30-20 -> cambié la base quine a una personalizada que hice que usa la entrada de cadena. De esta manera, la ramificación es mucho más fácil.

Antiguo:

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

No creo que esto sea óptimo, pero es aceptable por ahora.

Kevin W.
fuente
Puede usar una instrucción get para obtener un espacio y agregarle 2 por un byte más corto que 98+2/ : <, + 55, + 2g1_ #!, #: <"
MildlyMilquetoast
Y empuje la cita y la nueva línea primero e invierta la impresora,-1g0:+5<>:#,_1"
Jo King
2

K, 30 bytes

{f:$_f;{x}{`0:f,"[]\n";1}/1}[]
kirbyfan64sos
fuente
2

R, 34 bytes

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

invocar desde la línea de comando de la siguiente manera:

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

> <>, 31 29 bytes

Una simple modificación de la tradicional > <> quine .

"ar00gc0.0+efooooooooooooooo|

Para ejecutarlo, péguelo aquí , haga clic en 'Enviar', luego 'Iniciar' (ejecutar sin animación no funciona). Siéntase libre de aumentar la velocidad de ejecución.

mbomb007
fuente
"ar00gc0.0+feooooooooooooooo|es dos bytes más corto.
cole
@Cole Gracias. Había pensado en el espejo, pero olvidé cambiarlo después de ser desviado en un desafío diferente.
mbomb007
20 bytes
Jo King
@JoKing Ya hay una solución más corta> <> .
mbomb007
2

Python 2, 48 bytes

c='c=\'%s\';while 1:print c%c';while 1:print c%c
El inicializador
fuente
2

GolfScript, 16 bytes

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

Esto terminó pareciéndose mucho a la entrada de Martin Büttner en CJam . Una característica interesante es que, como resulta, la forma más corta de agregar ".do"al bloque cuando se imprime es asignarlo al terminador de línea n. (Por supuesto, también debemos incluir una nueva línea real en la cadena, para reemplazar la que nnormalmente contiene). La misma cadena (siendo sincera en GolfScript) también se deja en la pila para que el dobucle salte, asegurando que el bucle corre por siempre.

Ilmari Karonen
fuente
1

BASH, 76 bytes

Simplemente no pude resistirme, especialmente con PowerShell aquí :)

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

El espacio en blanco es importante para una copia EXACTA.

RK.
fuente
1

Javascript (ES6), 64

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

Alternativamente (también 64)

a="for(;;)console.log(`a=${JSON.stringify(a)};eval(a)`)";eval(a)
DankMemes
fuente
¿La alternativa no causaría un desbordamiento de pila?
Patrick Roberts el
No. No hay recursión, por lo que no debería acumularse nada en la pila.
DankMemes
Bien, bueno, acabo de probarlos a ambos, tienes razón acerca de la solución alternativa, pero tu primera solución falla y descubrí por qué. De acuerdo con la documentación de MDN sobre las funciones de flecha , "Las funciones de flecha no exponen un objeto de argumentos a su código", por lo que su arguments.calleeno existe y arroja un error.
Patrick Roberts el
Interesante. Para mí en Firefox Developer Edition 42.0a2 (2015-09-13), ambos funcionan. Supongo que una vez que el estándar sea completamente adoptado, el primero dejará de funcionar.
DankMemes
Los probé en el último Chrome ya que estaba tratando de desarrollar su primera solución en !lugar de encerrar los paréntesis y poner la ejecución de la función después del bucle for para evitar la necesidad del cuerpo de punto y coma del bucle que ahorraría (creo) 4 bytes
Patrick Roberts
1

Microscript , 22 bytes

"f1{CqxCanx"f1{CqxCanx

Sobre la base de la quine del artículo de Esolangs: "fCqxah"fCqxah. Explota el hecho de que el lenguaje aplica automáticamente llaves de cierre según sea necesario, sin lo cual esto sería dos bytes más largos.

SuperJedi224
fuente
1

Lote, 10 (+ 4 para la longitud del nombre del archivo)

No estoy seguro si esto califica por dos razones:

  • Técnicamente, puede haber o no efectos secundarios textuales del shell de comandos de Windows, ya que eso depende de cómo esté configurado.
  • Este programa se invoca por su nombre, y no estoy seguro de si eso está prohibido por las reglas (específicamente la regla de "no abrir el archivo de programa"). No se abre para leer e imprimir el texto; simplemente se está volviendo a ejecutar. Además, la estructura del sistema de archivos es una parte integral de las secuencias de comandos por lotes de la vieja escuela (a menudo incluso se usa para almacenar el estado del programa, etc.). Como tal, no estoy seguro de si esto viola la quinta regla o no.

El código (para un programa llamado q.bat):

echo on&&q
Ruslan
fuente
2
Entiendo que lo permitiré, ya que no es el más corto, y es creativo y único. Y no estaba leyendo el código fuente, sino ejecutándose a sí mismo.
mbomb007
1
Como el nombre del archivo no es arbitrario, al menos debe agregar el nombre del archivo al recuento de bytes.
Martin Ender
1
Creo que podría usarlo, echo on&&%0aunque me da miedo intentarlo.
DankMemes
1
Actualización: echo on&&%0no funciona. %0se muestra como expandido en la salida, y Windows (7, 32 bit, ejecutándose en una VM) termina todo el proceso bastante rápido.
DankMemes
1
Creo que puedes omitir la .batparte
SuperJedi224
1

Ceilán , 210 208 bytes

Por supuesto, esto no ganará 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);}}

Modifiqué mi Quine de hace dos días agregando el while(true){...}bucle, por lo que vengo de los 185 bytes del Quine simple a 210 (ya no necesito el nuevo carácter de línea final). Pero luego descubrí que un while(1<2){...}bucle es incluso dos bytes más corto:

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

(Ceilán no tiene un for(;;)bucle como Java, y las llaves también son necesarias para este bucle).

Paŭlo Ebermann
fuente
1

PowerShell, 132107 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}

Basado en Rosetta Quine (igual que @AdmBorkBork) aunque no utiliza el formato para el reemplazo de la cadena ... ¿tal vez cambiar a un bucle for y usar el formato sería lo mejor?

Estoy seguro de que si AdmBorkBork regresara, lo superarían mucho: P

EDITAR Descubrí el bucle for y los reemplazos, todo gracias a mi predecesor :)

Viejo intento:

$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)}
Sinusoide
fuente
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));}}

Explicación:

Pruébelo en línea (agota el tiempo de espera después de 60 segundos).

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

-parte:

  • La cuerda s contiene el código fuente sin formato.
  • %s se utiliza para ingresar esta cadena en sí misma con el s.format(...) .
  • %c, %1$cy 34se usan para formatear las comillas dobles.
  • s.format(s,34,s) lo pone todo junto

Parte del desafío:

  • for(;;) se usa para recorrer indefinidamente.
  • System.out.println(...) se utiliza para imprimir con una nueva línea al final
Kevin Cruijssen
fuente
1

Brachylog , 16 bytes

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

No puedes probarlo en línea , pero he verificado que funciona en mi instalación.

Brachylog , 18 bytes

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

Pruébalo en línea!

Adaptado de la versión alternativa de este quine , con un truco de retroceso que había ideado inicialmente para bogosort de todas las cosas. Gasta dos bytes ~nporque (el medio habitual para imprimir con una nueva línea final) tiene algunos problemas extraños con la codificación de caracteres en TIO, y una nueva línea real insertada en el literal de cadena se imprime ~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.

Dado que w₁toma la entrada como una lista [string to be formatted, formatting arguments], envolver una cadena en una lista y gluego concatenarla con ella misma jpermite formatearla consigo misma. Y dado que no se proporciona ninguna entrada al programa, la variable de entrada que está implícitamente presente al comienzo del programa puede tomar cualquier valor, por lo que puede restringirse a una de las infinitas listas que contienen "∋~kgjw₁⊥~n"como elemento, creando un solo punto de elección al que se debe realizar un seguimiento cuando, después de imprimir su origen, el programa llega .

Cadena no relacionada
fuente
1

Python 3.6, 48 43 bytes.

-5 bytes gracias a @Jo King

x='while 1:print("x=%r;exec(x)"%x)';exec(x)
Divy
fuente
Puede usar %rpara ahorrar al escapar de esos 's. 43 bytes
Jo King
que da 41 para python 3.8: P
solo ASCII