Encuentra el hoyo 1 aquí .
Haga una quine que, cuando se ejecuta, genera su propio bloque de código fuente varias veces. De hecho, debe generarlo n veces, donde n en el siguiente número primo.
Creo que un ejemplo lo muestra mejor.
[MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
Cada programa generará su "bloque" base (por lo tanto, [MI QUINE]) las siguientes veces de números primos .
Las funciones integradas para calcular si un número es primo (como una función isPrime) o para determinar el próximo primo (como una función nextPrime ()) no están permitidas.
- Esto significa que las funciones para enumerar el número de divisores no están permitidas
- Las funciones que devuelven la factorización prima tampoco están permitidas.
Esto debería ser una verdadera quine (excepto por algún margen de maniobra, vea el siguiente punto), por lo que no debe leer su propio código fuente.
Debido a que los lenguajes como Java y C # ya están en desventaja, no necesita generar un código totalmente funcional. Si se puede poner en una función (que se llama) y generar la próxima quine, está bien.
Este es el código de golf, ¡así que el código más corto gana!
Respuestas:
CJam, 31 bytes
Pruébelo en línea en el intérprete de CJam .
Idea
Para verificar la originalidad, usaremos el teorema de Wilson , que establece que un número entero n> 1 es primo si y solo si (n - 1). ≡ -1 (mod n) , que es cierto si y solo si (n - 1)! + 1% n == 0 .
Código
fuente
mp
(¿es prime?) existe ahora, por lo que en la última versión de CJam, uno podría jugar golf un poco más.CJam,
3635 bytesEsto
definitivamente sepuede jugar más golf.Cómo funciona:
Gracias a Martin por recordarme el
]W=
truco :)Pruébalo en línea aquí
fuente
Mathematica,
248222 bytesEditar: se corrigió el uso de una función relacionada con Prime, pero también se mejoró un poco la combinación.
Editar: Gracias a Dennis por presentarme el teorema de Wilson.
Esto supone que el kernel se cierra entre ejecuciones posteriores de la quine (o al menos
n
se restablece), porque se basa enn
estar indefinido antes de la primera instancia de[MyQuine]
se ejecute .Esto probablemente se puede acortar mucho, pero no tengo mucha experiencia con quines, especialmente en Mathematica.
Aquí hay una explicación:
Esto no hace nada, pero si se concatena al final de la línea anterior, multiplica el resultado de la última expresión por
1
(que es un no-op) y el punto y coma suprime la salida. Esto asegura que solo la última copia de[MyQuine]
copias imprima algo.Inicializa
n
a1
la primera copia de[MyQuine]
y luego lo incrementa por1
cada copia adicional - es decir, este recuento sólo cuántas copias existen enn
.Avanza hasta el final ahora:
Esto encuentra el próximo primo usando el teorema de Wilson .
Esta es la quine real. Crea
NextPrime@n
copias del código en sí. También es un poco raro. Sí, estoy multiplicando dos cadenas allí, y no, eso no tiene un resultado significativo.QUINE_PREFIX
contiene todo el código antes de las dos cadenas yQUINE_SUFFIX
contiene todo el código después de las dos cadenas. Ahora usualmente usaApply
(o@@
) para convertir una lista en una serie de argumentos. Pero puede reemplazar cualquieraHead
conApply
, por ejemplo, multiplicación. Entonces, a pesar de ser un producto, todavía puedo convertirlo en dos argumentos para mi función. Esa función hace:Donde
#
está el primer argumento (la cadena de prefijo),#2
es el segundo argumento (la cadena de sufijo),##
es una secuencia de ambos argumentos. Necesito anteponer1
para preservar la multiplicación; de lo contrario,##
saldría a la lista de argumentos paraToString
. De todos modos,ToString[1##,InputForm]&@@("abc"*"def")
vuelve"abc"*"def"
... justo lo que necesito!Creo que con todas las cosas que necesito alrededor de la quine, una
eval
quine a base sería más apropiada aquí. Lo investigaré más tarde o mañana.fuente
J - 60 char
Utiliza el método next-prime como las otras respuestas. (Ese es el
4 p:
bit.)Un pequeño y lindo truco de J es que
f :g
actúa comof
cuando se le da un argumento yg
cuando se le dan dos. Entonces, si escribe, digaf :;'a'f :;'a'f :;'a'
entonces que actúa comof'a';'a';'a'
, lo cual es genial porque esa es una lista encuadrada cuyos elementos son'a'
y cuya longitud es el número de ocurrencias.Entonces podemos convertir eso en una especie de quiney. El
f
aspecto que usamos es(foo $~ bar)
, dondefoo
construye la parte de la cuerda que repetimos una y otra vez,bar
busca el siguiente número primo y lo multiplica por 60, la longitud de la cadenafoo
.fuente
Python 2.7, 214
fuente