코드 골프에서 압축 도구를 사용하는 것에 대한 최근의 논의와 함께 , 나는 당신 자신의 텍스트 압축기와 압축 해제기를 작성하는 것이 좋은 도전이라고 생각했습니다.
도전:
두 개의 프로그램을 작성하십시오 . 하나는 ASCII 텍스트를 바이트 시퀀스로 압축하고 다른 하나는 압축 해제합니다. 프로그램은 같은 언어 일 필요는 없습니다.
첫 번째 프로그램은 파일 또는 표준 입력에서 또는 언어에 가장 자연스러운 메커니즘을 사용하여 ASCII 텍스트를 읽고 압축 된 버전을 출력해야합니다. (압축 된 출력은 임의의 바이트로 구성 될 수 있으며 읽을 수는 없습니다.) 두 번째 프로그램은 첫 번째의 출력을 읽고 원래 입력 텍스트를 다시 작성해야합니다.
채점 :
해의 점수 는 다음 세 가지 수 의 합 입니다.
- 압축기 프로그램 의 길이 ( 문자)입니다.
- 출력 기간 바이트 테스트 입력 아래 압축기.
- 압축 해제 프로그램 의 길이 (압축기와 다른 경우)를 문자로 표시합니다.
답에 세 가지 개수와 합계를 모두 기록해야합니다. 코드 골프이기 때문에 점수가 낮을수록 좋습니다.
규칙 및 제한 사항 :
당신은 사용할 수 없습니다 그들이 선택한 언어를 번들로 제공하는 경우에도, 어떤 기존의 압축과 압축 해제 도구 나 라이브러리를. 주어진 도구 또는 기능이 허용되는지 확실하지 않은 경우 문의하십시오.
컴프레서 프로그램은 탭 (ASCII 9) 및 줄 바꿈 (ASCII 10)을 포함하여 인쇄 가능한 ASCII 텍스트 로 구성된 입력을 처리 할 수 있어야합니다 . 임의의 유니 코드 및 / 또는 이진 입력을 처리 할 수 있지만 반드시 그럴 필요는 없습니다.
압축 해제 프로그램은 입력과 압축기에 제공된 것과 정확히 동일한 출력 을 생성해야합니다 . 특히 입력에 후행 줄 바꿈이없는 경우 줄 바꿈 출력을 출력하지 않도록주의하십시오. 아래 테스트 입력에는 후행 줄 바꿈이 있으므로 별도로 테스트해야합니다. GolfScript 팁 :
'':n
.컴프레서와 압축 해제 기는 동일한 프로그램 일 수 있습니다 (예 : 명령 모드 스위치와 같은 적절한 모드가 선택된 상태). 이 경우 길이는 한 번만 계산됩니다 .
프로그램 속도 가 너무 느리거나 메모리가 부족 해서는 안됩니다 . 새롭지 않은 새 데스크톱 (2.2GHz AMD Athlon64 X2)에서 테스트 입력을 압축 또는 압축 해제하는 데 1 분 이상 걸리거나 기가 바이트 이상의 RAM을 사용하는 경우 솔루션을 무효로 간주합니다. 이러한 제한은 의도적으로 허술한 것입니다. 밀지 마십시오. (아래 수정 사항 참조 :이 한계 내에서 최소 100kB의 입력을 처리 할 수 있어야합니다.)
테스트 입력 만 스코어링에 중요하지만 최소한 임의의 입력 텍스트를 압축 하는 데 노력해야 합니다. 테스트 입력에 대해서만 적절한 압축 비율을 달성하고 다른 것에 대해서는 적절한 솔루션 은 기술적으로 유효하지만지지를 얻지 못할 것입니다.
컴프레서 및 압축 해제 프로그램 은 독립적이어야합니다 . 특히, 선택한 언어의 표준 런타임 환경에 포함되지 않은 일부 파일 또는 네트워크 리소스를 읽을 수있는 경우 해당 파일 또는 리소스의 길이는 프로그램 길이의 일부로 계산해야합니다. (이것은 입력을 웹의 파일과 비교하고 일치하는 경우 0 바이트를 출력하는 "압축기"를 허용하지 않기위한 것입니다. 더 이상 새로운 트릭이 아닙니다.)
수정 및 설명 :
컴프레서는 합리적인 시간과 메모리 사용 (최대 1 분 1GB의 메모리) 내에 최소 100kB 의 일반 영어 텍스트 로 구성된 파일을 처리 할 수 있어야합니다 . 압축 해제 기는 결과 한계를 동일한 한계 내에서 압축 해제 할 수 있어야합니다. 물론, 그보다 긴 파일을 처리 할 수있는 것은 완벽하고 훌륭합니다. 긴 입력 파일을 청크로 분할하여 개별적으로 압축하거나 다른 방법을 사용하여 긴 입력의 속도에 대한 압축 효율을 절충 할 수 있습니다.
압축 해제 기가 출력에서 동일한 줄 바꾸기 표현을 사용하는 한, 선호하는 플랫폼의 기본 줄 바꾸기 표현 (LF, CR + LF, CR 등)을 사용하여 압축기에 입력을 제공해야 할 수도 있습니다 . 물론, 압축 해제 기가 원래 입력에서와 동일한 종류의 개행을 출력하는 한 압축기가 모든 종류의 개행 (또는 플랫폼에 관계없이 Unix 개행 만)을 받아들이는 것도 좋습니다.
테스트 입력 :
답변의 압축 효율을 판단하려면 다음 테스트 입력 ( 레이븐 에드가 앨런 포에 의해 프로젝트 구텐베르크의 의례 )이 사용됩니다 :
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!
올바른 테스트 입력 (유닉스 스타일 LF 줄 바꿈으로 인코딩 됨)의 길이는 7043 바이트 여야하며 16 진수 MD5 해시가 있어야합니다 286206abbb7eca7b1ab69ea4b81da227
. ( md5sum -t
DOS / Windows에서 CR + LF 줄 바꿈을 사용하더라도 동일한 해시 값을 생성해야합니다.) 압축 해제 기의 출력 길이와 해시가 같아야합니다.
추신. 이 도전은 당신이하는 것만 큼 어렵다는 것을 명심하십시오. 실제로 7043 미만은 좋은 점수로 간주됩니다. (스케일의 다른 쪽 끝에서, 누군가가 2500 점 미만의 점수를 얻는다면 나는 매우 감동 할 것입니다.)