Ouroboros Quine de nivel n

11

Este quine ouroboros de 128 idiomas (un programa que emite un programa en otro idioma, que emite un programa en otro idioma más (125 idiomas después), que emite el programa original) es bastante impresionante. Pero desafortunadamente, tiene un número estático de iteraciones.

Escriba un programa que emite un programa (no necesariamente en otro idioma, pero puede serlo), que emite un programa, que emite un programa, etc., que después de n iteraciones, emite el programa original por primera vez (es decir, no intermedio el programa debería ser el mismo que el original, porque de lo contrario funcionaría una quine que ignora su entrada), donde n es un entero no negativo proporcionado como entrada. La entrada no puede ser solo un número en el código fuente original (por ejemplo, poner x = <the value of n>al inicio de su programa), debe ser uno de los siguientes:

  1. Pasado como argumento de línea de comando
  2. Leer de entrada estándar
  3. Se pasa como argumento a una función, que devuelve / emite el nuevo programa.

Para las etapas intermedias en el ouroboros, su programa puede ser un programa que funcione completamente o una función sin argumentos, que, cuando se llama, devolverá / generará el siguiente.

Es posible que no lea el archivo fuente en sí mismo, o que no use ningún quiltin incorporado (no creo que haya ninguno que haga esto, pero podría haberlo)

Para ser claros, si n = 0, el programa debería generar su propio código fuente.

Si n = 1, el programa debería generar un programa diferente, que genera el código fuente original.

Y así...

¡Pocos bytes ganan!

Editar:

Debería haber escrito "Para las etapas intermedias en los ouroboros, su programa puede ser un programa completamente funcional sin entrada , o una función sin argumentos". Si su programa genera el siguiente en la cadena, luego espera la entrada, está bien, pero su programa no debería necesitar el valor original de n.

Leo Tenenbaum
fuente
Relacionado , relacionado .
Kevin Cruijssen
¿Podemos 1 indexar n? Entonces n = 1 significa imprimir el código fuente, n = 2 significa imprimir el código que imprimirá el código fuente, etc.
Datos
1
¿Las versiones de iteración seguirán teniendo la entrada inicial? Entonces, digamos que mi primera entrada es 3, y ejecuto el programa que genera. ¿Seguirá habiendo una entrada 3 o ninguna entrada? Si no hay entrada, supongo que tenemos que manejar eso en caso de que getInput()se use algo así sin ninguna entrada proporcionada. ¿O podemos decir que ingrese algo aleatorio que no se usa para iteraciones posteriores, para evitar errores para el getInput()? ¿También es válida la respuesta actual de Python?
Kevin Cruijssen
Sospecho que lo que se nos pide que hagamos es, dado un número entero n, generar un programa que es el "programa inicial" de una quine de niteraciones ouroboros , y que nuestra respuesta no debe considerarse como una de las niteraciones. ¿Es esto correcto?
Erik the Outgolfer
@KevinCruijssen Probablemente debería haber sido más claro al respecto. Las etapas intermedias no pueden tener entrada de ninguna forma. Supongo que si el programa emite el siguiente y luego espera la entrada, estaría bien.
Leo Tenenbaum

Respuestas:

5

05AB1E , 28 bytes

-4 bytes + arreglo gracias a Kevin Cruijssen

"34çìD«s<©di®ì"34çìD«s<©di®ì

Pruébalo en línea!


Explicación

Esto funciona agregando el número restante para imprimir al frente del código, lo que significa que se agrega a la pila de la misma manera que lo haría una entrada. En el caso base de entrada de "0" no concatenará el 0 en el frente.

Datos caducados
fuente
des no negativo ( >=0) en lugar de positivo ( >0). El problema es que para verificar dsin reventarlo, primero debe duplicarlo, pero luego también debe descartarse en la iteración 0"quinsting", de lo contrario, generará el duplicado 0. :(
Kevin Cruijssen
"34çìD«s<©di®ì"34çìD«s<©di®ìpara 28 bytes tal vez (que todavía está bastante cerca de su enfoque previsto)? (Me temo que su versión actual para las 0"34çìD«s<Ddiì"34çìD«s<Ddiìsalidas de iteración -1del Duplicate ...)
Kevin Cruijssen
4

Encantamientos rúnicos , 39 bytes

"3X4+kSql1=c*?S:1-}C'LA-}!i:0)2*?~!'´@

Pruébalo en línea!

Sería 4 bytes más corto que 05AB1E usando la misma táctica si las entradas son menores o iguales que 10. Pero como necesitamos soportar valores arbitrariamente grandes, se vuelve más complicado.

El valor numérico de nse coloca al frente y se analiza como un número continuo literal usando ´. "3X4+kSqes el código básico de quine. Si no hay ningún valor en el frente, la longitud de la pila solo será 1 (el quine), de lo contrario, 2 permitirá l1=d*?determinar cómo manejar las cosas desde allí.

  • Si hay un valor, se S:1-}'LA2+-}ejecuta: intercambie el valor en la parte superior, reste 1, duplíquelo, deje una copia en la parte inferior de la pila, obtenga el Log 10 de ese valor por 100 (lo que da como resultado la longitud del carácter propia del valor, más 1 para el ´), elimine esa cantidad de caracteres del final de la cadena (efectivamente truncarse del final, tanto donde no es necesario como porque tiene el valor incorrecto). Ces un byte más corto que 2+y da como resultado el mismo valor.

  • Si no hay un valor, lea uno de la entrada.

