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
nse restablece), porque se basa ennestar 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
na1la primera copia de[MyQuine]y luego lo incrementa por1cada 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@ncopias 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_PREFIXcontiene todo el código antes de las dos cadenas yQUINE_SUFFIXcontiene 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 cualquieraHeadconApply, 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),#2es el segundo argumento (la cadena de sufijo),##es una secuencia de ambos argumentos. Necesito anteponer1para 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
evalquine 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 :gactúa comofcuando se le da un argumento ygcuando 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
faspecto que usamos es(foo $~ bar), dondefooconstruye la parte de la cuerda que repetimos una y otra vez,barbusca el siguiente número primo y lo multiplica por 60, la longitud de la cadenafoo.fuente
Python 2.7, 214
fuente