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:
- Pasado como argumento de línea de comando
- Leer de entrada estándar
- 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.
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 elgetInput()
? ¿También es válida la respuesta actual de Python?n
, generar un programa que es el "programa inicial" de una quine den
iteraciones ouroboros , y que nuestra respuesta no debe considerarse como una de lasn
iteraciones. ¿Es esto correcto?Respuestas:
05AB1E , 28 bytes
-4 bytes + arreglo gracias a Kevin Cruijssen
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.
fuente
d
es no negativo (>=0
) en lugar de positivo (>0
). El problema es que para verificard
sin reventarlo, primero debe duplicarlo, pero luego también debe descartarse en la iteración0"quinsting"
, de lo contrario, generará el duplicado0
. :("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 las0"34çìD«s<Ddiì"34çìD«s<Ddiì
salidas de iteración-1
delD
uplicate ...)Encantamientos rúnicos , 39 bytes
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
n
se coloca al frente y se analiza como un número continuo literal usando´
."3X4+kSq
es 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).C
es un byte más corto que2+
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 de2?
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.
fuente
Java 10, 145 bytes
Pruébelo en línea y vea los resultados de algunas iteraciones .
Explicación:
explicación quine :
var s
contiene el código fuente sin formato%s
se usa para poner esta cadena en sí misma cons.format(...)
%c
,%1$c
y34
se utilizan para formatear las comillas dobless.format(s,34,s)
lo pone todo juntoParte del desafío:
La primera función lambda toma una
long
entrada como parámetro.Long N=n;
en la primera iteración. O en lasLong N=%s;
próximas iteraciones.N>0?N-1+"L":"n"
completará esto%s
con el valorN-1
, añadidoL
como es largo y para convertirlo en una Cadena para%s
, siN
es mayor que 1. SiN
es 0 en su lugar (la entrada inicial fue0
o esta es la última iteración de la interquina- ' loop '), rellenará esto%s
con la inicialn
en su lugar.fuente
long
parámetro de función, y las otras funciones lambda toman unVoid
parámetro no utilizado , que también utilizo siempre para los desafíos que indican que no tienen entrada porquev->
es 1 byte más corto que()->
.Haskell ,
195164 bytesPruébalo en línea!
Esto utiliza una técnica de quine bastante simple. Lo modificamos con una variable
a
que se establece en un número. Si ese número es cero (que está al principio) tomamos entrada y salida de nuestra fuente con ela
conjunto al número de entrada. Sia
no es cero, sacamos nuestra fuente cona
set a uno menos. De esta forma, laa
cuenta regresiva llega a cero antes de generar la fuente original.fuente
Jalea ,
2220 bytesPruébalo en línea!
Prueba repetidas llamadas de código
fuente
R , 92 bytes
Pruébalo en línea!
Si
deparse
se considera trampa, aquí hay una alternativa:R , 108 bytes
Pruébalo en línea!
fuente
Perl 6 , 44 bytes
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.
fuente
C # (compilador interactivo de Visual C #) , 112 bytes
¡Ahorré muchos bytes gracias a @NickKennedy!
Pruébalo en línea!
fuente
n
s que deberían serl
s. ¿Qué tal tio.run/##Sy7WTS7O/P@/…Python 3.8 (prelanzamiento) ,
60565553 bytesPrué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.
fuente
:=
es una adición bienvenida a Python, eso es seguro.:=