Con la recente discussione sull'uso degli strumenti di compressione nel code golf , ho pensato che sarebbe stata una bella sfida scrivere il proprio compressore di testo e decompressore.
Sfida:
Scrivi due programmi : uno per comprimere il testo ASCII in una sequenza di byte e un altro per decomprimerlo. I programmi non devono necessariamente essere nella stessa lingua.
Il primo programma dovrebbe leggere un pezzo di testo ASCII (da un file o da un input standard, o usando qualunque meccanismo sia più naturale per la lingua) e produrre una versione compressa di esso. (L'output compresso può essere composto o byte arbitrari; non è necessario che sia leggibile.) Il secondo programma dovrebbe leggere l'output del primo e ricreare il testo di input originale.
punteggio:
Il punteggio di una soluzione sarà la somma dei seguenti tre conteggi:
- La lunghezza del programma del compressore in caratteri.
- La lunghezza dell'output del compressore, dato l'input di test di seguito, in byte.
- La lunghezza del programma di decompressione (se diverso dal compressore) in caratteri.
Dovresti notare tutti e tre i conteggi e la loro somma nella tua risposta. Poiché si tratta di codice golf, più basso è il punteggio, migliore è.
Regole e restrizioni:
Non è possibile utilizzare strumenti o librerie di compressione o decompressione preesistenti, anche se forniti in bundle con la lingua scelta. In caso di dubbi sul permesso di un determinato strumento o funzione, si prega di chiedere.
Il programma del compressore deve essere in grado di gestire input costituito da qualsiasi testo ASCII stampabile , comprese le schede (ASCII 9) e i feed di riga (ASCII 10). È possibile, ma non è necessario, gestire Unicode arbitrario e / o input binario.
Il programma di decompressione deve produrre esattamente lo stesso output fornito al compressore come input. In particolare, fare attenzione a non generare un feed di riga finale se l'input non ne aveva uno. (L'input di prova di seguito ha un feed di riga finale, quindi dovrai provarlo separatamente. Suggerimento per GolfScript:.
'':n
)Il compressore e il decompressore possono essere lo stesso programma (con la modalità appropriata selezionata, ad esempio con un interruttore della riga di comando). In tal caso, la sua lunghezza viene conteggiata una sola volta .
I programmi non dovrebbero essere eccessivamente lenti o affamati di memoria . Se comprimere o decomprimere l'input del test impiega più di un minuto sul mio desktop non così nuovo (2,2 GHz AMD Athlon64 X2) o consuma più di un gigabyte di RAM, la soluzione non sarà valida. Questi limiti sono volutamente lassisti, per favore cerca di non spingerli. (Vedi emendamento di seguito: devi essere in grado di gestire almeno 100 kB di input entro questi limiti.)
Anche se solo l'input di test è importante per il punteggio, dovresti almeno fare uno sforzo per comprimere il testo di input arbitrario. Una soluzione che raggiunge un rapporto di compressione decente solo per l'input del test, e per nient'altro, è tecnicamente valida ma non otterrà un mio voto.
I programmi del compressore e del decompressore devono essere autonomi . In particolare, se dipendono dalla capacità di leggere alcuni file o risorse di rete che non fanno parte dell'ambiente di runtime standard della lingua prescelta, la lunghezza di tale file o risorsa deve essere conteggiata come parte della lunghezza dei programmi. (Questo per impedire ai "compressori" che confrontano l'input con un file sul web e che producono zero byte se corrispondono. Mi dispiace, ma non è più un nuovo trucco.)
Emendamenti e chiarimenti:
Il compressore deve essere in grado di gestire file costituiti da almeno 100 kB di testo tipico inglese entro un tempo ragionevole e l'utilizzo della memoria (al massimo un minuto e un GB di memoria). Il decompressore deve essere in grado di decomprimere l'output risultante entro gli stessi limiti. Naturalmente, essere in grado di gestire i file più a lungo di quello è perfettamente bene e lodevole. Va bene suddividere i file di input lunghi in blocchi e comprimerli singolarmente o utilizzare altri mezzi per compromettere l'efficienza di compressione per la velocità per input lunghi.
Il compressore potrebbe richiedere che venga fornito il proprio input utilizzando la rappresentazione newline nativa della piattaforma preferita (LF, CR + LF, CR, ecc.), Purché il decompressore utilizzi la stessa rappresentazione newline nel proprio output. Naturalmente, va anche bene che il compressore accetti qualsiasi tipo di newline (o anche solo newline Unix indipendentemente dalla piattaforma), purché il tuo decompressore emetta lo stesso tipo di newline dell'input originale.
Test input:
Per valutare l'efficienza di compressione delle risposte, verrà utilizzato il seguente input di test ( The Raven di Edgar Allan Poe, per gentile concessione del Progetto Gutenberg ):
Once upon a midnight dreary, while I pondered, weak and weary,
Over many a quaint and curious volume of forgotten lore,
While I nodded, nearly napping, suddenly there came a tapping,
As of some one gently rapping, rapping at my chamber door.
"'T is some visiter," I muttered, "tapping at my chamber door--
Only this, and nothing more."
Ah, distinctly I remember it was in the bleak December,
And each separate dying ember wrought its ghost upon the floor.
Eagerly I wished the morrow:--vainly I had sought to borrow
From my books surcease of sorrow--sorrow for the lost Lenore--
For the rare and radiant maiden whom the angels name Lenore--
Nameless here for evermore.
And the silken sad uncertain rustling of each purple curtain
Thrilled me--filled me with fantastic terrors never felt before;
So that now, to still the beating of my heart, I stood repeating
"'T is some visiter entreating entrance at my chamber door
Some late visiter entreating entrance at my chamber door;--
This it is, and nothing more."
Presently my soul grew stronger; hesitating then no longer,
"Sir," said I, "or Madam, truly your forgiveness I implore;
But the fact is I was napping, and so gently you came rapping,
And so faintly you came tapping, tapping at my chamber door,
That I scarce was sure I heard you"--here I opened wide the door;--
Darkness there, and nothing more.
Deep into that darkness peering, long I stood there wondering, fearing,
Doubting, dreaming dreams no mortal ever dared to dream before;
But the silence was unbroken, and the darkness gave no token,
And the only word there spoken was the whispered word, "Lenore!"
This I whispered, and an echo murmured back the word, "Lenore!"
Merely this and nothing more.
Back into the chamber turning, all my soul within me burning,
Soon again I heard a tapping, somewhat louder than before.
"Surely," said I, "surely that is something at my window lattice;
Let me see, then, what thereat is, and this mystery explore--
Let my heart be still a moment and this mystery explore;--
'T is the wind and nothing more!"
Open here I flung the shutter, when, with many a flirt and flutter,
In there stepped a stately Raven of the saintly days of yore.
Not the least obeisance made he; not a minute stopped or stayed he;
But, with mien of lord or lady, perched above my chamber door--
Perched upon a bust of Pallas just above my chamber door--
Perched, and sat, and nothing more.
Then this ebony bird beguiling my sad fancy into smiling,
By the grave and stern decorum of the countenance it wore,
"Though thy crest be shorn and shaven, thou," I said, "art sure no craven,
Ghastly grim and ancient Raven wandering from the Nightly shore,--
Tell me what thy lordly name is on the Night's Plutonian shore!"
Quoth the Raven, "Nevermore."
Much I marvelled this ungainly fowl to hear discourse so plainly,
Though its answer little meaning--little relevancy bore;
For we cannot help agreeing that no living human being
Ever yet was blessed with seeing bird above his chamber door--
Bird or beast upon the sculptured bust above his chamber door,
With such name as "Nevermore."
But the Raven, sitting lonely on the placid bust, spoke only
That one word, as if his soul in that one word he did outpour.
Nothing further then he uttered--not a feather then he fluttered--
Till I scarcely more than muttered, "Other friends have flown before--
On the morrow _he_ will leave me, as my hopes have flown before."
Then the bird said, "Nevermore."
Startled at the stillness broken by reply so aptly spoken,
"Doubtless," said I, "what it utters is its only stock and store,
Caught from some unhappy master whom unmerciful Disaster
Followed fast and followed faster till his songs one burden bore--
Till the dirges of his Hope that melancholy burden bore
Of 'Never--nevermore.'"
But the Raven still beguiling all my sad soul into smiling,
Straight I wheeled a cushioned seat in front of bird and bust and door;
Then, upon the velvet sinking, I betook myself to linking
Fancy unto fancy, thinking what this ominous bird of yore--
What this grim, ungainly, ghastly, gaunt and ominous bird of yore
Meant in croaking "Nevermore."
This I sat engaged in guessing, but no syllable expressing
To the fowl whose fiery eyes now burned into my bosom's core;
This and more I sat divining, with my head at ease reclining
On the cushion's velvet lining that the lamplight gloated o'er,
But whose velvet violet lining with the lamplight gloating o'er
_She_ shall press, ah, nevermore!
Then, methought, the air grew denser, perfumed from an unseen censer
Swung by seraphim whose foot-falls tinkled on the tufted floor.
"Wretch," I cried, "thy God hath lent thee--by these angels he hath sent thee
Respite--respite and nepenthe from thy memories of Lenore!
Quaff, oh quaff this kind nepenthe, and forget this lost Lenore!"
Quoth the Raven, "Nevermore."
"Prophet!" said I, "thing of evil!--prophet still, if bird or devil!--
Whether Tempter sent, or whether tempest tossed thee here ashore,
Desolate yet all undaunted, on this desert land enchanted--
On this home by Horror haunted--tell me truly, I implore--
Is there--_is_ there balm in Gilead?--tell me--tell me, I implore!"
Quoth the Raven, "Nevermore."
"Prophet!" said I, "thing of evil--prophet still, if bird or devil!
By that Heaven that bends above, us--by that God we both adore--
Tell this soul with sorrow laden if, within the distant Aidenn,
It shall clasp a sainted maiden whom the angels name Lenore--
Clasp a rare and radiant maiden whom the angels name Lenore."
Quoth the Raven, "Nevermore."
"Be that word our sign of parting, bird or fiend!" I shrieked, upstarting--
"Get thee back into the tempest and the Night's Plutonian shore!
Leave no black plume as a token of that lie thy soul hath spoken!
Leave my loneliness unbroken!--quit the bust above my door!
Take thy beak from out my heart, and take thy form from off my door!"
Quoth the Raven, "Nevermore."
And the Raven, never flitting, still is sitting, still is sitting
On the pallid bust of Pallas just above my chamber door;
And his eyes have all the seeming of a demon's that is dreaming,
And the lamplight o'er him streaming throws his shadow on the floor;
And my soul from out that shadow that lies floating on the floor
Shall be lifted--nevermore!
L'input di test corretto (codificato con newline LF in stile Unix) dovrebbe essere lungo 7043 byte e avere l'hash MD5 esadecimale 286206abbb7eca7b1ab69ea4b81da227
. ( md5sum -t
dovrebbe produrre lo stesso valore di hash anche se si utilizzano newline CR + LF su DOS / Windows.) L'output del decompressore dovrebbe avere la stessa lunghezza e hash.
Ps. Tieni presente che questa sfida è difficile tanto quanto la fai. Davvero, qualsiasi cosa sotto 7043 conta come un buon punteggio. (All'altra estremità della scala, rimarrò estremamente colpito se qualcuno raggiungerà un punteggio inferiore a 2500.)