Dengan diskusi baru-baru ini tentang penggunaan alat kompresi dalam kode golf , saya pikir itu akan menjadi tantangan yang bagus untuk menulis kompresor teks Anda dan dekompresor.
Tantangan:
Tulis dua program : satu untuk mengompresi teks ASCII menjadi urutan byte, dan yang lain untuk mendekompresnya. Program tidak harus dalam bahasa yang sama.
Program pertama harus membaca sepotong teks ASCII (dari file atau dari input standar, atau menggunakan mekanisme apa pun yang paling alami untuk bahasa) dan mengeluarkan versi terkompresi dari itu. (Output terkompresi dapat terdiri atau byte arbitrer; tidak perlu dibaca.) Program kedua harus membaca output yang pertama dan membuat ulang input teks asli.
Mencetak:
Skor solusi akan menjadi jumlah dari tiga hitungan berikut:
- The Panjang kompresor program karakter.
- The Panjang output dari kompresor, mengingat masukan tes di bawah ini, dalam byte.
- The panjang decompressor Program (jika berbeda dari kompresor) dalam karakter.
Anda harus mencatat ketiga hitungan dan jumlah mereka dalam jawaban Anda. Karena ini adalah kode golf, semakin rendah skornya, semakin baik.
Aturan dan batasan:
Anda tidak dapat menggunakan alat atau pustaka kompresi atau dekompresi yang sudah ada sebelumnya, bahkan jika mereka dibundel dengan bahasa pilihan Anda. Jika ragu tentang apakah alat atau fungsi yang diberikan diizinkan, tanyakan.
Program kompresor Anda harus mampu menangani input yang terdiri dari teks ASCII yang dapat dicetak , termasuk tab (ASCII 9) dan umpan baris (ASCII 10). Anda dapat, tetapi tidak diharuskan untuk, menangani Unicode dan / atau input biner yang berubah-ubah.
Program dekompresor Anda harus menghasilkan output yang sama persis seperti yang diberikan kepada kompresor sebagai input. Secara khusus, berhati-hatilah untuk tidak mengeluarkan umpan garis tambahan jika input tidak memilikinya. (Input tes di bawah ini memang memiliki umpan garis tambahan, jadi Anda harus menguji ini secara terpisah. Tip untuk GolfScript:.
'':n
)Kompresor dan dekompresor Anda mungkin merupakan program yang sama (dengan mode yang sesuai dipilih misalnya dengan sakelar baris perintah). Dalam hal itu, panjangnya hanya dihitung satu kali .
Program tidak boleh terlalu lambat atau haus akan memori . Jika mengompresi atau mendekompresi input tes membutuhkan waktu lebih dari satu menit pada desktop saya yang tidak terlalu baru (2.2GHz AMD Athlon64 X2) atau mengkonsumsi lebih dari satu gigabyte RAM, saya akan memutuskan bahwa solusi tidak valid. Batas-batas ini sengaja dibuat longgar - mohon jangan mendorongnya. (Lihat amandemen di bawah ini: Anda harus mampu menangani setidaknya 100 kB input dalam batas-batas ini.)
Meskipun hanya input tes yang penting untuk penilaian, Anda setidaknya harus berupaya mengompresi teks input yang berubah-ubah. Sebuah solusi yang mencapai rasio kompresi yang layak hanya untuk input tes, dan untuk hal lain, secara teknis valid tetapi tidak akan mendapatkan upvote dari saya.
Program kompresor dan dekompresor Anda harus lengkap . Secara khusus, jika mereka bergantung pada kemampuan untuk membaca beberapa file atau sumber daya jaringan yang bukan bagian dari lingkungan runtime standar bahasa yang Anda pilih, panjang file atau sumber daya itu harus dihitung sebagai bagian dari panjang program. (Ini untuk melarang "kompresor" yang membandingkan input ke file di web dan menghasilkan nol byte jika cocok. Maaf, tapi itu bukan trik baru lagi.)
Amandemen dan klarifikasi:
Kompresor Anda harus dapat menangani file yang terdiri dari setidaknya 100 kB teks bahasa Inggris khas dalam waktu yang wajar dan penggunaan memori (paling banyak satu menit dan satu GB memori). Dekompresor Anda harus dapat mendekompresi output yang dihasilkan dalam batas yang sama. Tentu saja, mampu menangani file lebih lama dari itu baik-baik saja dan terpuji. Tidak apa-apa untuk membagi file input panjang menjadi potongan dan kompres secara individual, atau menggunakan cara lain untuk menukar efisiensi kompresi untuk kecepatan untuk input panjang.
Kompresor Anda mungkin memerlukan inputnya untuk diberikan menggunakan representasi baris baru asli platform yang Anda pilih (LF, CR + LF, CR, dll.), Selama decompressor Anda menggunakan representasi baris baru yang sama dalam outputnya. Tentu saja, kompresor juga boleh untuk menerima segala jenis baris baru (atau bahkan hanya baris Unix terlepas dari platform), selama decompressor Anda kemudian mengeluarkan jenis baris yang sama seperti pada input asli.
Masukan tes:
Untuk menilai efisiensi kompresi dari jawaban, input tes berikut ( The Raven oleh Edgar Allan Poe, milik Project Gutenberg ) akan digunakan:
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!
Input tes yang benar (dikodekan dengan LF baris baru gaya Unix) harus sepanjang 7043 byte, dan memiliki hash MD5 heksadesimal 286206abbb7eca7b1ab69ea4b81da227
. ( md5sum -t
harus menghasilkan nilai hash yang sama bahkan jika Anda menggunakan baris baru CR + LF pada DOS / Windows.) Output dari dekompresor Anda harus memiliki panjang dan hash yang sama.
Ps. Ingatlah bahwa tantangan ini hanya sesulit yang Anda lakukan. Sungguh, apa pun di bawah 7043 dianggap sebagai skor yang baik. (Di ujung lain skala, saya akan sangat terkesan jika ada yang mencapai skor di bawah 2500.)