Quine endurci par les mutations

14

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, cet dsont 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 , donc le code le plus court en octets gagne!

clismique
la source
Est-ce que cela compte? 0et 00dans CJam les deux sorties 0.
geokavel
Non, ce 0n'est pas une bonne quine.
Dennis
2
Je pense que ce serait très intéressant comme code-bowling
M. Xcoder
Le problème de la mutation du code est-il résolu en général? à moins que la mutation n'arrive à un caractère à l'intérieur d'une chaîne entre guillemets, cela corromprait généralement le programme.
hasen
Le titre n'est-il pas un peu trompeur? "Mutation" suggère de modifier un personnage, pas de le répéter
Luis Mendo

Réponses:

18

> <> , 56 octets

^
.
+
8
f
0
o
a
o
~
:
?
~
:
?
:
-
*
4
8
:
^
^
}
*
3
d
'

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 poussons

d3*}^^:84*=?~oao0f.^

L'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.

'd3*}^^:84*=?~oao0f.^

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é.

oaosaute 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

Dennis
la source
Vous pouvez dupliquer n'importe quelle nouvelle ligne et cela fonctionnera toujours.
Dennis
3
Oh, je n'ai pas lu le post correctement: P (Dammit Dennis, pourquoi êtes-vous si bon)
clismique
4
Fissuré.
jimmy23013
@ jimmy23013 Doit être corrigé.
Dennis