Independientemente: :0)2*?duplicar y comparar con cero.

  • Si no es cero empuje ´.

  • Si es cero, resalta el valor. Podemos hacer trampa usando en !lugar de 2?y guardar un byte porque cuando ´intenta ejecutar el primer byte, ve que no es numérico y sale inmediatamente del modo de número en la misma posición.

Imprima toda la pila de arriba a abajo.

Draco18s ya no confía en SE
fuente
3

Java 10, 145 bytes

n->{Long N=n;var s="n->{Long N=%s;var s=%c%s%2$c;return s.format(s,N>0?N-1+%2$cL%2$c:%2$cn%2$c,34,s);}";return s.format(s,N>0?N-1+"L":"n",34,s);}

Pruébelo en línea y vea los resultados de algunas iteraciones .

Explicación:

explicación :

  • El var scontiene el código fuente sin formato
  • %s se usa para poner esta cadena en sí misma con s.format(...)
  • %c, %1$cy 34se utilizan para formatear las comillas dobles
  • s.format(s,34,s) lo pone todo junto

Parte del desafío:

La primera función lambda toma una longentrada como parámetro.

  • Esto se establece en variable Long N=n;en la primera iteración. O en las Long N=%s;próximas iteraciones.
  • La verificación ternaria N>0?N-1+"L":"n"completará esto %scon el valor N-1, añadido Lcomo es largo y para convertirlo en una Cadena para %s, si Nes mayor que 1. Si Nes 0 en su lugar (la entrada inicial fue 0o esta es la última iteración de la interquina- ' loop '), rellenará esto %scon la inicial nen su lugar.
Kevin Cruijssen
fuente
La especificación dice que las salidas intermedias deben ser un programa completo o una función sin argumentos
Encarnación de la ignorancia
@EmbodimentofIgnorance Lo sé, eso es lo que tengo. La primera función lambda toma un longparámetro de función, y las otras funciones lambda toman un Voidparámetro no utilizado , que también utilizo siempre para los desafíos que indican que no tienen entrada porque v->es 1 byte más corto que ()->.
Kevin Cruijssen
2

Haskell , 195 164 bytes

main=putStr(x++show x++"\na=")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr
x="main=putStr(x++show x++\"\\na=\")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr\nx="
a=0

Pruébalo en línea!

Esto utiliza una técnica de quine bastante simple. Lo modificamos con una variable aque se establece en un número. Si ese número es cero (que está al principio) tomamos entrada y salida de nuestra fuente con el aconjunto al número de entrada. Si ano es cero, sacamos nuestra fuente con aset a uno menos. De esta forma, la acuenta regresiva llega a cero antes de generar la fuente original.

Ad Hoc Garf Hunter
fuente
2

R , 92 bytes

f=function(n=-1){gsub("\\s","",paste("f=",sub("-?\\d+",n-1,paste(deparse(f),collapse=""))))}

Pruébalo en línea!

Si deparsese considera trampa, aquí hay una alternativa:

R , 108 bytes

function(n=-1){s="function(n=%d){s=%s%s%2$s;sprintf(s,n-1,intToUtf8(34),s)}";sprintf(s,n-1,intToUtf8(34),s)}

Pruébalo en línea!

Nick Kennedy
fuente
1

Perl 6 , 44 bytes

<say '<',S{\d+}=get||0-1,'>~~.EVAL'>~~.EVAL

Pruébalo en línea!

Toma la entrada a través de la entrada estándar y devuelve un programa donde lo único que cambia es el primer número. Cada programa subsiguiente generará el mismo programa, excepto con ese número disminuido.

Jo King
fuente
1

C # (compilador interactivo de Visual C #) , 112 bytes

void f(int n=-1){var s="void f(int n={2}){{var s={0}{1}{0};Write(s,(char)34,s,n-1);}}";Write(s,(char)34,s,n-1);}

¡Ahorré muchos bytes gracias a @NickKennedy!

Pruébalo en línea!

Encarnación de la ignorancia
fuente
Las salidas intermedias no son ni un programa completo ni una función que tome un solo argumento. También creo que tienes algunos ns que deberían ser ls. ¿Qué tal tio.run/##Sy7WTS7O/P@/…
Nick Kennedy
1

Python 3.8 (prelanzamiento) , 60 56 55 53 bytes

lambda n=-1,s='lambda n=%d,s=%r:s%%(~-n,s)':s%(~-n,s)

Pruébalo en línea!

-2 bytes gracias a Jo King

A partir de la versión de 53 bytes, también funciona en Python 2 y Python 3.

siete negativo
fuente
La función intermedia no parece ser un programa completo o una función que no tome argumentos.
Nick Kennedy
Ese operador de morsa :=es una adición bienvenida a Python, eso es seguro.
mbomb007
"Para las etapas intermedias en el ouroboros, su programa puede ser un programa que funcione completamente o una función sin argumentos , que, cuando se llama, devolverá / generará el siguiente".
mbomb007
@NickKennedy Se actualizó para cumplir con las especificaciones, y casualmente guardó 4 bytes.
negativo siete
1
53 bytes sin usar:=
Jo King