Comprimir matrices de cadenas
ACTUALIZACIÓN: desde entonces, las herramientas incluidas en este consejo se han reescrito, mejorado e integrado en mi intérprete Japt . Para obtener los mejores resultados, se recomienda que use ese compresor sobre cualquiera de los que se relacionan a continuación. Revisaré este consejo cuando tenga más tiempo y lo reescribiré con el nuevo compresor en mente.
Introducción
Si tiene una serie de cadenas en su código, la forma más obvia de comprimirla sería ejecutar cada cadenaOc
individualmente. Para los fines de este consejo, trabajaremos con la matriz ["lollipop","marshmallow","nougat","oreo"]
, que inicialmente pesa 42 bytes. Ejecutar cada cadena Oc
nos da:
[`lo¥ipop`,`Ú\hÚaow`,`Í`,`eo`]
Eso es ahora 33 bytes, un ahorro decente.
Paso 1
Pero podemos hacerlo mejor. Si unimos la matriz a una cadena separada por una nueva línea, podemos deshacernos de los corchetes, comas y backticks extraños y dividirnos en una nueva línea para obtener nuestra matriz. La aplicación de eso a nuestra matriz de ejemplo nos da lo siguiente:
`lo¥ipop
Ú\hÚaow
Í
eo`·
Hasta 26 bytes ahora.
Paso 2
Pero , ¡podemos hacerlo mejor aún! Podríamos usar una letra minúscula para delimitar las cadenas en lugar de una nueva línea, que podría incluirse en la compresión. z
no se usa en ninguna de nuestras cadenas, así que dejemos eso y veamos cómo nos llevamos.
`lo¥ipopzÚ\hÚaowzÍzeo`qz
Ah, loco, no hay mejora allí; ¡Nuestro número de bytes ha aumentado en uno! Puede haber otra carta se puede usar, pero, dependiendo de sus cadenas, no puede haber un buen número para tratar - en nuestro ejemplo hay 11: b,c,d,f,j,k,q,v,x,y,z
. Probar cada uno sería bastante tedioso, que es donde entra esta práctica herramienta ; alimente sus cadenas separadas de nueva línea e intentará delimitar las cadenas con cada letra que no esté contenida en ninguna de ellas y generará:
- la cuerda comprimida más corta,
- el delimitador que usa, y
- su longitud
Ejecutar nuestras cadenas de muestra a través de él muestra que b
da los mejores resultados:
`lo¥ipáæqrÚaowbÍÞo`qb
Y ahí lo tienes, tenemos solo 24 bytes.
Paso 3
¡Pero podemos hacerlo aún mejor! Si el orden de las cadenas en su matriz no importa, tal vez haya una permutación diferente combinada con un delimitador diferente que podría funcionar incluso más corto. Sin embargo, probar cada posibilidad será mucho más tedioso. Con nuestras 4 cadenas, hay 24 permutaciones diferentes para probar. ¡Con cada una de las 11 letras posibles que se convierte en 264! Ahí es donde entra en juego esta herramienta . Nuevamente, alimente sus cadenas separadas de nueva línea e intentará cada combinación de cada permutación y cada letra delimitadora, dando como resultado:
- el orden de las cadenas en la cadena comprimida más corta,
- la cuerda comprimida
- el delimitador que usa, y
- su longitud
Ejecutar nuestras cadenas de muestra a través de él muestra que "nougat","oreo","lollipop","marshmallow"
con b
un delimitador se obtienen los mejores resultados, con un recuento final de bytes de solo 23:
`ÍÞo½o¥ipáæqrÚaow`qb
Consejo adicional: Compresión de matriz de enteros
Puede aplicar el mismo principio a las matrices de enteros convirtiendo primero cada una a una base más alta. Con esta muestra, matriz de 36 bytes:
[588181,156859,595676,475330,680474]
Podemos reducirlo a 29 bytes convirtiéndolo primero en una matriz de cadenas de base 32 y luego ejecutándolo a través del primer programa de compresión:
`huclt4p5r5ÛÊg62tkogq`qt mnH
O tan bajo como 27 bytes usando el segundo programa:
`4p5Ïcl5ÛÊg62tkogq`qt mnH
Es posible que pueda guardar otro byte o 2 además de eso moviendo la conversión entera a un método que ya esté ejecutando en la matriz.
Notas
- No olvide tener en cuenta el
q<letter>(<space>)
costo adicional de 1 o 2 bytes adicionales ·
. Sin embargo, es posible que pueda usar uno de los accesos directos de Unicode para recuperar un byte, dependiendo de su delimitador ( qÊ
es lo mismo queql<space>
, por ejemplo).
- Una palabra de precaución al usar la última herramienta: cuantas más cadenas tenga, más permutaciones habrá y más lento se ejecutará el programa, hasta que finalmente se caiga. Como se detalla anteriormente, con nuestras 4 cadenas de muestra y 11 letras posibles para probar, hay 264 combinaciones posibles, aumente el número de cadenas en solo 1 con las mismas 11 letras y ya tenemos 1320 combinaciones para probar. (Si lo desea, puede usar esta herramienta para contar la cantidad de combinaciones).
Créditos
- Oliver por la inspiración para crear las herramientas que se encuentran en este consejo.
- ETHproducciones para corrección de pruebas.