Esto fue inspirado por Print a Negative of your Code y Golf a mutine quine .
Considere un rectángulo de caracteres que cumpla con las siguientes restricciones:
- Consiste únicamente en caracteres ASCII imprimibles
- Dimensiones ambas mayores que 1
- Cada fila y cada columna contiene al menos un espacio.
- Cada fila y cada columna contiene al menos un carácter no espacial.
Por ejemplo, el siguiente es un rectángulo válido de 6x4:
%n 2e
1 g 3
&* __
3
Un negativo para este rectángulo se define como un rectángulo de dimensiones iguales, con todos los espacios reemplazados por caracteres no espaciales y todos los caracteres no espaciales reemplazados por espacios. Un negativo del rectángulo anterior podría ser:
f ^
33 >
9 $
^ }|Q'
Se puede utilizar cualquier carácter ASCII que no se pueda imprimir en el espacio para reemplazar un espacio.
Tarea
Su tarea es escribir un programa con código fuente rectangular, que genere un negativo válido para sí mismo. El resultado negativo también debe ser un programa válido, en el mismo idioma que el original, y debe generar la fuente del original.
No se puede agregar o eliminar ningún espacio en blanco al final, a excepción de una nueva línea al final de cualquiera de las salidas, que es opcional.
Ningún programa puede leer el código fuente de ninguno de los dos; ni se pueden suponer entornos REPL.
Tanteo
Su puntaje es el producto de las dimensiones de su código (es decir, si su código fuente está en un rectángulo de 12 por 25, su puntaje es 12 * 15 = 180). Además, por cada carácter utilizado en un comentario, su puntaje aumenta en 2 (si usa /* .. */
una vez en su código, y su código está en un rectángulo de 10 por 10, su puntaje sería 10 * 10 + 8 * 2 = 116).
El puntaje más bajo gana.
Si hay un empate, el envío con el menor número de espacios en el programa (ya sea el original o el negativo, el que tenga menos espacios) gana.
Si aún queda un empate, la respuesta anterior ganará.
Hay una bonificación de -52% , si la combinación de lo original y lo negativo produce una quine normal. Por ejemplo:
Original Negative Combined
A A B B BABA
A A B B ABAB
fuente
Respuestas:
CJam, (
51 49 47 46 4542 x 2) * 48% = 40.32Ejecutar el código anterior da este resultado:
ejecutando cual, imprime la fuente original.
La fuente y la salida son simplemente líneas intercambiadas.
Ahora viene la magia.
Superponiendo la fuente y los resultados de salida en el siguiente código:
que es una quine perfecta!
Pruébalos en línea aquí
Cómo funciona
Toda la lógica de impresión está en la primera línea que maneja los tres casos explicados más adelante.
La matriz en la última línea anterior es la matriz que tiene bloques de código correspondientes a los tres casos.
Caso 1
En este caso, la longitud de la pila restante era 0, ya que cuando se ejecutó el bloque, solo tenía la copia del bloque en sí, que inicialmente apareció en el tercer paso anterior. Entonces sacamos el índice
0
de la última matriz y lo ejecutamos:En este caso, la segunda línea es no operativa en lo que respecta a la impresión de la salida.
Caso 2
En este caso, la pila ya contenía una cadena vacía, por lo que cuando se ejecutó el bloque de código copiado, tenía 2 elementos: una cadena vacía y el bloque de código en sí. Entonces sacamos el índice
1
de la última matriz y lo ejecutamos:Caso 3
En este caso, la pila tiene 6 elementos. Entonces, después de hacer estallar el último bloque de código, la longitud restante de la matriz es 5. Tomamos el índice
5
de la matriz y lo ejecutamos. (Tenga en cuenta que en una matriz de3
elementos, index5
es index5%3 = 2
)fuente
Python, 97x2 + 2 = 196
No es una gran solución para comenzar, pero al menos funciona (creo).
Salida:
fuente
CJam, (
5856544846 x 2) * 48% = 44.16que imprime
Los caracteres no espaciales en cada línea permanecen iguales entre las dos líneas mutuas.
Pero ahora la parte realmente dulce:
es una quine! :)
Pruébalo aquí.
Cómo funciona
Le recomiendo que primero lea la explicación en mi otro envío, ya que explica los conceptos básicos de las citas en CJam en general.
Este es un poco más complicado. Para la quine mutua, como en el otro caso, modifico la representación de cadena del bloque agregando espacios antes o después de cada línea, e intercambiando un 0 con un 2, para que el programa resultante coloque los espacios en el extremo opuesto.
Tenga en cuenta que los espacios no afectan a las quines mutuas en absoluto. En el primero, están en un bloque, que no se usa realmente, y en el segundo están alrededor del código completo.
Para obtener una quine regular al combinar ambos, necesitamos encontrar una manera de evitar hacer toda esa modificación. Tenga en cuenta que la estructura del espacio en blanco y el código significa que al combinar ambos, insertamos la totalidad de una quine en la otra. Entonces, si ponemos el código de modificación completo en un bloque, podemos ejecutar ese bloque dependiendo de su contenido real.
Así que ahora tengo este bloque ... para las cuotas mutuas, solo contiene el código que realmente quiero ejecutar. Para la quine combinada, también contiene la quine entera nuevamente, en una posición aleatoria, lo que no tiene ningún sentido ... pero como es un bloque, no se ejecuta automáticamente. Por lo tanto, podemos determinar si se modifica la cadena en función del contenido de ese bloque. Para eso
_`'"#)!
es eso . Duplica el bloque, lo convierte en una cadena, busca el carácter"
(que, en las mutuas, solo aparece fuera del bloque), la búsqueda regresa-1
si no se encuentra el carácter y un entero positivo de lo contrario, incrementa el resultado y lo niega lógicamente. Entonces, si"
se encontró un, esto produce lo0
contrario, rinde1
. Ahora solo hacemos*
, que ejecuta el bloque una vez, si el resultado fue 1 y nada de lo contrario.Finalmente, así es como funciona el código de modificación:
Reclamando la recompensa, (12 x 10) * 48% = 57.6
Resulta que este código se puede dividir en más líneas muy fácilmente con algunas modificaciones. Agregamos 2 caracteres, para obtener 48 en una fila, que luego podemos dividir convenientemente entre 8, para que tengamos 8 líneas con 6 caracteres de código y 6 espacios. Para hacer eso, también necesitamos cambiar algunos números y reorganizar un operador o dos, para que no se dividan en ambas líneas. Eso nos da una versión funcional con un tamaño de 12 x 8 ... uno fuera del requisito. Así que solo agregamos dos líneas que no hacen nada (presionar un 1, pop a 1, presionar un 1, pop a 1 ...), así que llegue a 12 x 10 :
Como el anterior esto produce
(Nota al margen: no hay necesidad de alternar a la izquierda y a la derecha en las líneas intermedias, solo la posición de la primera y la última línea es importante. La izquierda y la derecha se pueden elegir arbitrariamente para todas las demás líneas).
Y por pura coincidencia, la quine completa todavía funciona:
(Digo coincidencia, porque la parte que se encarga de no ejecutar el código interno ahora se intercala extrañamente con la otra quine, pero aún así funciona bien).
Dicho esto, podría haber agregado 44 líneas
1;
a mi presentación original para cumplir con el requisito de recompensa, pero se12 x 10
ve mucho más ordenado. ;)Editar: Jaja, cuando dije "pura coincidencia" no podría haber sido más acertado. Investigué cómo funciona actualmente la quine final, y es absolutamente ridículo. Hay tres bloques anidados (4 en realidad, pero el más interno es irrelevante). La única parte importante del más interno de esos 3 bloques es que contiene un
"
(y no el que hizo en el envío original, sino el'"
que se usa al final para verificar el mismo carácter). Entonces, la estructura básica de la quine es:Vamos a diseccionar eso:
Entonces, esto realmente hace algo de magia divertida, pero debido a que el bloque interno deja una sola cadena en la pila,
)!*
pasa a convertirla en una cadena vacía. La única condición es que las cosas en el bloque interno después+
no hagan nada más a la pila, así que veamos eso:fuente
Y/2
en la quine combinada?CJam,
423733 x 2 = 66que imprime
(Las líneas se intercambian y se
1
convierte en a0
.)Pruébalo aquí.
Cómo funciona
Primero, debe comprender la quine básica de CJam:
Las llaves simplemente definen un bloque de código, como una función, que no se ejecuta de inmediato. Si un bloque no ejecutado permanece en la pila, se imprime su código fuente (incluidas las llaves).
_
duplica el bloque y~
ejecuta la segunda copia. El bloque en sí mismo simplemente empuja la cadena que contiene_~
. Entonces, este código deja la pila en el siguiente estado:El bloque y la cadena simplemente se imprimen consecutivamente al final del programa, lo que hace que esto sea una quine.
La belleza de esto es que podemos hacer lo que queramos en el bloque, y sigue siendo una quine, porque cada pieza de código se imprimirá automáticamente en el contenido del bloque. También podemos modificar el bloque, obteniendo su representación de cadena con
`
(que es solo una cadena del bloque con llaves).Ahora veamos esta solución. Observe que cualquiera de las partes de la quine mutua contiene el bloque tipo quine con
_~
y anL
. ElL
empuja una cadena vacía en la pila, que no contribuye a la salida. Entonces, esto es lo que hace el bloque:Entonces esto hará la parte quine, pero intercambia un 1 por un 0, y también antepondrá otra línea con un
L
, donde el código anterior tiene un espacio. El problema es que el orden de esas dos líneas está determinado por el intercambio en el interior{ }*
. Y debido a que la parte externa de la quine mutua tiene el0
frente reemplazado por a1
, nunca ejecuta este intercambio y, por lo tanto, produce el orden original nuevamente.fuente
CJam, 27 × 2 = 54
Salida:
'A'B>
compara los caracteres A y B.' '\n >
devuelve 1 porque 32> 10 y' \n' >
devuelve 0 porque los dos espacios son iguales.fuente
CJam,
3029 x 2 = 58Salidas:
que genera la fuente original.
Esto se basa en el mismo principio que mi otra solución.
Pruébalo en línea aquí
fuente