Su tarea es crear un programa que, cuando se ejecuta, se devuelve como salida (esto se conoce como quine). Sin embargo, esta quine debe, cuando se copia n
veces, devuelve la quine, pero con cada uno de sus caracteres duplicados en el lugar n
veces, donde n
es un entero positivo.
Si su programa original es Derp
:
Derp -> Derp (must return itself as output to be a quine)
DerpDerp -> DDeerrpp
(the "Derp" is copied twice, so each character in the output has to be copied twice)
DerpDerpDerp -> DDDeeerrrppp
etc. etc.
Tenga en cuenta que se le permite tener espacios en blanco en su programa "base", pero se cuentan cuando se "entrelazan". Digamos que tu programa es
Derp
{newline}
(La nueva línea significa una nueva línea final, y hay un espacio adicional después de Derp
). Cuando se duplica para convertirse
Derp
Derp
{newline}
Debe salida
DDeerrpp
{newline}
{newline}
Tenga en cuenta que hay 2
espacios adicionales después delDDeerrpp
.
Reglas y especificaciones:
- Su programa debe contener al menos dos caracteres distintos (lo que implica que su código debe tener al menos 2 bytes de longitud).
- Se aplican las reglas estándar de quine .
Este es el código de golf , por lo que gana el código más corto en bytes.
code-golf
quine
source-layout
clismique
fuente
fuente
Respuestas:
Fisión , 6 bytes.
Pruébalo en línea! ¡Prueba dos copias! ¡Prueba tres!
Explicación
Esta es solo la quine estándar de fisión . Resulta que funciona para este desafío, porque Fission tiene puntos de entrada explícitos en el programa. En particular, al duplicar el programa, agregamos otro
R
que agrega otro átomo (puntero de instrucción). Como el código fuente es toroidal, el código efectivo que se está ejecutando no cambia de otra manera: para cada átomo, el código todavía se ve igual localmente. Sin embargo, los átomos se ejecutan en el paso de bloqueo, de modo que las cosas que imprimen se intercalan y obtenemos una copia adicional de cada carácter en la salida.En aras de la integridad, solo reiteraré brevemente cómo funciona el programa en sí. Independientemente de si repetimos el programa o no (por ejemplo
'!+OR"'!+OR"'!+OR"
), cada átomo ve el siguiente código:El
"
modo de impresión se alterna cadena, por lo que el programa se inicia mediante la impresión'!+OR
directamente a la salida estándar, que es toda la quine excepto la cita. Luego'!
establece la masa del átomo en el código de caracteres!
, lo+
incrementa, lo que da"
eO
imprime mientras destruye simultáneamente el átomo. El programa termina, porque no quedan átomos.fuente
Python 2.7,
377310304194191 bytes!Este es mi primer golf, así que no esperaba que fuera demasiado bueno. Pero pensé que el concepto en la solución que se me ocurrió era algo divertido, así que lo publico de todos modos.
De hecho, esto es una quine; Puedes probarlo aquí . Abusa del módulo de inspección bastante duro.
Si intentamos ejecutarlo con el mismo código fuente x2, también obtenemos la salida correcta; Puedes probar eso aquí . x3, x4, etc. todo funciona como se esperaba.
Sin disculpas con la explicación:
fuente
inspect
? (ver meta publicación relevante ). En PPCG tenemos definiciones específicas de lo que hace que una quine sea válida, y "leer la fuente" generalmente se considera una trampa.import threading,inspect as i
puede serimport threading as T,inspect as i
CJam , 19 bytes
Pruébalo en línea!
Cómo funciona
fuente
RProgN , 66 bytes
Espacio en blanco significativo sea la muerte de mí
Explicado
Dios mío, soy un monstruo ...
Pruébalo en línea!
fuente
~["[%q]F01+`0=`.{0m}R"]F01+`0=`.{0m}R
en general funciona bien, no es una solución válida, porque no hay forma de replicar el marcador ZSS.Perl 5, 107 bytes
Sin golf:
Pruébalo en línea!
fuente
Python 3 ,
122121112 bytesPruébelo en línea: una copia | dos copias | tres copias | cuatro copias, con verificación automática
Cómo funciona
Esto utiliza la línea estándar de Python: almacene el código que desea ejecutar en una variable (como una cadena); incluye algo de lógica en esa cadena para imprimirse, todo antes y todo después; luego ejecuta esa cadena.
El código que se ejecuta a través de la cadena s es el siguiente.
La primera línea importa incondicionalmente el módulo atexit , lo que nos permitirá registrar un controlador de salida. Intentar importar el mismo módulo varias veces no afecta el script de ninguna manera. Luego intenta incrementar la variable n , para realizar un seguimiento de cuántas copias del código fuente se ejecutaron.
La segunda línea se ejecuta solo si la primera contiene un error. Este será el caso en la primera iteración, ya que n todavía no está definido. En este caso, inicializamos n como 1 y registramos una lambda que realiza la magia real.
El manejador de salida registrado
se llamará justo antes de que finalice el programa. La lambda sí mismo crea la cadena
"s=%r;exec(s);"%s
-%r
crea una representación de cadena del argumento de la derecha ( s ), que incluye todo lo que entre las comillas simples y las propias cotizaciones - entonces itera sobre sus personajes. Para cada carácter c , simplemente imprimimos n copias de c . Pasarc*n
como argumento nombradoend
aprint
significa que no se agregará ningún salto de línea.fuente
CJam , 14 bytes
Pruébalo en línea!
Explicaciones
fuente