Compression de tableaux de chaînes
MISE À JOUR: Les outils présentés dans cette astuce ont depuis été réécrits, améliorés et intégrés dans mon interpréteur Japt . Pour les meilleurs résultats, il est recommandé d'utiliser ce compresseur par rapport à ceux liés ci-dessous. Je reviendrai sur cette astuce quand j'aurai plus de temps et je la réécrirai en pensant au nouveau compresseur.
introduction
Si vous avez un tableau de chaînes dans votre code, le moyen le plus évident de le compresser serait d' exécuter chaque chaîneOc
individuellement. Pour les besoins de cette astuce, nous allons travailler avec le tableau ["lollipop","marshmallow","nougat","oreo"]
, qui pèse initialement 42 octets. L'exécution de chaque chaîne Oc
nous donne:
[`lo¥ipop`,`Ú\hÚaow`,`Í`,`eo`]
C'est maintenant 33 octets, une économie décente.
Étape 1
Mais nous pouvons faire mieux. Si nous joignons le tableau à une chaîne séparée par des sauts de ligne, nous pouvons nous débarrasser des crochets, des virgules et des raccourcis superflus et nous séparer sur le saut de ligne pour obtenir notre tableau. Appliquer cela à notre exemple de tableau nous donne ce qui suit:
`lo¥ipop
Ú\hÚaow
Í
eo`·
Jusqu'à 26 octets maintenant.
Étape 2
Mais , on peut encore faire mieux! Nous pourrions utiliser une lettre minuscule pour délimiter les chaînes au lieu d'une nouvelle ligne, qui pourrait être incluse dans la compression. z
n'est utilisé dans aucune de nos chaînes, alors allons-y et voyons comment nous allons.
`lo¥ipopzÚ\hÚaowzÍzeo`qz
Ah, les noix - aucune amélioration là-bas; notre nombre d'octets a augmenté de un! Il pourrait y avoir une autre lettre que vous pouvez utiliser , mais, en fonction de vos chaînes, il pourrait y avoir un assez grand nombre pour essayer - dans notre exemple , il y a 11: b,c,d,f,j,k,q,v,x,y,z
. Essayer chacun serait assez fastidieux, c'est là que cet outil pratique entre en jeu; alimentez-le avec vos chaînes séparées par des sauts de ligne et il essaiera de délimiter les chaînes avec chaque lettre qui n'est contenue dans aucune d'entre elles et affichera:
- la chaîne compressée la plus courte,
- le délimiteur qu'il utilise, et
- sa longueur.
L'exécution de nos exemples de chaînes montre que cela b
donne les meilleurs résultats:
`lo¥ipáæqrÚaowbÍÞo`qb
Et voilà, nous sommes à seulement 24 octets.
Étape 3
Mais nous pouvons faire encore mieux! Si l'ordre des chaînes dans votre tableau n'a pas d'importance, il y a peut-être une permutation différente combinée à un délimiteur différent qui pourrait fonctionner encore plus court. Essayer chaque possibilité sera cependant beaucoup plus fastidieux. Avec nos 4 cordes, il y a 24 permutations différentes à essayer. Avec chacune des 11 lettres possibles cela devient 264! C'est là que cet outil entre en jeu. Encore une fois, alimentez-le avec vos chaînes séparées par une nouvelle ligne et il essaiera toutes les combinaisons de chaque permutation et de chaque lettre de délimitation, produisant:
- l'ordre des chaînes dans la chaîne compressée la plus courte,
- la chaîne compressée,
- le délimiteur qu'il utilise, et,
- sa longueur.
L'exécution de nos exemples de chaînes montre que "nougat","oreo","lollipop","marshmallow"
avec b
comme délimiteur donne les meilleurs résultats, avec un nombre d'octets final de seulement 23:
`ÍÞo½o¥ipáæqrÚaow`qb
Astuce bonus: Compression de tableau entier
Vous pouvez appliquer le même principe aux tableaux d'entiers en convertissant d'abord chacun en une base plus élevée. En utilisant cet exemple, tableau de 36 octets:
[588181,156859,595676,475330,680474]
Nous pouvons réduire cela à 29 octets en le convertissant d'abord en un tableau de chaînes de base 32, puis en l'exécutant via le premier programme de compression:
`huclt4p5r5ÛÊg62tkogq`qt mnH
Ou aussi peu que 27 octets en utilisant le deuxième programme:
`4p5Ïcl5ÛÊg62tkogq`qt mnH
Vous pouvez peut-être enregistrer un autre octet ou 2 en plus en déplaçant la conversion d'entier dans une méthode que vous exécutez déjà sur le tableau.
Remarques
- N'oubliez pas de prendre en compte les
q<letter>(<space>)
coûts de 1 ou 2 octets supplémentaires ·
. Cependant, vous pouvez peut-être utiliser l'un des raccourcis Unicode pour récupérer un octet, en fonction de votre délimiteur ( qÊ
identique à ql<space>
, par exemple).
- Un mot de prudence lors de l'utilisation du dernier outil: plus vous avez de chaînes, plus il y aura de permutations et plus le programme s'exécutera lentement, jusqu'à ce qu'il finisse par craquer. Comme détaillé ci-dessus, avec nos 4 exemples de chaînes et 11 lettres possibles à essayer, il y a 264 combinaisons possibles, augmentez le nombre de chaînes de seulement 1 avec les mêmes 11 lettres et nous avons déjà 1320 combinaisons à essayer. (Vous pouvez utiliser cet outil pour compter le nombre de combinaisons, si vous le souhaitez).
Crédits
- Oliver pour l'inspiration pour créer les outils trouvés dans cette astuce.
- ETHproductions pour la relecture.