Similar a otros acertijos de quine (más específicamente, este ), escriba un programa que produzca la fuente por sí mismo.
Aquí está el nuevo giro: el código producido NO debe ser idéntico a la fuente. Más bien, debería generar un programa diferente que creará el primero.
El desafío vinculado a lo anterior lo logró saltando entre dos idiomas. Estoy pensando que este se haría en un solo idioma , pero las dos (o más) versiones de la fuente deberían ser significativamente diferentes (ver las reglas a continuación). Con esta restricción, las respuestas de un solo carácter se rechazarían, lo que requeriría un poco más de reflexión para una presentación final.
REGLAS
- Su código debe ser producido en un solo idioma. (Múltiples presentaciones, una para cada idioma es perfectamente aceptable).
- Sus diferentes versiones de código deben ser sintácticamente distintas. En otras palabras, si fuera a dibujar un árbol de sintaxis abstracta para su código, debería haber al menos un nodo diferente.
- No será necesario proporcionar un AST , pero si se siente inclinado a proporcionar uno para cada uno de sus programas, sería útil para juzgar.
- Puede producir tantas iteraciones como desee, siempre que todas sigan siendo sintácticamente distintas. (Más ayudará a su puntaje, ver más abajo).
TANTEO
Su puntaje final será la duración media de todos sus programas, dividida por el número de programas.
Ejemplo 1:
A (fuente de B) = 50 caracteres
B (fuente de A) = 75 caracteres
Puntuación final = 31.25
Ejemplo 2
A (fuente de B) = 50 caracteres
B (fuente de C) = 75 caracteres
C (fuente de A) = 100 caracteres
Puntuación final = 25
Respuestas:
Python, 0 (límite de (68 + 3 n ) / (16 n ))
Si dos árboles de sintaxis abstractas son diferentes si tienen constantes diferentes,
Hay 16 n programas de duración como máximo 68 + 3n, dando una puntuación asintótica de 0.
Si desea programas con estructura variable, podemos implementar un sumador binario en n bits. Aquí, hay 2 n programas de longitud O ( n 2 ). Entra en un ciclo debido a la caída del bit de transporte.
fuente
pass
cambiará ay det=n(t)
regreso, en todas las combinaciones de 2 ^ n.Perl, puntaje de 110.25
Tengo que admitir que no soy muy bueno con quines. Estoy 100% seguro de que hay margen de mejora. La solución se basa en el mismo principio de la solución Element a continuación.
El primer programa tiene 264 caracteres.
El segundo programa tiene 177 caracteres.
Estoy trabajando en el AST para esta entrada (y la entrada Element).
Elemento , puntaje de 47.25
El primer programa tiene 105 caracteres.
El segundo programa tiene 84 caracteres.
Estoy seguro de que hay mucho margen de mejora.
En el primer programa hay una cadena (en la que se escapa cada carácter, a pesar de la redundancia) seguida de las partes ejecutables A y B. La Parte A hace varias cosas: imprime la cadena y escapa de cada carácter, imprime la última mitad de la cadena (que es la fuente de la parte B), y luego evita que la parte B que le sigue haga algo.
El segundo programa es la misma cadena seguida de la parte B. La Parte B se basa en una quine simple; imprime una cadena precedida por una versión escapada de ella. Esto significa que imprime la cadena, y ambas partes A y B.
fuente
[]{}
, cualquier comando se puede colocar en cualquier parte del programa completo sin causar un error de sintaxis. Es perfecto.VBA: (251 + 216) / 2/2 = 116.75
251
216
Esto se ejecuta en MSAccess para hacer uso del
Module
objeto. El módulo lleva el nombre"Q"
del golf. La diferencia en la sintaxis proviene de laIf ... Then
falta de la versión más corta.fuente
vbCrLF
avbCr
C ++, puntaje de 0.734194
El siguiente código fuente imprime una meta quine de orden 999 en la consola (explicación a continuación):
La única línea que cambia es la primera línea. El valor de
X
será 1000, 999, 998, ..., 3, 2 y luego comenzará de nuevo. Sin embargo, para obtener diferentes árboles de sintaxis cada vez,X
se representa en términos de su factorización prima, donde cada primo se escribe como una suma de1
s. Los AST son diferentes, porque la factorización prima de los enteros es diferente para cada valor.El programa se imprimirá solo, excepto que la primera línea se cambia y las barras invertidas, los saltos de línea y las hendiduras que se encuentran dentro
Q(...)
se eliminarán.El siguiente programa calcula el puntaje de mi respuesta:
Imprimió 0.734194 en la consola. Obviamente, 1000 pueden ser reemplazados por enteros más grandes y la puntuación se acercará a 0 como su límite. La prueba matemática implica que la función Zeta de Riemann es algo complicada. Lo dejo como ejercicio para el lector. ;)
fuente
JavaScript,
84.56461Dos programas, ambos de duración
169128122.Antes de jugar al golf, para su placer visual:
¡Devuelve el nuevo programa y genera la parte actual!
Probablemente podría acortarlo sin la función regex, pero ... no quiero hacerlo.fuente
J - (24 + 30) / 2/2 = 13.5 pts
Tenga en cuenta que las cadenas en J no son los escapados, pero Cotización en escaparon a la Pascal:
'I can''t breathe!'
.El programa 1 tiene AST
noun verb hook noun
y el programa 2 tiene ASTnoun
. El programa 2 es una versión citada del programa 1, que solo devolverá el programa 1 cuando se ejecute, por lo que este método no se puede extender a tres copias tan fácilmente: PEl programa 1 funciona tomando una copia de la parte del código de la fuente, con una cita adjunta al frente, y agregando cinco de esas citas al final (
(,5#{.)
). Luego, toma cíclicamente 30 caracteres de esta cadena de 16 caracteres, lo que da exactamente el Programa 2 como resultado.fuente