Compressione di array di stringhe
AGGIORNAMENTO: Da allora gli strumenti presenti in questo suggerimento sono stati riscritti, migliorati e integrati nel mio interprete Japt . Per i migliori risultati si consiglia di utilizzare quel compressore su uno di quelli collegati di seguito. Rivisiterò questo suggerimento quando avrò ancora un po 'di tempo e lo riscriverò pensando al nuovo compressore.
introduzione
Se hai una matrice di stringhe nel tuo codice, il modo più ovvio per comprimerlo sarebbe quello di eseguire ciascuna stringaOc
singolarmente. Ai fini di questo suggerimento, lavoreremo con l'array ["lollipop","marshmallow","nougat","oreo"]
, che inizialmente ha un peso di 42 byte. L'esecuzione di ogni stringa Oc
ci dà:
[`lo¥ipop`,`Ú\hÚaow`,`Í`,`eo`]
Adesso sono 33 byte, un risparmio decente.
Passo 1
Ma possiamo fare di meglio. Se uniamo l'array a una stringa separata newline, possiamo eliminare parentesi, virgole e backtick estranei e dividere su newline per ottenere il nostro array. Applicandolo al nostro array di esempio ci viene fornito quanto segue:
`lo¥ipop
Ú\hÚaow
Í
eo`·
Fino a 26 byte ora.
Passo 2
Ma possiamo fare ancora meglio! Potremmo usare una lettera minuscola per delimitare le stringhe anziché una nuova riga, che potrebbe essere inclusa nella compressione. z
non viene utilizzato in nessuna delle nostre stringhe, quindi inseriamolo e vediamo come andiamo avanti.
`lo¥ipopzÚ\hÚaowzÍzeo`qz
Ah, noccioline - nessun miglioramento lì; il nostro numero di byte è aumentato di uno! Ci potrebbe essere un'altra lettera si potrebbe usare, ma, a seconda delle vostre corde, ci potrebbe essere un bel po 'per provare - nel nostro esempio ci sono 11: b,c,d,f,j,k,q,v,x,y,z
. Provare ciascuno sarebbe piuttosto noioso, ed è qui che entra in gioco questo pratico strumento ; dategli le vostre stringhe separate di nuova riga e proverà a delimitare le stringhe con ogni lettera che non è contenuta in nessuna di esse e l'output:
- la stringa compressa più corta,
- il delimitatore che utilizza e
- la sua lunghezza.
L'esecuzione delle stringhe di esempio attraverso di essa mostra che b
offre i migliori risultati:
`lo¥ipáæqrÚaowbÍÞo`qb
E il gioco è fatto, siamo a soli 24 byte.
Passaggio 3
Ma possiamo fare ancora meglio! Se l'ordine delle stringhe nel tuo array non ha importanza, forse c'è una permutazione diversa combinata con un delimitatore diverso che potrebbe funzionare ancora più breve. Tuttavia, provare ogni possibilità sarà molto più noioso. Con le nostre 4 corde, ci sono 24 diverse permutazioni da provare. Con ognuna delle 11 possibili lettere che diventano 264! È qui che entra in gioco questo strumento . Ancora una volta, alimentalo con le tue stringhe separate di nuova riga e proverà ogni combinazione di ogni permutazione e ogni lettera di delimitazione, producendo:
- l'ordine delle stringhe nella stringa compressa più corta,
- la stringa compressa,
- il delimitatore che utilizza e
- la sua lunghezza.
L'esecuzione delle stringhe di esempio attraverso di essa mostra che "nougat","oreo","lollipop","marshmallow"
con b
come delimitatore si ottengono i risultati migliori, con un conteggio finale di byte di soli 23:
`ÍÞo½o¥ipáæqrÚaow`qb
Suggerimento bonus: Compressione array intero
È possibile applicare lo stesso principio alle matrici di numeri interi convertendoli prima in una base superiore. Utilizzando questo esempio, array di 36 byte:
[588181,156859,595676,475330,680474]
Possiamo ottenere questo fino a 29 byte convertendolo prima in un array di stringhe di base 32 e quindi eseguendolo attraverso il primo programma di compressione:
`huclt4p5r5ÛÊg62tkogq`qt mnH
O a partire da 27 byte usando il secondo programma:
`4p5Ïcl5ÛÊg62tkogq`qt mnH
Potresti essere in grado di salvare un altro byte o 2 in più spostando la conversione di numeri interi in un metodo che stai già eseguendo sull'array.
Appunti
- Non dimenticare di tenere conto dei
q<letter>(<space>)
costi di 1 o 2 byte extra ·
. Tuttavia, potresti essere in grado di utilizzare una delle scorciatoie Unicode per recuperare un byte, a seconda del delimitatore ( qÊ
è lo stesso ql<space>
, ad esempio).
- Un avvertimento quando si utilizza l'ultimo strumento: più stringhe si hanno, più permutazioni ci saranno e più lento verrà eseguito il programma, fino a quando non si esaurisce. Come spiegato sopra, con le nostre 4 stringhe di esempio e 11 possibili lettere da provare, ci sono 264 combinazioni possibili, aumentare il numero di stringhe di solo 1 con le stesse 11 lettere e abbiamo già 1320 combinazioni da provare. (È possibile utilizzare questo strumento per contare il numero di combinazioni, se lo si desidera).
Titoli di coda
- Oliver per l'ispirazione per creare gli strumenti trovati in questo suggerimento.
- ETHproductions per la correzione di bozze.