Corde da golf


22

Ho sempre fallito nel dare una risposta alle che richiedono la compressione delle stringhe, il motivo principale è che non so usare gli strumenti di compressione delle stringhe nel modo più efficace che dovrei .

Per questo motivo, ho pubblicato questa domanda. A differenza delle mie altre domande sui suggerimenti, questo non è un significato specifico della lingua che, se puoi pensare a qualche consiglio nella tua lingua, puoi pubblicarlo (a condizione che tu specifichi la lingua). Anche i suggerimenti generali sono apprezzati.

Quindi, come posso usare gli strumenti di compressione delle stringhe per la loro massima efficacia?

Risposte:


9

Conversione di base (CJam)

Un modo semplice per codificare stringhe ASCII che non iniziano con un byte null è quello di convertire dalla base 128 all'intero, quindi alla base 256:

128b256b:c              e# Prints encoded string.
128b256b:c`"256b128b:c" e# Prints encoded string with decoder.

Questo utilizza 7 bit per codificare ogni carattere ASCII.

Se la stringa originale è composta, ad esempio, da lettere minuscole e non inizia con una a , possiamo iniziare mappando "a...z"a [0 ... 25], quindi procedere come sopra:

'afm26b256b:c               e# Prints encoded string.
'afm26b256b:c`"256b26b'af+" e# Prints encoded string with decoder.

Infine, se la stringa originale ha solo pochi caratteri univoci (comuni nell'arte ASCII), di solito è meglio specificare l'alfabeto in modo esplicito.

Per esempio:

" +-/\|"f#6b256b:c                       e# Prints encoded string.
" +-/\|"f#6b256b:c`"256b6b"" +-/\|"`"f=" e# Prints encoded string with decoder.

Come regola empirica, si desidera che il primo carattere della stringa originale sia il secondo carattere dell'alfabeto, il successivo carattere distinto della stringa originale sia il primo carattere dell'alfabeto, il successivo carattere distinto della stringa originale a essere il terzo carattere dell'alfabeto, il successivo carattere distinto della stringa originale per essere il quarto carattere dell'alfabeto, ecc.

Il codificatore dell'ultimo esempio funziona come segue:

" +-/\|"f# e# Replace each character by its index in that string.
6b256b     e# Convert from base 6 (length of the alphabet) to base 256.
:c         e# Cast each digit to character.

Il decodificatore dell'ultimo esempio funziona come segue:

256b6b     e# Convert from base 256 to base 6.
" +-/\|"f= e# Replace each digit by the corresponding character of the alphabet.

2
Sarei più specifico: come regola empirica vuoi che il primo carattere della stringa originale sia il secondo carattere dell'alfabeto, il successivo carattere distinto della stringa originale sia il primo carattere dell'alfabeto, ...
Peter Taylor,

@PeterTaylor Aggiunto. Grazie!
Dennis

9

Le domande più complesse sulla complessità di Kolmogorov con una certa struttura ma nessuna formula semplice (ad esempio i testi delle canzoni) trarranno generalmente beneficio da un approccio basato sulla grammatica. In sostanza, estraete sottostringhe ripetute e le codificate in qualche modo. Questo è ciò che fa Lempel-Ziv, usando una classe di grammatiche abbastanza limitata; se usi grammatiche più generali, devi capire come codificare le regole. Ad esempio, un approccio qui è la "codifica offset", in cui si compensa ogni byte sorgente dal numero di regole ( n), si assegnano byte 1alle nregole, si usa il 0byte per separare le regole e si sostituisce ripetutamente byte icon la regola valutata i. Alla fine si annulla l'offset sottraendo nda ciascun byte.

In realtà ho scritto un programma Java che implementa vari approcci:

La maggior parte degli approcci segue un processo in due fasi. Nella prima fase la stringa viene convertita in una grammatica che la genera; nella seconda fase, la grammatica viene convertita in un programma GolfScript. Le implementazioni della prima fase sono in gran parte basate su Charikar, Lehman, Liu, Panigrahy, Prabhakaran, Sahai e Shelat (2005) Il più piccolo problema di grammatica , Teoria dell'informazione, Transazioni IEEE su, 51 (7), 2554-2576.

Include anche un approccio Lempel-Ziv, un approccio di codifica di base e un approccio di codifica della lunghezza di esecuzione e identifica quello che fornisce il programma più breve.


0

Stax

Nel linguaggio del golf Stax code, c'è un piccolo strumento utile chiamato il compressore letterale di stringa . Non so come funziona, esattamente, ma c'è un altro dove non so come funziona. Converte le stringhe in numeri, quindi in Base 256. È CP437 , con 0x00 e 0xFF convertiti per la copia. È PackedStax. Puoi convertire le tue stringhe con il compressore letterale di stringhe e poi impacchettarlo, per una buona compressione.

Utilizzando questo processo, la stringa "Questa stringa ha trentadue byte" può essere convertita in v * "A] - | W4]} 3"% (la stringa compressa è generalmente circondata da backtick per indicare la differenza tra una stringa normale in Stax ) e infine a üvìë! [JqJu ← ▓α per una compressione / riduzione di 18 byte, più della metà.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.