Una quine 1-up es un programa que es muy similar a una quine. La principal diferencia es que, en lugar de imprimirse una vez, cuando se concatenan n copias del programa, el resultado imprime el programa original n + 1 veces.
Ejemplo
Si su programa es Abc123
:
Abc123 -> Abc123Abc123
Abc123Abc123 -> Abc123Abc123Abc123
Abc123Abc123Abc123 -> Abc123Abc123Abc123Abc123
Reto
Su desafío es crear la quine 1-up válida más corta en cualquier idioma. Se aplican las reglas habituales de quine, por lo que no puede:
- Envía el programa vacío.
- Directamente o indirectamente lea 1 el código fuente.
- Utilice las funciones integradas de comillas.
Este es el código de golf, por lo que gana el código más corto en bytes.
1 Esto no incluye el uso de una cadena codificada o un bloque de código como parte de su programa.
code-golf
quine
code-generation
ETHproducciones
fuente
fuente
n
está limitado por alguna restricción de tipo de datos (tamaño entero máximo, etc.)?Respuestas:
GolfScript, 12 bytes
Pruébalo en línea!
Explicación
Esto combina ideas del quine estándar de GolfScript:
Y mi quine recientemente descubierta :
La idea principal es nuevamente usar el
n
que está impreso implícitamente al final del programa para obtener la copia adicional de la quine. Dado que la asignación de la variable no cambia nada cuando se realiza nuevamente en copias posteriores, esto solo agregará una copia. Aquí hay un desglose del código:fuente
GolfScript, 12 bytes
Pruébalo en línea!
Cómo funciona el código fuente
Si el código fuente anterior se ejecuta una vez, la pila terminará como
donde la cadena vacía al principio corresponde al estado inicial de la pila (entrada vacía).
Dos copias del código fuente dejarían un estado final de
tres copias de un estado final de
y así.
Que pasa despues
Después de ejecutar el código fuente, el intérprete hace lo siguiente.
Envuelve toda la pila en una matriz y empuja esa matriz en la pila.
Para dos copias del código fuente, la pila ahora contiene
Se ejecutó
puts
con la intención de imprimir la pila envuelta, seguido de un salto de línea.puts
se define como{print n print}
, por lo que hace lo siguiente.print
imprime la copia envuelta de la pila sin inspeccionarla (es decir, sin convertirla en su representación de cadena). Esto envía(el código fuente) a STDOUT y muestra la copia de la pila desde la parte superior de la pila.
La pila ahora contiene
ejecuta el bloque de código que definimos anteriormente.
:
comienza guardando[{: ".~"][} ".~"]
el carácter de espacio, luego se".~"
empuja a sí mismo, lo]
envuelve".~"
en una matriz y[
establece un nuevo marcador de matriz.n
empuja una cadena que consiste en un solo salto de línea.La pila ahora contiene
se ejecuta una vez más. Sin embargo, se redefinió cuando lo llamamos por primera vez y ahora contiene una matriz, no un bloque de código.
De hecho, empuja
[{: ".~"][} ".~"]
, dejando la pila comoFinalmente,
print
imprime el elemento de la pila superior sin inspeccionarlo, enviandoa STDOUT, subiendo 1 el código fuente.
fuente
Javascript ES6 (REPL), 55 bytes
¡Guardado 2 bytes gracias a @ user81655!
Explicación
Aquí está el marco estándar de quine:
Debería poder ver este marco dentro del envío. Más explicación a continuación.
Este es el contador, predeterminado en 1. Básicamente, nos dice cuánto repetir el quine y los incrementos al mismo tiempo.
Esta es la parte quine. Esencialmente repetimos la cadena de quine por el contador + 1. Las llamadas a funciones posteriores anularán la salida.
fuente
a
).var
CJam, 14 bytes
Pruébalo en línea!
Cómo funciona
Después de que se haya ejecutado la última copia del programa, la matriz que contiene el bloque y la cadena todavía está en la pila, por lo que se imprime implícitamente.
fuente
Groovy, 83 bytes
Hay una nueva línea incrustada y sin cola. Esto imprime:
La función
f()
imprime una copia de la quine. El programa inicial lo llama dos veces. La primera línea del código adjunto se convierte en un comentario y solof()
se ejecuta la segunda llamada a .fuente
Ruby, 43 bytes
Por sí mismo, esto se imprime
2-0
o se imprime2
veces. Cuando se concatena con otra copia de sí mismo, la declaración de impresión final se ve$><<s%s*n=2-01
, lo que significa que se genera solo una vez (01
siendo octal 1). Entonces, solo la copia final de la cadena se imprime dos veces, las otras se imprimen una vez.La asignación en línea a
n
es solo para que el orden de las operaciones funcione correctamente; En realidad, el estado no se pasa de una copia a la siguiente.fuente
NodoJS,
63616055 bytesesto también funcionará en JavaScript (ES6) si considera que varios mensajes de la consola están separados por líneas nuevas (no se requiere REPL)
Guardado 2 bytes gracias a @ dev-null
tenga en cuenta que hay una nueva línea al final del código.
Este fue uno interesante, definitivamente uno de mis favoritos para este sitio hasta ahora.
Estoy bastante seguro de que esto no se puede jugar mucho más. (tal vez la
print
función de SpiderMonkey ...)Explicación
fuente
(f=_=
Puede que esté un poco cansado.Ruby, 55 bytes
Nada muy interesante aquí, es solo una quina de rubí normal con un contador.
fuente
JavaScript (ES6), 164 bytes
Funciona en cualquier página o consola de prueba de JS en Firefox, suponiendo que el espacio entre dos mensajes de la consola cuenta como una nueva línea.
fuente
window
athis
.Perl 6 ,
5853 bytesGracias a Jo King por -5 bytes.
Basado en la quine de Jo King .
Pruébalo en línea!
fuente
Japt, 40 bytes
¡Pruébelo en línea! Explicación por venir.
fuente
Y
Sin competencia, 6 bytes
Y es un cañón de cabeza que he tenido por un tiempo, y esto me inspiró a escribirlo. Está hecho para desafíos en los que la secuencia es clave, como esta. El código se divide en enlaces por caracteres de "nodo". En este caso, nuestro código se coloca en dos cadenas (originalmente), siendo el nodo
C
.U
registra una cadena trascendental, es decir, una que abarca enlaces. Graba hasta que se encuentra con otroU
. Si aU
no se cumple al final de la cadena, se envuelve. Además,U
se incluye en la cadena de forma predeterminada. Después de grabar la cadena, procedemos al nodoC
, que simplemente nos mueve al siguiente enlace.n
empuja el número de cadenas. Para nuestro caso base, este 2. Para una secuencia deK
cadenas, hayK+2
cadenas, comoK
nodos.*
es la repittion de cadenas.p
imprime toda la pila (en este caso, una cadena) yx
finaliza el programa.En un texto:
Pruébalo aquí!
fuente
U
además de quining? (Felicidades por 7k, por cierto)Brachylog , 20 bytes
Pruébalo en línea!
Modificado de esta quine.
Cuando esto se concatena consigo mismo, cada ruta, excepto la última, falla y el programa pasa a la siguiente, ejecutando cada una
w₃
y retrocediendo cada unaw₅
excepto la última.Pruébalo en línea!
Pruébalo en línea!
Pruébalo en línea!
fuente