Votre tâche consiste à créer un programme qui imprime sa propre source.
"Hé, nous avons déjà ce défi, et des tonnes de variations! Pourquoi en fais-tu un autre?" vous pouvez demander, mais celui-ci va être l'un des plus difficiles (espérons-le, de toute façon).
Votre quine doit être «renforcé contre les mutations», ce qui signifie que le quine, même lorsque l'un de ses caractères est dupliqué, doit sortir le code source du programme d'origine.
Par exemple, si vous avez un quine (l'exemple suivant n'est écrit dans aucune langue, c'est juste un pseudocode):
abcd
Ces programmes doivent tous produire abcd
:
aabcd
abbcd
abccd
abcdd
(Dans chacun de ces programmes, a
, b
, c
et d
sont chacun dupliquée en place, ce qui signifie que le caractère dupliquée a été placé directement après le caractère original.)
Règles:
- Les règles de quine standard s'appliquent.
- Un caractère multi-octets compte comme un caractère et le caractère n'est pas "divisé" en ses octets respectifs lorsqu'il est dupliqué.
C'est le code-golf , donc le code le plus court en octets gagne!
la source
0
et00
dans CJam les deux sorties0
.0
n'est pas une bonne quine.Réponses:
> <> , 56 octets
Essayez-le en ligne! ou vérifier toutes les mutations .
Fonctionnement du programme d'origine (obsolète)
L'interpréteur démarre dans la cellule (0, 0) .
^
définit la direction vers le haut , de sorte que le pointeur d'instruction (IP) s'enroule autour de la cellule (0, 20) .'
active le mode chaîne: jusqu'à ce que le suivant'
soit rencontré, tous les caractères sous l'IP sont poussés sur la pile. La même chose'
se retrouve après avoir enroulé autour, donc nous poussonsL'IP atterrit à (0, 19) , toujours en montant. L'exécution
d3*}
pousse 13 = 0xd , puis 3 , multiplie les deux valeurs ( 39 / guillemet simple ), puis fait pivoter la pile vers la droite. Cela laisse la pile comme suit.Les deux instructions suivantes (
^
) ne font rien à ce stade.:84*=
duplique le haut de la pile, pousse 8 et 4 , les multiplie ( 32 / espace ), puis teste l'égalité du caractère dupliqué avec l' espace . Pour le programme inchangé, cela poussera toujours 0 .?
ignore l'instruction suivante si le haut de la pile est faux. Pour le programme d'origine, il l'est toujours, il~
est donc toujours ignoré.oao
saute et imprime le haut de la pile, pousse un 10 / saut de ligne , puis saute et imprime le saut de ligne .0f.
Saute enfin à la cellule (0, 15) (le plus bas^
), en recommençant avec le caractère suivant sur la pile.Une fois la pile vide, tout le code source a été imprimé.
:
échouera et le programme se fermera.Fonctionnement des programmes mutés (obsolète)
La duplication de tout caractère non saut de ligne ne fera qu'étendre le programme horizontalement. Puisque le programme est exécuté verticalement, ces instructions supplémentaires ne seront jamais exécutées.
Dupliquer n'importe quel saut de ligne avant le plus bas
^
déplacera les cellules (0, 14) et (0, 15) vers (0, 15) et (0, 16) .0f.
va maintenant sauter à la cellule avant le plus bas^
, qui est également un^
, donc le programme n'est pas affecté par le décalage.Enfin, tout caractère de saut de ligne dupliqué modifiera également la chaîne. Les lignes courtes sont remplies d'espaces, donc un espace de 32 / sera inséré à la position du saut de ligne. poussera 1 pour l'espace, donc ne saute pas l'instruction suivante. Dans ce cas, saute et supprime l' espace , donc ce qui suit imprimera le caractère au-dessus de l' espace à la place.
84*=
?
~
o
la source