Programme A :
"iQ ²¯24
G²õ@i'#+Xd"iQ ²¯24
G²õ@i'#+Xd
Le programme B fait plus de 8 Ko, si long que le lien se brise, donc je ne collerai pas le tout. Voici un exemple:
#þ"iQ ²¯24
G²õ@i'#+Xd"iQ ²,#ÿ"iQ ²¯24
G²õ@i'#+Xd"iQ ²,#Ā"iQ ²¯24
G²õ@i'#+Xd"iQ ²
Je ne pouvais pas trouver un moyen de faire fonctionner un NUL
octet, c'est pourquoi le programme B n'a que 255 caractères uniques. Le programme B consiste essentiellement en 255 copies d'un seul programme, où un seul octet non pertinent est changé à chaque fois, et les 254 premières exécutions sont ignorées.
Pour l'explication, je vais commencer par cette version simplifiée de A afin que le B résultant soit plus facile à discuter.
"iQ ²¯23
3õ@i'#+Xd"iQ ²¯23
3õ@i'#+Xd
Ce programme est basé sur le quine Japt de base capable de charge utile . La chaîne au début contient un doublon du reste du programme, iQ ²
insère une citation et des doublons pour créer une représentation sous forme de chaîne de l'ensemble du programme, puis se ¯23
coupe lui-même et tout ce qui se trouve après. La chaîne résultante est un programme qui génère le programme A :
"iQ ²¯23
3õ@i'#+Xd"iQ ²
Je ferai référence à cette chaîne comme U
.
La dernière ligne de A duplique U
un tas de fois avec un petit changement à chaque fois. Plus précisément, pour chaque numéro X
de la plage, [1...3]
il affiche "#c" + U
où se c
trouve le caractère avec le code de char X
. Le comportement par défaut de Japt est de sortir ces chaînes sans guillemets et séparées par des virgules, c'est donc la sortie de notre A simplifié (notez qu'il y a un octet non imprimable entre chaque #
et "iQ
:
#"iQ ²¯23
3õ@i'#+Xd"iQ ²,#"iQ ²¯23
3õ@i'#+Xd"iQ ²,#"iQ ²¯23
3õ@i'#+Xd"iQ ²
Nous l'appellerons B simplifié .
Le B simplifié a une structure simple, alternant entre #c
et U
. Heureusement pour cette réponse, chacun #c
et U
est traité comme séparé par une virgule, et dans cette situation, le comportement de tout est sauf le dernier U
n'a aucun effet sur la sortie. La seule partie de Simplified B qui affecte la sortie est la suivante:
"iQ ²¯23
3õ@i'#+Xd"iQ ²
Ce qui est identique à U
celui que nous connaissons déjà des sorties simplifiées A.
La seule différence entre Simplified A et Program A est qu'au lieu de générer des copies pour la plage, [1...3]
le programme réel génère des copies pour la plage [1...256]
. Cela se traduit par 256 versions de #c
chacune d'entre elles ayant un caractère différent, bien que la dernière version "Ā" soit un caractère multi-octets, de sorte qu'il n'ajoute aucun octet unique, mais tout sauf le dernier U
est toujours ignoré.