Votre tâche consiste à écrire un programme ou une fonction qui:
- Lorsqu'il est exécuté pour la première fois, génère son code source.
Lors des exécutions ultérieures, il devrait sortir ce qu'il a sorti précédemment, mais avec un changement de caractère aléatoire (défini ci-dessous). Il n'est pas nécessaire que ce soit un changement uniformément aléatoire, mais chaque changement possible devrait avoir une chance non nulle de se produire.
Après la première exécution, votre programme ne sera plus nécessairement une quine; la sortie aura changé (et le programme est libre de se modifier également).
Par exemple, si votre quine l'était ABCD
, son exécution répétée pourrait imprimer:
ABCD
A!CD
j!CD
j!CjD
Caractéristiques
Un changement de caractère est soit:
- L'insertion d'un caractère aléatoire,
- La suppression d'un caractère aléatoire, ou
- Un remplacement d'un personnage par un nouveau personnage aléatoire. Notez que le nouveau caractère peut être identique à celui qu'il remplace, auquel cas aucune modification ne sera effectuée.
Bien sûr, la suppression ou le remplacement d'un caractère d'une chaîne vide n'est pas une modification valide.
- Bien que cela soit étiqueté quine , les règles contre la lecture de votre code source ne s'appliquent pas.
Vous pouvez utiliser n'importe quel jeu de caractères tant qu'il comprend les caractères utilisés dans votre code source.
Réponses:
Python 3 ,
288 270 224 212 195 196 194 180 178168 168 octetsEssayez-le en ligne!
Après avoir imprimé le code source du fichier lors de la première itération, nous ajoutons une ligne supplémentaire pour définir x au nouveau code source, plutôt que m.
Explication:
En supposant que
hash
renvoie un nombre uniformément aléatoire, il y a environ 1/6 chance d'insérer un nouveau personnage, 1/6 chance de changer un personnage existant et 2/6 chance de supprimer un personnage. Quelle est la chance sur 2/6 que vous demandez? Mais ça ne fait rien du tout 2/6 du temps!(Voici un programme de validation adapté des réponses de mbomb007 . Essayez-le en ligne! )
la source
f=__file__
cela aiderait aussi dans la première étape.Python 3 ,
205195 octetsEssayez-le en ligne!
Je voulais essayer une version qui ne lit pas le code source. S'est avéré pas mal comme je le pensais, et il n'y a que 30 octets derrière la version qui le fait . L'explication de son fonctionnement est essentiellement la même que celle de l'autre réponse, mais elle initialise x différemment car elle ne peut pas simplement lire le code source.
la source
Python 2 ,
779801 octetsBien que le défi ait été modifié pour montrer que la lecture de votre source est autorisée, je créais déjà ma solution sans cela. Donc, pour montrer que c'est possible, je l'ai terminé. Pas de lecture du fichier source:
Essayez-le en ligne! (Notez que cela ne modifiera pas la source. Vous devez l'exécuter localement pour que cela fonctionne)
Pour montrer que les transformations fonctionnent, voici un programme de test (actuellement mis en place pour prendre toujours
100
pourr
, et il imprime le résultat pour chaque combinaison den
etp
pour la liste initiale.)Explication:
La première ligne est votre quine classique, mais beaucoup plus longue pour tenir compte de ce qui vient après.
Importer pour des entiers aléatoires.
L
deviendra une liste d'ordinaux du code source, mais au départ c'est un entier qui n'est utilisé nulle part ailleurs dans la source pour permettre un remplacement de chaîne. Ouvrez le fichier pour écrire la nouvelle source. Lors des exécutions ultérieures, il s'ouvrira pour s'ajouter à la place.Supprimez les première et troisième lignes de code. Remplacez ce qui
4
précède par la liste des ordinaux.En morceaux:
if L>5:
- Ignore cette ligne lors de la première exécution. Plus tard,L
sera une liste, et cela s'exécutera. Je vais expliquer leexec
dernier, car il n'est pas exécuté la première fois.n
- Un nombre aléatoire 0-2. Ceci détermine quelle modification se produit (0 = insérer, 1 = remplacer, 2 = supprimer).p
- Une position aléatoire dans la liste où la modification se produira.r
- Un nombre aléatoire à insérer ou à remplacer dans la listef.write("%03d"*3%(n,p,r))
- Ajoutez les 3 aléas à la fin du fichier source. À chaque exécution, cela s'ajoutera à un entier qui code toutes les modifications apportées à la source initiale qui se sont produites.exec'b=[];h=%d...'%1...
- Obtenez les nombres aléatoires (trouvés après%1
lors des exécutions ultérieures), appliquez les modifications à la liste et imprimez.while~-h:b+=[h%%1000];h/=1000
- Construisez une liste des aléas générés jusqu'à présent, en tenant compte de l'interlignage1
, ce qui évite les problèmes avec les zéros non significatifs.while b:r,p,n=b[-3:];b=b[:-3]
- Attribuez les aléas pour cette itération.L=[L[:p]+L[p+1:],L[:p]+[r]+L[p+n:]][n<2if L else 1]
- (0 = insérer, 1 = remplacer, 2 = supprimer)print"".join(map(chr,L))
- Imprimez la source modifiée.la source
p
peut être la longueur de la chaîne. De plus, quel est le comportement avec une chaîne vide?Of course, deleting or replacing a character from an empty string is not a valid change
Java 10, 370 octets
Essayez-le en ligne.
Explication:
Explication générale:
quine -part:
s
contient le code source non formaté.%s
est utilisé pour entrer cette chaîne en elle-même avec les.format(...)
.%c
,%1$c
Et34
sont utilisés pour formater les guillemets doubles.%%
est utilisé pour formater le module%
).s.format(s,34,s)
met tout cela ensemble.Voici un programme de base Java quine.
Partie défi:
String s;
est le code source que nous modifierons au niveau de la classe.int r=s.length();r*=Math.random();
est utilisé pour sélectionner un index aléatoire du code source dans la plage[0, length_of_modified_source_code)
.char c=127;c*=Math.random();
est utilisé pour sélectionner un caractère ASCII aléatoire (y compris les non imprimables) dans la plage unicode[0, 126]
.c%3
est utilisé pour sélectionner une option aléatoire de 0, 1 ou 2. L'option 0 ajoutera le caractère aléatoire avant l'indexr
; l'option 1 remplacera le caractère à l'indexr
par le caractère aléatoire; et l'option 2 supprimera le caractère à l'indexr
.la source