Với các cuộc thảo luận gần đây về việc sử dụng các công cụ nén trong mã golf , tôi nghĩ rằng sẽ là một thử thách tốt để viết trình nén và giải nén văn bản của riêng bạn.
Thử thách:
Viết hai chương trình : một để nén văn bản ASCII thành một chuỗi byte và một chương trình khác để giải nén nó. Các chương trình không cần phải có cùng ngôn ngữ.
Chương trình đầu tiên nên đọc một đoạn văn bản ASCII (từ tệp hoặc từ đầu vào tiêu chuẩn hoặc sử dụng bất kỳ cơ chế nào là tự nhiên nhất đối với ngôn ngữ) và xuất ra phiên bản nén của nó. (Đầu ra được nén có thể bao gồm hoặc các byte tùy ý; không cần đọc được.) Chương trình thứ hai sẽ đọc đầu ra của đầu tiên và tạo lại văn bản đầu vào ban đầu.
Ghi điểm:
Điểm của một giải pháp sẽ là tổng của ba lần đếm sau:
- Độ dài của chương trình máy nén tính bằng ký tự.
- Độ dài của đầu ra của máy nén, được đưa ra đầu vào thử nghiệm bên dưới, tính bằng byte.
- Độ dài của chương trình giải nén (nếu khác với máy nén) tính bằng ký tự.
Bạn nên lưu ý cả ba số đếm và tổng của chúng trong câu trả lời của bạn. Vì đây là mã golf, điểm càng thấp thì càng tốt.
Các quy tắc và hạn chế:
Bạn không được sử dụng bất kỳ công cụ hoặc thư viện nén hoặc giải nén có sẵn nào, ngay cả khi chúng đi kèm với ngôn ngữ bạn đã chọn. Nếu nghi ngờ về việc liệu một công cụ hoặc chức năng nhất định có được phép hay không, vui lòng hỏi.
Chương trình máy nén của bạn phải có khả năng xử lý đầu vào bao gồm bất kỳ văn bản ASCII có thể in nào , bao gồm các tab (ASCII 9) và nguồn cấp dữ liệu (ASCII 10). Bạn có thể, nhưng không bắt buộc, xử lý đầu vào Unicode và / hoặc nhị phân tùy ý.
Chương trình giải nén của bạn phải tạo ra chính xác cùng một đầu ra như được đưa cho máy nén làm đầu vào. Cụ thể, lưu ý không xuất nguồn cấp dữ liệu theo sau nếu đầu vào không có. (Đầu vào kiểm tra bên dưới không có nguồn cấp dữ liệu theo dõi, vì vậy bạn sẽ cần kiểm tra riêng điều này. Mẹo cho GolfScript :
'':n
.)Máy nén và bộ giải nén của bạn có thể là cùng một chương trình (với chế độ thích hợp được chọn, ví dụ như với một công tắc dòng lệnh). Trong trường hợp đó, chiều dài của nó chỉ được tính một lần .
Các chương trình không được quá chậm hoặc đói bộ nhớ . Nếu nén hoặc giải nén đầu vào kiểm tra mất hơn một phút trên máy tính để bàn không quá mới của tôi (AMD Athlon64 X2 2.2GHz) hoặc tiêu thụ nhiều hơn một gigabyte RAM, tôi sẽ loại trừ giải pháp không hợp lệ. Những giới hạn này là cố tình lỏng lẻo - xin vui lòng cố gắng không đẩy chúng. (Xem sửa đổi bên dưới: bạn cần có khả năng xử lý ít nhất 100 kB đầu vào trong các giới hạn này.)
Mặc dù chỉ có vấn đề đầu vào kiểm tra để ghi điểm, nhưng ít nhất bạn nên nỗ lực nén văn bản đầu vào tùy ý. Một giải pháp đạt được tỷ lệ nén tốt chỉ cho đầu vào thử nghiệm, và không có gì khác, là hợp lệ về mặt kỹ thuật nhưng sẽ không nhận được một upvote từ tôi.
Các chương trình nén và giải nén của bạn nên được khép kín . Cụ thể, nếu họ phụ thuộc vào khả năng đọc một số tệp hoặc tài nguyên mạng không phải là một phần của môi trường thời gian chạy tiêu chuẩn của ngôn ngữ bạn đã chọn, thì độ dài của tệp hoặc tài nguyên đó sẽ được tính là một phần của độ dài của chương trình. (Điều này là không cho phép "máy nén" so sánh đầu vào với một tệp trên web và xuất ra byte không nếu chúng khớp. Xin lỗi, nhưng đó không phải là một thủ thuật mới nữa.)
Sửa đổi và làm rõ:
Máy nén của bạn phải có khả năng xử lý các tệp bao gồm ít nhất 100 kB văn bản tiếng Anh thông thường trong thời gian sử dụng bộ nhớ và thời gian hợp lý (tối đa một phút và một GB bộ nhớ). Bộ giải nén của bạn phải có khả năng giải nén kết quả đầu ra trong cùng giới hạn. Tất nhiên, việc có thể xử lý các tệp lâu hơn thế là hoàn toàn tốt và đáng khen ngợi. Bạn có thể phân chia các tệp đầu vào dài thành nhiều phần và nén chúng riêng lẻ hoặc sử dụng các phương tiện khác để đánh đổi hiệu quả nén cho tốc độ cho các đầu vào dài.
Máy nén của bạn có thể yêu cầu đầu vào của nó được cung cấp bằng cách sử dụng đại diện dòng mới gốc của nền tảng ưa thích của bạn (LF, CR + LF, CR, v.v.), miễn là bộ giải nén của bạn sử dụng cùng một đại diện dòng mới trong đầu ra của nó. Tất nhiên, máy nén cũng chấp nhận bất kỳ loại dòng mới nào (hoặc thậm chí chỉ dòng mới Unix bất kể nền tảng), miễn là bộ giải nén của bạn sau đó đưa ra loại dòng mới như trong đầu vào ban đầu.
Kiểm tra đầu vào:
Để đánh giá hiệu quả nén của các câu trả lời, đầu vào kiểm tra sau ( The Raven của Edgar Allan Poe, lịch sự của Dự án Gutenberg ) sẽ được sử dụng:
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!
Đầu vào kiểm tra chính xác (được mã hóa với các dòng mới theo kiểu Unix) phải dài 7043 byte và có hàm băm MD5 thập lục phân 286206abbb7eca7b1ab69ea4b81da227
. ( md5sum -t
sẽ tạo ra cùng một giá trị băm ngay cả khi bạn sử dụng các dòng mới CR + LF trên DOS / Windows.) Đầu ra của bộ giải nén của bạn phải có cùng độ dài và hàm băm.
Thi thiên Hãy nhớ rằng thử thách này chỉ khó như bạn thực hiện. Thực sự, bất cứ điều gì dưới 7043 được tính là một điểm tốt. (Ở đầu kia của thang điểm, tôi sẽ cực kỳ ấn tượng nếu có ai đạt được điểm dưới 2500.)