Faites une quine mais avec une torsion.
Déclaration
La quine imprime son code mais met son premier caractère à la fin.
(Vous pouvez le faire à l'envers mais inclure cette note dans votre réponse)
La sortie doit alors être un programme qui est aussi une solution.
Exemple: Supposons que votre code était foobar
, son exécution retournera oobarf
ce qui sera un autre programme valide.
foobar -> oobarf
oobarf -> obarfo
obarfo -> barfoo
barfoo -> arfoob
arfoob -> rfooba
rfooba -> foobar
Règles
- Votre code ne doit pas être une sortie d'une génération de code de quelqu'un d'autre qui est évidemment en train de voler
- Votre code doit comporter plus de 2 caractères (donc le code court n'est pas amusant)
- Votre code doit contenir au moins deux caractères différents (ex:
+++
n'est pas valide)
Notation
En tant que défi de golf par code, le code le plus court l'emporte.
Réponses:
Befunge-98 (PyFunge) , 2600 octets
Essayez-le en ligne!
Cela a été un enfer.
Comment cela fonctionne:
Le programme est un tas d'instructions put qui assemble un programme B autour de lui qui imprime ensuite la moitié de l'octet source décalé deux fois.
Le programme est en fait 2 copies d'un programme de 1300 octets, c'est ainsi qu'il est garanti que le programme entier de 1300 octets est toujours exécuté dans son ensemble.
Meilleure explication:
chaque quine Befunge-98 doit contenir des symboles tels que
@
ouq
et,
Problème : Aucun de ces symboles n'est un bon point de départ, surtout depuis
@
etq
arrête le programme instantanément.Solution : se débarrasser de ces caractères dans le code source
Problème : comment?
Solution : utilisez les
p
commandes (put) pour modifier le code source afin d'inclure les caractères requis qui imprimeront le contenu du code source décalé d'un octet et n'utilisez pas lag
commande qui triche.Problème : (soupire quand cela prendra-t-il fin)
Une commande put affiche 3 valeurs
n x y
qui déterminent le caractère, coordonnée x, coordonnée y, mais lorsque l'initialisation de ces valeurs est divisée en deux, elle peut écrire de mauvais caractères dans le code source de début, ce qui la rend inutile pour quining.Solution : (le dernier je le promets)
Utilisez 2 copies du code source, ce dernier étant le "bon" cela corrige accidentellement un autre problème qui est qu'une instruction put (commande p + les initialiseurs constants) qui est divisée en deux sera pas exécuté, ceci est corrigé en ayant 2 copies de chaque instruction. La dernière chose que cela doit fonctionner est de savoir comment fabriquer le code source entier à partir de la moitié?
Réponse :
C'est une preuve visuelle de la raison pour laquelle deux copies d'une chaîne décalée d'octets == Deux copies d'une chaîne décalée d'octets. Cela signifie que nous pouvons prendre la moitié du code, le déplacer en octets, puis l'imprimer deux fois (OU prendre la moitié du code, le déplacer en octets, imprimer, répéter [c'est ce qui se passe réellement])
Comment cela est mis en œuvre : Supposons que 0123456789abcdef est la source
Pseudocode Befunge:
PS signifie Print Stack (pas une vraie instruction). Nous poussons la moitié du code source à l'envers sur la pile en utilisant
""
ensuite nous imprimons la pile puis nous récupérons ('
commande) le premier caractère0
que nous déplaçons devant le'
et l'imprimons en dernier ce qui provoque le décalage d'octets, puis nous répétons le cycle encore une fois pour imprimer la deuxième copie. Une technicité à traiter sont les symboles à l'intérieur de la source, cela peut causer des problèmes si nous l'écrivons lors de l'exécution du code source, j'ai contourné cela en ajoutant plus d'instructions put qui s'en occupent en externe.Cela fait ressembler le code à ceci:
Explication : Surlignage
vert: Code qui prend en charge l'ajout de caractères dans les
lettres grises source (problème de mauvaise visibilité désolé): Code qui est ajouté par le code vert Surlignage
rouge: Code qui déplace le premier caractère de la seconde moitié du code source dans la zone bleue .
Surbrillance bleue: Voir Surbrillance rouge Surbrillance
orange: Code qui garantit que nous terminons après avoir écrit des copies décalées de 2 octets en plaçant une
@
commande (terminer) dans la zone jaune.Nous espérons que les flèches permettront de mieux comprendre le déroulement du flux de code.
Voici la dernière partie difficile: d'
où vient le code source des
bébés?Réponse courte: C # Magic
Réponse longue: 100+ extraits de code Befunge faits à la main compilés par du code C #. J'ai écrit manuellement environ 100 initialiseurs constants (un morceau de code befunge qui pousse un certain nombre à empiler) à la main, puis j'ai utilisé un programme C # personnalisé pour le compiler dans la sortie Befunge de 1300 octets, que j'ai ensuite copié collé deux fois et fait la finale programme.
Êtes-vous toujours là? Merci beaucoup d'avoir lu! (ou du moins faire défiler jusqu'à la fin)
J'espère que mes mauvaises blagues étaient amusantes et pas ennuyeuses.
Remarque: Aucune instruction put dans ce code ne crée une commande ag qui serait de la triche.
EDIT: J'ai vérifié le code en utilisant le code Javascript suivant dans TIO en utilisant des outils de développement
la source
p
des arguments incorrects est du génie.