Votre travail consiste à créer le quine d'itération de la période la plus longue , où la longueur de chaque programme de la séquence est limitée à 500 octets.
Autrement dit, si vous répétez les étapes suivantes:
- Commencez avec votre programme initial
- Exécuter le programme actuel
- Revenez à l'étape 2
Vous finirez par revenir à votre programme d'origine. Le nombre de programmes dans le cycle est votre score, que vous essayez de maximiser.
Aucun des programmes ne peut générer d'erreurs. Chaque programme doit également être exécuté de la même manière (par exemple, pas de versions, implémentations, options de compilateur, plates-formes, etc ...) différentes (EDIT: Oui, tout état externe tel que celui d'un générateur de nombres pseudo aléatoires a été inclus dans le dernier . L'état externe doit être "réinitialisé" après chaque exécution. Si vous utilisez de vrais nombres aléatoires, le pire des cas est supposé.)
Ce qui sépare ce défi de la période d'itération la plus longue (autre que 100 vs 500) est que chaque programme du cycle doit également être de 500 octets ou moins. Cela signifie que le cycle le plus long possible est (256 ^ 501 - 1) / 255 ou moins. C'est bien sûr un grand nombre, mais pas si grand en termes de quantité de code qu'il faut pour calculer. Le défi consiste donc à utiliser autant de possibilités (256 ^ 501 - 1) / 255 que possible, pas un défi de castor occupé.
Les programmes ne sont pas autorisés à accéder à son propre code source. Cependant, un programme vide est autorisé si vous le souhaitez (tant que vous suivez les autres règles).
Étant donné que la vérification manuelle des programmes serait difficile, vous pouvez déterminer le score à l'aide de méthodes théoriques. Vous devez inclure une explication du score et de l'exactitude avec votre programme. Si vous ne pouvez pas déterminer le score, vous pouvez utiliser à la place une limite inférieure du nombre de programmes dans le cycle comme score de facto. Vous êtes autorisé à le mettre à jour lorsque vous trouvez de meilleures limites inférieures ou si vous trouvez le score réel exact.
C'est un défi de code , donc le score le plus élevé gagne!
EDIT: Il est recommandé d'écrire votre score en notation scientifique, afin que les réponses soient plus facilement comparables. Il est tout à fait correct d'avoir également d'autres formes de partition, surtout si elles sont plus clairement liées à votre programme. De plus, les lecteurs sont encouragés à modifier les réponses précédentes pour s'y conformer.
la source
Réponses:
Perl 6 ,126398≈ 8,86 × 10835 itérations
Essayez-le en ligne!
Cela parcourt toutes les combinaisons possibles des 126 premiers octets de longueur 398 et moins (à l'exclusion des chaînes avec des octets NUL de tête). Si vous voulez voir qu'il retourne réellement à la première itération, vous pouvez réduire la longueur à 1 en modifiant la limite comme ceci .
Explication:
Chaque itération incrémente la chaîne, stockée sous forme de base 126, puis la reconvertit en base 126. Elle le fait jusqu'à ce qu'elle atteigne une chaîne de longueur 399, puis réinitialise la chaîne pour la vider à nouveau. Si vous avez du mal à conceptualiser le nombre, imaginez-le à la place avec dix octets. À partir dedix4 - 1 itérations (
0
, incrémentez jusqu'à 4 chiffres1000
et réinitialisez. Il s'agit de0
chaîne incluse ou vide dans le cas de mon programme).la source
Enchantements runiques ,
64654 106; 122 387 -1 ≈ 2.638 × 10 807 itérationsEssayez-le en ligne!
Alerte: le
€
n'est pas affiché correctement, il devrait être `` (0x80).Plutôt que la pile, utilisez une chaîne et les opérateurs de pile modifiés avec
͍
pour modifier une chaîne plutôt que la pile (voir la révision précédente). En tant que tel, chaque caractère est limité à 1 octet (plage de 0 à 127, moins les caractères problématiques), mais avec plus de 3 fois plus (car il y a moins de passe-partout de traitement en raison de ne pas avoir à ignorer les caractères de combinaison Unicode, comme ainsi que certaines autres économies d'octets), il atteint un plus grand nombre d'itérations.Si le codage en tant que vrai gros endian est autorisé (c'est-à-dire, ayant des valeurs d'octets supérieures à 127 sans
0x00
octets d' interjection ), cela peut atteindre 251 387 -1 ≈ 4,717 × 10 928 itérations. Cependant, l'encodage latin de TIO empêche cela, comme l'a noté Erik l'Outgolfer dans sa réponse Python 2. Je devrais vérifier si cela fonctionne localement avant de réclamer ce score.Devrait être en mesure de remplacer
f1+0B
par'0B
(il y a une non-impression0x16
là-bas), mais il me combattait (les choses ne voulaient pas se / sauter / retourner correctement), alors je l'ai laissé seul. Cela ferait passer la structure big-endian de 387 à 388.la source
DOS COM, 49 octets, période 2 ^ 3608
Assemblage d'origine pour créer:
Ce petit bijou écrit la prochaine phase sur q.com plutôt que la sortie standard à cause des valeurs nulles et autres choses que le terminal ne peut pas gérer. La technique de racine quine est équivalente à la stringification et la salle de charge utile est utilisée comme compteur 3608 bits. En raison du fonctionnement de DOS, l'état initial du compteur contient des débris de tout ce qui était en mémoire avant sa première exécution.
L'entrée originale de 49 octets est inaccessible, donc si vous voulez marquer cela comme 500 octets, allez-y.
la source
C # (compilateur interactif Visual C #) , indicateurs:
/u:System.Numerics.BigInteger
et/r:System.Numerics
Résultat: 10 10332
Merci à JoKing qui a augmenté mon score de 10 255 * 2 - 1 à maintenant!
Essayez-le en ligne!
Explication
Incrémente un BigInteger à chaque itération, jusqu'à ce que sa longueur devienne trop grande, ce qui dans ce cas nous ramène instantanément au quine d'origine.
la source
Python 2 , 500 octets,252219
Notez qu'il existe une nouvelle ligne de fin. Il pourrait être supprimé ci-dessus si le surligneur de syntaxe s'impose.
Malheureusement, vous ne pouvez pas exécuter ce programme dans TIO, car il est codé en latin-1.
Ci-dessus,
s
contient 219 0x01 octets. Après l'exécution du programme, sa source est imprimée, à l'exception d'une différence:s
a été incrémenté comme un nombre big-endian base-252, donc son caractère le plus à gauche a été "incrémenté" à 0x02. Les octets 0x00, 0x22, 0x25 et 0x5C sont évités, donc, si un caractère de la chaîne devient l'un de ceux après l'incrémentation, le caractère lui-même est incrémenté à nouveau."
): il y a un danger de formation de trois octets 0x22 d'affilée, c'est-à-dire"""
, ou le dernier caractère de la chaîne devenant"
, donc la chaîne serait fermée prématurément.%
): le formatage de chaîne de type printf est utilisé avant l'achèvement du squelette de quine, donc un%
non adjacent à un autre%
danss
va causer des problèmes. Malheureusement, il n'est pas possible de réorganiser le formatage pour éviter cette mise en garde.\
): Il est possible que le\
soit utilisé comme marque d'échappement dans la chaîne, au lieu de mot pour mot, donc il est évité.Par conséquent, 252 octets sur 256 sont utilisables. Si
s
contient 219 0xFF (ÿ
) octets, il est simplement revenu à 219 0x01 octets, terminant ainsi le cycle.Compte tenu de ce qui précède, nous avons252219 chaînes possibles, donc autant de programmes dans l'ensemble.
la source
Clean ,251226≈ 2,1 × 10542
251 39dépendance suppriméeText
251 122fonction d'incrémentation golfée251 128chaînes sources combinées de préfixe et de suffixe251 188dépendance éliminée surGast.GenLibTest
Présenté au format xxd en raison de UTF-8 non imprimables / non valides:
Essayez-le en ligne!
Incrémente une chaîne 226 octets par toutes les valeurs d'octets hors
\0
,\n
,\r
,'
et\
.La raison pour laquelle nous évitons ces caractères est:
\0
met le compilateur en colère\n
et\r
ne peut pas apparaître dans les listes de caractères'
mettrait fin à la liste des caractères\
pourrait causer des problèmes s'il précède un caractère échappableUne fois la chaîne
\377
terminée, elle s'enroule sur tous les\001
s, donnant le programme d'origine.la source
C2 80
. Est-ce le même que le comportement sur votre machine locale?Gol> <> , 70 octets, 39039000 itérations
Wow, c'est beaucoup plus bas que je ne le pensais ... Prochaine étape! Faire plus d'itérations !!!
Essayez-le en ligne!
la source