Raccourcir un nombre long

10

Lorsque vous traitez des numéros longs lorsque vous jouez au code, il peut être difficile de réduire la longueur de votre code.Avez-vous donc des conseils pour raccourcir et faciliter la gestion d'un numéro?

Par exemple, le code Pyth suivant affiche "Hello world", mais à 44 octets, cela n'est pas satisfaisant:

Vcjkj85942000775441864767076 2 7=k+kCiN2)k

Alors, comment pourrais-je raccourcir le nombre long 85942000775441864767076,?

Beta Decay
la source

Réponses:

10

Moment idéal pour cette question. @isaacg vient d'ajouter une nouvelle fonctionnalité aujourd'hui, qui permet de raccourcir considérablement ces nombres.

La technique de base consiste à convertir le nombre en base 256 et à le convertir en caractères. Vous pouvez le faire en utilisant le code ++NsCMjQ256N. Vous pouvez ensuite utiliser la chaîne résultante en combinaison avec C, ce qui fait exactement le contraire (convertir les caractères en int et interpréter le résultat comme un nombre en base 256). Ainsi , vous obtenez 13 caractères: C"2ìÙ½}ü¶d". Certains des caractères ne sont pas imprimables.

Mais remarquez que j'ai dit 13 caractères, pas des octets. Si je copie les caractères et les compte avec https://mothereff.in/byte-counter , cela dit 13 caractères et 18 octets. Cela est dû au codage des caractères des caractères, qui est UTF-8 par défaut. Et UTF-8 n'autorise que 2 ^ 7 caractères 1 octet différents. Chaque omble chevalier cavec ord(c) > 127obtient effectivement stockée à l' aide de deux octets au lieu d'un.

Et voici la nouvelle fonctionnalité de @ isaacg en jeu. Il a changé le format de code par défaut d'UTF-8 en iso-8859-1. l'iso-8859 peut représenter 256 caractères avec seulement 1 octet. Alors maintenant, vous pouvez réellement atteindre 13 octets. Cependant, cela n'est possible qu'avec le compilateur standard , cela ne fonctionne pas dans le compilateur en ligne.

D' abord , vous voulez convertir le nombre en hexadécimal valeurs en utilisant ce script: jdm.[2.Hd"0"jQ256. Cela vous donne 12 32 ec d9 bd 07 7d fc b6 64. Copiez ensuite ces numéros dans votre fichier de code à l'aide d'un éditeur hexadécimal (par exemple hexedit pour linux).

démonstration hexedit

Remarquer:

  • Évidemment, vous supprimez le "à la fin, si la chaîne est la dernière partie du code.
  • Cela ne fonctionne que s'il n'y a pas 34(l'octet 22) dans la représentation en base 256 de vos nombres, car c'est le caractère "et mettra fin à la chaîne. Échapper fonctionne cependant ( 5C 22).
  • Btw, lorsque vous ouvrez un fichier avec un éditeur hexadécimal, vous verrez probablement l'octet 0Aou 0d 0aà la fin, que vous pouvez supprimer. Cela indique seulement la fin de la ligne.
Jakube
la source
Je vais devoir mettre l'interprète hors ligne sur ma machine, mais c'est génial, merci! :)
Beta Decay
1
La chaîne ne peut pas non plus inclure l'octet nul de valeur 00. De plus, l' \octet 5cpeut ou non devoir être échappé avec un autre ``, selon l'octet qui le suit.
isaacg