Trouvez le trou 1 ici .
Créez une quine qui, lorsqu'elle est exécutée, génère plusieurs fois son propre bloc de code source. En fait, il doit le sortir n fois, où n dans le prochain nombre premier.
Je pense qu'un exemple le montre le mieux.
[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]
Chaque programme sortira son "bloc" de base (donc [MA QUINE]) les prochaines fois en nombre premier .
Les fonctions intégrées pour calculer si un nombre est premier (comme une fonction isPrime) ou pour déterminer le nombre premier suivant (comme une fonction nextPrime ()) ne sont pas autorisées.
- Cela signifie que les fonctions pour répertorier le nombre de diviseurs ne sont pas autorisées
- Les fonctions qui renvoient la factorisation principale sont également interdites
Cela devrait être une vraie quine (sauf pour une certaine latitude, voir le point suivant), donc vous ne devriez pas lire votre propre code source.
Parce que les langages comme Java et C # sont déjà désavantagés, vous n'avez pas besoin de sortir du code totalement fonctionnel. Si elle pouvait être placée dans une fonction (qui est appelée) et sortir le quine suivant, vous êtes bon.
C'est le code-golf, donc le code le plus court gagne!
Réponses:
CJam, 31 octets
Essayez-le en ligne dans l' interpréteur CJam .
Idée
Pour vérifier la primalité, nous utiliserons le théorème de Wilson , qui stipule qu'un entier n> 1 est premier si et seulement si (n - 1)! ≡ -1 (mod n) , ce qui est vrai si et seulement si (n - 1)! + 1% n == 0 .
Code
la source
mp
(est premier?) existe maintenant, donc dans la dernière version de CJam, on pourrait jouer au golf un peu plus.CJam,
3635 octetsCela peut
certainementêtre joué plus loin.Comment ça fonctionne:
Merci à Martin de m'avoir rappelé le
]W=
truc :)Essayez-le en ligne ici
la source
Mathematica,
248222 octetsEdit: correction de l'utilisation d'une fonction liée à Prime, mais également amélioration un peu du quining.
Edit: Merci à Dennis de m'avoir présenté le théorème de Wilson.
Cela suppose que le noyau est fermé entre les exécutions suivantes du quine (ou au moins
n
est réinitialisé), car il repose sur le fait qu'iln
n'est pas défini avant l'[MyQuine]
exécution de la première instance de .Cela peut probablement être beaucoup raccourci, mais je n'ai pas beaucoup d'expérience avec les quines, surtout en Mathematica.
Voici une explication:
Cela ne fait rien, mais s'il est concaténé à la fin du quine précédent, il multiplie le résultat de la dernière expression par
1
(qui est un no-op) et le point-virgule supprime la sortie. Cela garantit que seule la dernière copie de[MyQuine]
imprime quoi que ce soit.Initialise
n
à1
la première copie[MyQuine]
et incrémente par1
chaque exemplaire supplémentaire - à savoir ce seulement compte combien de copies il y a enn
.Passez à la fin maintenant:
Cela trouve le premier premier en utilisant le théorème de Wilson .
C'est le véritable quine. Il crée des
NextPrime@n
copies du code lui-même. C'est aussi un peu bizarre. Oui, je multiplie deux chaînes là-bas, et non, cela n'a pas de résultat significatif.QUINE_PREFIX
contient tout le code avant les deux chaînes etQUINE_SUFFIX
contient tout le code après les deux chaînes. Maintenant, vous utilisez généralementApply
(ou@@
) pour transformer une liste en une série d'arguments. Mais vous pouvez en remplacer n'importe quelHead
avecApply
- par exemple la multiplication. Donc, bien que ce soit un produit, je peux toujours le transformer en deux arguments pour ma fonction. Cette fonction:Où
#
est le premier argument (la chaîne de préfixe),#2
est le deuxième argument (la chaîne de suffixe),##
est une séquence des deux arguments. Je dois ajouter au début1
pour préserver la multiplication - sinon,##
je serais inséré dans la liste des argumentsToString
. Quoi qu'il en soit,ToString[1##,InputForm]&@@("abc"*"def")
revient"abc"*"def"
... juste ce dont j'ai besoin!Je pense qu'avec tout ce dont j'ai besoin autour du quine, un
eval
quine basé serait plus approprié ici. J'examinerai cela plus tard ou demain.la source
J - 60 car
Utilise la méthode next-prime comme les autres réponses. (C'est le
4 p:
peu.)Un petit truc en J mignon, c'est
f :g
commef
si on lui donnait un argument et qu'ong
en donnait deux. Donc, si vous écrivez, ditesf :;'a'f :;'a'f :;'a'
alors que cela agit commef'a';'a';'a'
, ce qui est génial parce que c'est une liste encadrée dont les éléments sont'a'
et dont la longueur est le nombre d'occurrences.Nous pouvons donc transformer cela en une sorte de chose quiney. Le que
f
nous utilisons ressemble(foo $~ bar)
, oùfoo
construit la partie chaîne que nous répétons encore et encore,bar
trouve le nombre premier suivant et le multiplie par 60, la longueur de la chaînefoo
.la source
Python 2.7, 214
la source