๋ค์์ Herman Melville์ Moby-Dick ์ ํ ์คํธ๋ฅผ ํฌํจ ํ๋ 1.2Mb ASCII ํ ์คํธ ํ์ผ ์ ๋๋ค . ๋๋, ๊ณ ๋ . ๋น์ ์ ์๋ฌด๋ ํ ๋ฒ์ ํ ๋ฌธ์ ์ฉ์ด ํ์ผ์ ์ ๊ณต ํ ํ๋ก๊ทธ๋จ์ด๋ ํจ์ (๋๋ ํด๋์ค ๋ฑ-์๋ ์ฐธ์กฐ)๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ฉฐ ๊ฐ ๋จ๊ณ์์ ๋ค์ ๋ฌธ์๋ฅผ ์ถ์ธกํด์ผํฉ๋๋ค.
์ด๊ฒ์ code-challenge ์ ๋๋ค. ๋น์ ์ ์ ์๋
2*L + E
์ด๋๋ L
๋ฐ์ดํธ ์ ์ถ์ ํฌ๊ธฐ์ด๋ฉฐ, E
๊ทธ๊ฒ์ ์๋ชป ์ถ์ธก ๋ฌธ์ ์์
๋๋ค. ๊ฐ์ฅ ๋ฎ์ ์ ์๊ฐ ์ด๊น๋๋ค.
์ถ๊ฐ ์ธ๋ถ ์ฌํญ
์ ์ถ๋ฌผ์ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋๊ฑฐ๋ ํธ์ถ๋๊ฑฐ๋ ์ ์ก๋๋ ํ๋ก๊ทธ๋จ ๋๋ ๊ธฐ๋ฅ ๋ฑ์
๋๋ค. (1215235 ๋ฒ ์ ํํด์ผํฉ๋๋ค.) n ๋ฒ์งธ ์๊ฐ ๋์ ํธ์ถ๋๋ฉด n ๋ฒ์งธ ๋ฌธ์ whale.txt
๋๋ whale2.txt
( n + 1 ) ๋ฒ์งธ ๋ฌธ์์ ๋ํ ์ถ์ธก ๊ฐ์ ์ถ๋ ฅํด์ผํฉ๋๋ค . E
์ ์ ์ ๊ตฌ์ฑ ์์๋ ์๋ชป ์ถ์ธก ํ ์ด ๋ฌธ์ ์์
๋๋ค.
๋๋ถ๋ถ์ ์ ์ถ์ ํธ์ถ๊ฐ์ ๋ช ๊ฐ์ง ์ํ๋ฅผ ์ ์ฅํด์ผํ๋ฏ๋ก ํธ์ถ ๋ ํ์์ ์ด์ ์
๋ ฅ์ด ๋ฌด์์ธ์ง ์ถ์ ํ ์ ์์ต๋๋ค. ์ธ๋ถ ํ์ผ์ static
์ฐ๊ฑฐ๋ ์ ์ญ ๋ณ์ ๋ฅผ ์ฌ์ฉ ํ๊ฑฐ๋ ํจ์๊ฐ ์๋ ํด๋์ค๋ฅผ ์ ์ถํ๊ฑฐ๋ ์ํ ๋ชจ๋๋๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ธ์ด์ ์ ํฉํ ๋ค๋ฅธ ๊ฒ์ ์ฌ์ฉํ์ฌ์ด๋ฅผ ์ํ ํ ์ ์์ต๋๋ค. ์ ์ถ์๋ ์ฒซ ๋ฒ์งธ ํธ์ถ ์ ์ ์ํ๋ฅผ ์ด๊ธฐํํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ์ฝ๋๊ฐ ํฌํจ๋์ด์ผํฉ๋๋ค.
ํ๋ก๊ทธ๋จ์ ๊ฒฐ์ ๋ก ์ ์ผ๋ก ์คํ๋์ด์ผํ๋ฏ๋ก ํญ์ ๋์ผํ ์ ๋ ฅ์ด ์ฃผ์ด์ง๋ฉด ํญ์ ๊ฐ์ ์ถ์ธก์ํ๊ฒ๋ฉ๋๋ค (๋ฐ๋ผ์ ํญ์ ๊ฐ์ ์ ์๋ฅผ ์ป์ต๋๋ค).
๋ต๋ณ์๋ ์ ์ถ๋ฌผ๋ฟ๋ง ์๋๋ผ E
์ ์ ์ ์ผ๋ถ ๋ฅผ ๊ณ์ฐํ๋ ๋ฐ ์ฌ์ฉํ ์ฝ๋๋ ํฌํจํด์ผํฉ๋๋ค . ์ ์ถ ํ ์ธ์ด์ ๋์ผํ ์ธ์ด๋ก ์์ฑ ๋ ํ์๋ ์์ผ๋ฉฐ ๋ฐ์ดํธ ์์ ํฌํจ๋์ง ์์ต๋๋ค. ์ฝ์ ์ ์๋๋กํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ ์ถ๊ณผ์ด ์ ์ ๊ณ์ฐ ํ๋ก๊ทธ๋จ ๊ฐ์ ์ธํฐํ์ด์ค์ ๊ด๋ จํ์ฌ ํ๋ก๊ทธ๋จ์ด ๋ค์ ๋ฐ์ดํธ ์ ๋ ฅ์ ๋ฐ๊ธฐ ์ ์ ํญ์ 1 ๋ฐ์ดํธ์ ์ถ๋ ฅ์ ์ ๊ณตํ๋ ํ ์๋ฌด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. (์๋ฅผ ๋ค์ด, ๋ชจ๋ ์ ๋ ฅ์ ํฌํจํ๋ ๋ฌธ์์ด์ ์ ๋ฌํ๊ณ ๋ชจ๋ ์ถ๋ ฅ์ ํฌํจํ๋ ๋ฌธ์์ด์ ๋ค์ ๊ฐ์ ธ์ฌ ์๋ ์์ต๋๋ค.)
์ถํ์์ ์ ์ถํ๊ธฐ ์ ์ ์ํ ํ๋ก๊ทธ๋จ์ ์ค์ ๋ก ์คํํ๊ณ ์ ์๋ฅผ ๊ณ์ฐ / ํ์ธํด์ผํฉ๋๋ค. ์ ์ถ๋ฌผ์ด ์ ์๋ฅผ ํ์ธํ๊ธฐ์ ๋๋ฌด ๋๋ฆฌ๊ฒ ์งํ๋๋ ๊ฒฝ์ฐ ์์น์ ์ผ๋ก ์ ์๊ฐ ๋ฌด์์ธ์ง ์๋๋ผ๋ ๊ฒฝ์ ํ ์ ์์ต๋๋ค.
L
์ ์ ์ ๊ตฌ์ฑ ์์๋ ์ฝ๋ ๊ณจํ ์ฑ๋ฆฐ์ง์ ๋ํ ์ผ๋ฐ์ ์ธ ๊ท์น์ ๋ฐ๋ผ ๊ณ์ฐ๋ฉ๋๋ค. ์ ์ถ๋ฌผ์ ์ฌ๋ฌ ํ์ผ์ด ํฌํจ ๋ ๊ฒฝ์ฐ ํด๋น ๊ฒฝ์ฐ ์ ์ ๋ฐ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ ๊ท์น์ ์ฐธ๊ณ ํ์ญ์์ค . ์ฝ๋์์ ์ฌ์ฉํ๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ L
์ ์์ ํฌํจ๋์ด์ผํฉ๋๋ค .
๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ง๋ง ๋ค๋ฅธ ์ธ๋ถ ํ์ผ์๋ก๋ ํ ์ ์์ผ๋ฉฐ ์ฝ๋๊ฐ whale.txt
๋๋whale2.txt
์์์ ์ค๋ช
ํ ๋ฐฉ๋ฒ ์ด์ธ์ ๋ฐฉ๋ฒ์ผ๋ก ํ์ผ์ ์ ์ฅํ์ญ์์ค. ์ฌ์ ํ๋ จ ๋ ์ ๊ฒฝ๋ง ๋๋ ๊ธฐํ ํต๊ณ ๋ฐ์ดํฐ ์์ค๋ฅผ๋ก๋ ํ ์ ์์ต๋๋ค. ์ ๊ฒฝ๋ง์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ง๋ง ์ ์ถ์ ๊ฐ์ค์น ๋ฐ์ดํฐ๋ฅผ ํฌํจ์ํค๊ณ ๋ฐ์ดํธ ์๋ก ๊ณ์ฐํด์ผํฉ๋๋ค. ์ด๋ค ์ด์ ๋ก ์ธ์ด ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Moby Dick์ ์ผ๋ถ ๋๋ ๋ชจ๋ ํ
์คํธ๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด ํฌํจ ๋ ๊ฒฝ์ฐ ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ๋ชปํ ์ ์์ต๋๋ค. ๊ทธ ์ธ์๋ ์ธ์ด ๋๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ์ธ ํ ํ
์คํธ ์ฒ๋ฆฌ, ์์ธก ๋๋ ์์ถ๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ํฌํจํ์ฌ ์ํ๋ ๋ค๋ฅธ ๋ด์ฅ ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํต๊ณ ๋ฐ์ดํฐ ์์ค๋ฅผ ํฌํจํ๋๋ณด๋ค ์ด๊ตญ์ ์ธ ํน์ ๋ฃจํด์ ๊ฒฝ์ฐ์ด๋ฅผ ์ง์ ๊ตฌํํ๊ณ ๋ฐ์ดํธ ์์ ํฌํจ์์ผ์ผํฉ๋๋ค.
์ผ๋ถ ์ ์ถ์๋ ์ฝ๋์ ์ํด ์์ฒด์ ์ผ๋ก ์์ฑ ๋ ๊ตฌ์ฑ ์์๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ํด๋น ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ ๋ ์ฝ๋๋ฅผ ๋ต๋ณ์ ํฌํจ์ํค๊ณ ์๋ ๋ฐฉ์์ ์ค๋ช ํ์ญ์์ค . ์ ์ถ์ ์คํํ๋ ๋ฐ์ด ์ฝ๋๊ฐ ํ์ํ์ง ์์ผ๋ฉด ๋ฐ์ดํธ ์์ ํฌํจ๋์ง ์์ต๋๋ค.
๊ธฐ๋ก์ ์ธ ์ด์ ๋ก ํ์ผ์๋ ๋ ๊ฐ์ง ๋ฒ์ ์ด ์์ผ๋ฉฐ ๋ ์ค ํ๋๋ฅผ ๋ต๋ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์์ whale2.txt
์ค ๋ฐ๊ฟ ๋ฌธ๋จ์ ๋์ ๋ง ๋ํ๋๋๋ก (์ ๋งํฌ) ํ
์คํธ๋, ํฌ์ฅ๋์ง ์์ต๋๋ค. ์๋ณธ whale.txt
์์ ํ
์คํธ๋ 74 ์ ๋๋น๋ก ์ค ๋ฐ๊ฟ๋๋ฏ๋ก ๊ฐ ์ค์ ๋์ ์์ธกํ๊ณ ํ
์คํธ๋ฅผ ์์ธกํด์ผํฉ๋๋ค. ์ด๋ก ์ธํด ๋์ ์ด ๋ ์ด๋ ค์ ์ง๋ฏ๋ก whale2.txt
์๋ก์ด ๋ต๋ณ์ ๊ถ์ฅ๋ฉ๋๋ค. ๋ ํ์ผ์ ํฌ๊ธฐ๋ 1215236 ๋ฐ์ดํธ์
๋๋ค.
์์ฝํ๋ฉด ๋ชจ๋ ๋ต๋ณ์๋ ๋ค์ ์ฌํญ์ด ํฌํจ๋์ด์ผํฉ๋๋ค.
- ์ ์ถ ์์ฒด. (์ฝ๋์ ์ฌ์ฉํ๋ ๋ชจ๋ ๋ฐ์ดํฐ ํ์ผ-ํฌ๋ฉด ๋งํฌ๊ฐ ๋ ์ ์์ต๋๋ค.)
- ์ฝ๋ ์๋ ๋ฐฉ์์ ๋ํ ์ค๋ช ๋ค์ ๋ฌธ์๋ฅผ ์์ธกํ๋ ๋ฐฉ๋ฒ๊ณผ I / O ๋ฐฉ๋ฒ์ ์ค๋ช ํ์ญ์์ค. ๊ทํ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ ์ค๋ช ์ ์ค์ํ๋ฉฐ, ์ข์ ์ค๋ช ์ ์ ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ป๊ฒ๋ฉ๋๋ค.
- ์ ์๋ฅผ ํ๊ฐํ๋ ๋ฐ ์ฌ์ฉํ ์ฝ๋์ ๋๋ค. (์ด๊ฒ์ด ์ด์ ๋ต๋ณ๊ณผ ๋์ผํ๋ฉด ๋งํฌ ํ ์ ์์ต๋๋ค.)
- ์ ์ถ๋ฌผ์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉํ ์ฝ๋ ๋ฐ ํด๋น ์ฝ๋์ ๋ํ ์ค๋ช ์ฌ๊ธฐ์๋ ๋งค๊ฐ ๋ณ์๋ฅผ ์ต์ ํํ๊ณ ๋ฐ์ดํฐ ํ์ผ์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ฝ๋๊ฐ ํฌํจ๋ฉ๋๋ค (๋ฐ์ดํธ ์์๋ ํฌํจ๋์ง ์์ง๋ง ๋ต๋ณ์ ํฌํจ๋์ด์ผ ํจ).
๋ฆฌ๋ ๋ณด๋
var QUESTION_ID=152856,OVERRIDE_USER=21034;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:380px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Score</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
๋ฐ์ดํฐ
๋๋๋ก ๋๋ ๋ค๋ฅธ ์ ๊ทผ๋ฒ์ ์ฅ๋ คํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ์ ๊ณต ํ ๊ฒ์ ๋๋ค.
์ฒซ ๋ฒ์งธ 50 ์ ์ A. Rex์ ์์ฌ๋์์ผ๋ฉฐ ๋น์ ์ต๊ณ ์ ์๋ฅผ ๋ฐ์์ต๋๋ค.
๋ ๋ฒ์งธ 100 ์ ๋ A. Rex์๊ฒ๋ ์ฃผ์ด์ก์ผ๋ฉฐ, ๊ทธ๋ค์ ๊ธฐ์กด ๋ต๋ณ์ ์์ฃผ ์ข์ ์ค๋ช ์ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ต๋ณ์ ๋ฐ์์ต๋๋ค.
๋ค์ ํ์๊ธ ์ธ 200 ์ ์
- ์๋ก์ด ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์์ ์ธ ๋ต๋ณ. (์ด๊ฒ์ ํ์๊ธ์ ๋ค์ด๊ฐ๋ ๋์ ๋ด๋น์์ด๊ธฐ ๋๋ฌธ์ ๋์ ์ฃผ๊ด์ ์ธ ํ๋จ์ ๊ทผ๊ฑฐ ํ ๊ฒ์ด์ง๋ง, ๋น์ ์ ์ ๋ฅผ ๊ณตํํ๊ฒ ๋ฏฟ์ ์ ์์ต๋๋ค. ๋น์ ์ ๋๋ต์ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๊ธฐ ์ํด ์ถฉ๋ถํ ์ค๋ช ์ ํฌํจํด์ผํฉ๋๋ค!) ์ต๊ณ ์ ์๋ฅผ ํ๋ํ์ง ์๊ณ ๊ธฐ์กด ๋ต๋ณ๊ณผ ๋น๊ตํ์ฌ ํฉ๋ฆฌ์ ์ผ๋ก ์ ์ํํด์ผํฉ๋๋ค. ํนํ ๋ฐ๋ณต์ ์ธ ์ ๊ฒฝ๋ง์ ๊ธฐ๋ฐ์ผ๋ก ํ ์๋ฃจ์ ์๋ณด๊ณ ์ถ์ดํ์ง๋ง ํ์ฌ ์ต๊ณ ์ ์๋ฅผ ์ฐจ์งํ๋ Markov ๋ชจ๋ธ๊ณผ๋ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฌํฉ๋๋ค.
๋๋:
- ์ด๋ค ๋ฐฉ๋ฒ ์ผ๋ก๋ A. Rex์ ์ต๊ณ ์ ์ (ํ์ฌ 444444)๋ฅผ์ด๊ธฐ๋ ์ฌ๋.
200 ํฌ์ธํธ ํ์๊ธ์ด ์ฒญ๊ตฌ๋๋ฉด 400 ํฌ์ธํธ 1์ ์ ๊ณตํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์๊ตฌ ์ฌํญ์ ์ ๋ฐ์ดํธํฉ๋๋ค.
๋ต๋ณ
๋ต๋ณ
Node.js, 2 * 224 + 524279 = 524727
์ ์ ์ ๋ฐ์ดํธ์ ๋ํด์๋์ด ๊ฒ์๋ฌผ ๋์์๋ ๋ณ๊ฒฝ ๋ก๊ทธ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๋ฐ์ดํธ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ฆฌํดํ๋ ํจ์์ ๋๋ค.
a=[...l='14210100'],m={},s={},b={}
f=c=>a.some((t,n)=>x=s[y=l.slice(n)]>t|/^[A-Z '"(]/.test(y)&&b[y],l+=String.fromCharCode(c),a.map((_,n)=>(m[x=l.slice(n)]=-~m[x])<s[y=l.slice(n,8)]||(s[y]=m[x],b[y]=c)),l=l.slice(1))&&x||32
๋ง์ง๋ง 8์๋ฅผ๋ณด๊ณ ๋ค์์ ์์ธก ํ๋ ๊ฐ๋จํ PPM ๋ชจ๋ธ ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค .
T ๋ ์ ์ด๋ T [L] ๋ฒ ๋ฐ์ํ์ ๋ ๊ธธ์ด L ์ ํจํด์ ์ ๋ขฐํฉ๋๋ค . ์ฌ๊ธฐ์ T ๋ ์์์ ์๊ณ ๊ฐ์ ๋ฐฐ์ด์
๋๋ค : [1,1,2,1,2,3,5,2] . ๋ํ ์ฐ๋ฆฌ๋ ํญ์ ์ฒซ ๋ฌธ์๊ฐ ์ผ์นํ๋ ํจํด์ ์ ๋ขฐํฉ๋๋ค .[A-Z '"(]
๊ฐ์ฅ ๊ธด ์ ๋ขฐํ ์์๋ ํจํด์ ์ ํํ๊ณ ํตํ์์ด ํจํด๊ณผ ๊ด๋ จ๋ ๊ฐ์ฅ ๋์ ์ ์๋ก ์์ธก์ ๋ฐํํฉ๋๋ค.
๋ ธํธ
-
์๋์ ์ต์ ํ๋์ง๋ ์์์ง๋ง ๋ฉํฑ์์ ์ฝ 15 ์ด ์์ ์คํ๋ฉ๋๋ค.
-
๋ชจ๋ธ์ ์ฌ์ค์ ํ์ง ์๊ณ ํ๋ก์ธ์ค๋ฅผ ์ฐ์์ผ๋ก ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณต ํ ์ ์์ผ๋ฉด 5 ๋ฒ ๋ฐ๋ณต ํ ํ ์ค๋ฅ ์๊ฐ ~ 268000์ผ๋ก ์๋ ด๋ฉ๋๋ค.
-
์์ธก ํจ์์ ํ์ฌ ์ฑ๊ณต๋ฅ ์ ~ 56.8 %์ ๋๋ค. ์๊ฒฌ์์ @immibis๊ฐ ์ ์ ์๋ฏ์ด, ์๋ชป๋ ์ถ์ธก๊ณผ ์ฌ๋ฐ๋ฅธ ์ถ์ธก์ด ํผํฉ๋์ด ์์ผ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๊ฑฐ์ ์ฝ์ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์ฑ ๋ ๋ถ๋ถ์์๋์ด ์ค ๋ํซ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Here be it said, that this pertinacious pursuit of one particular whale,[LF] continued through day into night, and through night into day, is a thing[LF] by no means unprecedented in the South sea fishery.
๋๋ค :
"e e be it said, that thes woacangtyous sarsuet of tie oort cular thale[LF][LF] orsinued toeough tir on e togh and sheough toght an o ters af t shin[LF][LF] be to means insrocedented tn hhe sputh Sevsaonh ry,
์๋ชป๋ ์ถ์ธก์ ๋ฐ์ค๋ก ๋ฐ๊พธ๋ฉด ํจ์์ ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ ์ ์ ์ ์์ต๋๋ค.
_e_e be it said, that th_s _____n___ous __rsu_t of __e __rt_cular _hale_[LF] _o__inued t__ough ___ _n__ __gh__ and _h_ough __ght _n_o ____ __ _ _hin_[LF] b_ _o means _n_r_cedented _n _he __uth _e_____h_ry_
NB : ์ ์์ ๋ ์ด์ ๋ฒ์ ์ ์ฝ๋๋ก ์์ฑ๋์์ผ๋ฉฐ, ์ ๋ ฅ ํ์ผ์ ์ฒซ ๋ฒ์งธ ๋ฒ์ ์์ ์์ ํฉ๋๋ค.
ํ ์คํธ ์ฝ๋
/**
The prediction function f() and its variables.
*/
a=[...l='14210100'],m={},s={},b={}
f=c=>a.some((t,n)=>x=s[y=l.slice(n)]>t|/^[A-Z '"(]/.test(y)&&b[y],l+=String.fromCharCode(c),a.map((_,n)=>(m[x=l.slice(n)]=-~m[x])<s[y=l.slice(n,8)]||(s[y]=m[x],b[y]=c)),l=l.slice(1))&&x||32
/**
A closure containing the test code and computing E.
It takes f as input.
(f can't see any of the variables defined in this scope.)
*/
;
(f => {
const fs = require('fs');
let data = fs.readFileSync('whale2.txt'),
len = data.length,
err = 0;
console.time('ElapsedTime');
data.forEach((c, i) => {
i % 100000 || console.log((i * 100 / len).toFixed(1) + '%');
if(i < len - 1 && f(c) != data[i + 1]) {
err++;
}
})
console.log('E = ' + err);
console.timeEnd('ElapsedTime');
})(f)
๋ณ๊ฒฝ ๋ก๊ทธ
- 524727 -whale2.txt๋ก ์ ํํ์ฌ 19644 ํฌ์ธํธ ์ ์ฝ (์ฑ๋ฆฐ์ง ์ ๋ฐ์ดํธ)
- 544371- ๋๋ฌธ์, ๋ฐ์ดํ, ํฐ ๋ฐ์ดํ ๋๋ ์ฌ๋ ๊ดํธ๋ก ์์ํ๋ ํจํด์ ํญ์ ์ ๋ขฐํ๋๋กํ์ฌ 327 ์ ์ ์ ์ฝํ์ต๋๋ค.
- 544698- ๊ณต๋ฐฑ์ผ๋ก ์์ํ๋ ํจํด์ ํญ์ ์ ๋ขฐํ ์ ์๋๋กํ์ฌ 2119 ํฌ์ธํธ ์ ์ฝ
- 546817- ์๊ณ ๊ฐ์ ์กฐ์ ํ๊ณ ์์ธก ๊ธฐ๋ฅ์ ๊ณจํํ ํ์ฌ 47 ์ ์ ์ ์ฅํ์ต๋๋ค.
- 546864- ์ต๋ ํจํด ๊ธธ์ด๋ฅผ 8 ์๋ก ํ์ฅํ์ฌ 1496 ํฌ์ธํธ ์ ์ฝ
- 548360- ์ ๋ขฐํ ์์๋ ํจํด์ ๊ฐ๋ ์ ๋์ ํ์ฌ ๊ธธ์ด์ ๋ฐ๋ฅธ ์๊ณ ๊ฐ์ผ๋ก 6239 ํฌ์ธํธ๋ฅผ ์ ์ฝํ์ต๋๋ค.
- 554599- ์ค ๋ฐ๊ฟ ์์ธก์ ๊ฐ์ ํ์ฌ 1030 ์ ์ ์ ์ฝํ์ต๋๋ค.
- 555629- ์์ธก ๊ธฐ๋ฅ์ ๊ณจํ๋กํ์ฌ 22 ํฌ์ธํธ ์ ์ฝ
- 555651- ์์ธก ๊ธฐ๋ฅ์ ๊ณจํ๋กํ์ฌ 40 ์ ์ ์ ์ฅํ์ต๋๋ค
- 555691- ์ด๊ธฐ ์ ์
๋ต๋ณ
ํ, 2 ยท 70525 + 326508 = 467558
์์ธ์
$m=($u=1<<32)-1;open B,B;@e=unpack"C*",join"",<B>;$e=2903392593;sub u{int($_[0]+($_[1]-$_[0])*pop)}sub o{$m&(pop()<<8)+pop}sub g{($h,%m,@b,$s,$E)=@_;if($d eq$h){($l,$u)=(u($l,$u,$L),u($l,$u,$U));$u=o(256,$u-1),$l=o($l),$e=o(shift@e,$e)until($l^($u-1))>>24}$M{"@c"}{$h}++-++$C{"@c"}-pop@c for@p=($h,@c=@p);@p=@p[0..19]if@p>20;@c=@p;for(@p,$L=0){$c="@c";last if" "ne pop@c and@c<2 and$E>99;$m{$_}+=$M{$c}{$_}/$C{$c}for sort keys%{$M{$c}};$E+=$C{$c}}$s>5.393*$m{$_}or($s+=$m{$_},push@b,$_)for sort{$m{$b}<=>$m{$a}}sort keys%m;$e>=u($l,$u,$U=$L+$m{$_}/$s)?$L=$U:return$d=$_ for sort@b}
์ด ํ๋ก๊ทธ๋จ์ ์คํํ๋ ค๋ฉด ์ด ํ์ผ์ด ํ์ ํฉ๋๋ค (์ฌ๊ธฐ์ ์ด๋ฆ์ ์ง์ ํด์ผ ํจ) B
. ์ ๋ฌธ์ ์ ๋ ๋ฒ์งธ ์ธ์คํด์ค ์์์ด ํ์ผ ์ด๋ฆ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค B
.์ด ํ์ผ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์๋๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ด ํ๋ก๊ทธ๋จ์ ๋ณธ์ง์ ์ผ๋ก user2699์ ๋ต๋ณ ์์์ ๊ฐ์ด Markov ๋ชจ๋ธ์ ์กฐํฉ์ ์ฌ์ฉ ํ์ง๋ง ์ฝ๊ฐ์ ์์ ์ด ์์ต๋๋ค. ์ด๊ฒ์ ๋ค์ ์บ๋ฆญํฐ์ ๋ํ ๋ถํฌ ๋ฅผ ์์ฑํฉ๋๋ค . ์ฐ๋ฆฌ๋ ์ ๋ณด ์ด๋ก ์ ์ฌ์ฉํ์ฌ B
์ธ์ฝ๋ฉ ํํธ ์ ์ค๋ฅ๋ฅผ ํ์ฉํ ์ง ๋๋ ์คํ ๋ฆฌ์ง ๋นํธ๋ฅผ ์๋นํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค (์๋ ๊ฒฝ์ฐ). ์ฐ๋ฆฌ๋ ์ฐ์ ์ฝ๋ฉ ์ ์ฌ์ฉ ํ์ฌ ๋ชจ๋ธ์ ์์ ๋นํธ๋ฅผ ์ต์ ์ผ๋ก ์ ์ฅํฉ๋๋ค.
ํ๋ก๊ทธ๋จ์ ๊ธธ์ด๋ 582 ๋ฐ์ดํธ (๋ถํ์ํ ์ต์ข
๊ฐํ ํฌํจ)์ด๊ณ ์ด์ง ํ์ผ์ B
๊ธธ์ด๋ 69942 ๋ฐ์ดํธ์ด๋ฏ๋ก ์ฌ๋ฌ ํ์ผ์ ์ ์ ๋ฅผ ๋งค๊ธฐ๋ ๊ท์น์L
๋ฐ๋ผ 582 + 69942 + 1 = 70525 ๋ก ์ ์ ๊ฐ ๋งค๊ฒจ์ง๋๋ค.
์ด ํ๋ก๊ทธ๋จ์๋ ๊ฑฐ์ ํ์คํ๊ฒ 64 ๋นํธ (little-endian?) ์ํคํ
์ฒ๊ฐ ํ์ํฉ๋๋ค. m5.large
Amazon EC2 ์ ์ธ์คํด์ค์์ ์คํํ๋ ๋ฐ ์ฝ 2.5 ๋ถ์ด ๊ฑธ๋ฆฝ๋๋ค .
ํ ์คํธ ์ฝ๋
# Golfed submission
require "submission.pl";
use strict; use warnings; use autodie;
# Scoring length of multiple files adds 1 penalty
my $length = (-s "submission.pl") + (-s "B") + 1;
# Read input
open my $IN, "<", "whale2.txt";
my $input = do { local $/; <$IN> };
# Run test harness
my $errors = 0;
for my $i ( 0 .. length($input)-2 ) {
my $current = substr $input, $i, 1;
my $decoded = g( $current );
my $correct = substr $input, $i+1, 1;
my $error_here = 0 + ($correct ne $decoded);
$errors += $error_here;
}
# Output score
my $score = 2 * $length + $errors;
print <<EOF;
length $length
errors $errors
score $score
EOF
ํ
์คํธ ํ๋ค์ค๋ ์ ์ถ์ด ํ์ผ์ ์๋ค๊ณ ๊ฐ์ submission.pl
ํ์ง๋ง ๋ ๋ฒ์งธ ์ค์์ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
ํ ์คํธ ๋น๊ต
"And did none of ye see it before?" cried Ahab, hailing the perched men all around him.\\"I saw him almost that same instant, sir, that Captain
"And wid note of te fee bt seaore cried Ahab, aasling the turshed aen inl atound him. \"' daw him wsoost thot some instant, wer, that Saptain
"And _id no_e of _e _ee _t _e_ore__ cried Ahab, _a_ling the __r_hed _en __l a_ound him._\"_ _aw him ___ost th_t s_me instant, __r, that _aptain
Ahab did, and I cried out," said Tashtego.\\"Not the same instant; not the same--no, the doubloon is mine, Fate reserved the doubloon for me. I
Ahab aid ind I woued tut, said tashtego, \"No, the same instant, tot the same -tow nhe woubloon ws mane. alte ieserved the seubloon ior te, I
Ahab _id_ _nd I ___ed _ut,_ said _ashtego__\"No_ the same instant_ _ot the same_-_o_ _he _oubloon _s m_ne_ __te _eserved the __ubloon _or _e_ I
only; none of ye could have raised the White Whale first. There she blows!--there she blows!--there she blows! There again!--there again!" he cr
gnly towe of ye sould have tersed the shite Whale aisst Ihere ihe blows! -there she blows! -there she blows! Ahere arains -mhere again! ce cr
_nly_ _o_e of ye _ould have ___sed the _hite Whale _i_st_ _here _he blows!_-there she blows!_-there she blows! _here a_ain__-_here again!_ _e cr
์ด ์ํ ( ๋ค๋ฅธ ๋ต๋ณ ์์ ์ ํ๋จ )์ ํ ์คํธ์์ ๋ค์ ๋ฆ๊ฒ ๋ฐ์ํ๋ฏ๋ก์ด ์์ ์์ ๋ชจ๋ธ์ด ์๋นํ ๊ฐ๋ฐ๋์์ต๋๋ค. ์ด ๋ชจ๋ธ์ ์บ๋ฆญํฐ๋ฅผ ์ถ์ธกํ๋ ๋ฐ ๋์์ด๋๋ 70 ํฌ๋ก๋ฐ์ดํธ์ โํํธโ์ ์ํด ํ์ฅ๋ฉ๋๋ค. ๋จ์ํ ์์ ์งง์ ์ฝ๋ ์ค ๋ํซ์ผ๋ก ๊ตฌ๋๋์ง๋ ์์ต๋๋ค.
ํํธ ์์ฑ
๋ค์ ํ๋ก๊ทธ๋จ์ ์์ ์ ํํ ์ ์ถ ์ฝ๋ (ํ์ค ์
๋ ฅ)๋ฅผ ์๋ฝํ๊ณ ์์ ์ ํํ B
ํ์ผ (ํ์ค ์ถ๋ ฅ)์ ์์ฑํฉ๋๋ค .
@S=split"",join"",<>;eval join"",@S[0..15,64..122],'open W,"whale2.txt";($n,@W)=split"",join"",<W>;for$X(0..@W){($h,$n,%m,@b,$s,$E)=($n,$W[$X]);',@S[256..338],'U=0)',@S[343..522],'for(sort@b){$U=($L=$U)+$m{$_}/$s;if($_ eq$n)',@S[160..195],'X<128||print(pack C,$l>>24),',@S[195..217,235..255],'}}'
์ ์ฌํ ๊ณ์ฐ์ ์ํํ๊ธฐ ๋๋ฌธ์ ์ ์ถ๋งํผ ์คํํ๋ ๋ฐ ๊ฑฐ์ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.
์ค๋ช
์ด ์น์ ์์๋์ด ์๋ฃจ์ ์ด ์ํํ๋ ์์ ์ ์ฌ์ฉ์๊ฐ โ์ง์์ ์๋โํ ์์์๋งํผ ์ถฉ๋ถํ ์์ธํ๊ฒ ์ค๋ช ํ๋ ค๊ณ ํฉ๋๋ค. ์ด ๋ต๋ณ์ ๋ค๋ฅธ ๋ต๋ณ๊ณผ ๊ตฌ๋ณํ๋ ์ฃผ์ ๊ธฐ์ ์ โ๋๊ฐ๊ธฐโ๋ฉ์ปค๋์ฆ์ผ๋ก ๋ถ๋ฅ๋๋ ๋ช ๊ฐ์ง ์น์ ์ด์ง๋ง, ๊ฑฐ๊ธฐ์ ๋๋ฌํ๊ธฐ ์ ์ ๊ธฐ๋ณธ ์ฌํญ์ ์ค์ ํด์ผํฉ๋๋ค.
๋ชจ๋ธ
์๋ฃจ์ ์ ๊ธฐ๋ณธ ์ฑ๋ถ์ ์ธ์ด ๋ชจ๋ธ์ ๋๋ค. ์ฐ๋ฆฌ์ ๋ชฉ์ ์ ์ํด ๋ชจ๋ธ ์ ์ด๋ ์ ๋์ ์์ด ํ ์คํธ ๋ฅผ ์ฌ์ฉํ๊ณ ๋ค์ ๋ฌธ์์ ๋ํ ํ๋ฅ ๋ถํฌ ๋ฅผ ๋ฐํํ๋ ๊ฒ ์ ๋๋ค. ๋ชจ๋ธ์ ์ฌ์ฉํ ๋ ์์ด ํ ์คํธ๋ Moby Dick์ ์ ๋์ฌ์ ๋๋ค. ์ํ๋ ๊ฒฐ๊ณผ๋ ๊ฐ์ฅ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ฌธ์์ ๋ํ ๋จ์ผ ์ถ์ธก์ด ์๋๋ผ ๋ถํฌ ์ ๋๋ค.
์ฐ๋ฆฌ์ ๊ฒฝ์ฐ, ์ฐ๋ฆฌ๋ ๋ณธ์ง์ ์ผ๋ก user2699์ ์ํ์ด ๋ต๋ณ ์์ ๋ชจ๋ธ์ ์ฌ์ฉํฉ๋๋ค . Anders Kaseorg ์ ์ต๊ณ ์ ์ (์ฐ๋ฆฌ ์์ ์ด ์๋)์ ๋ชจํ์ ์ฌ์ฉํ์ง ์์์ต๋๋ค . ๋จ ํ๋์ ์ต์ ์ ์ถ์ธก๋ณด๋ค๋ ๋ถํฌ๋ฅผ ์ถ์ถ ํ ์ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ก ์ ์ผ๋ก, ๊ทธ ๋๋ต์ ๊ฐ์ค ๊ธฐํ ํ๊ท ์ ๊ณ์ฐํ์ง๋ง, ๋ฌธ์ ๊ทธ๋๋ก ํด์ํ์ ๋ ๋ค์ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ต๋๋ค. ์ฐ๋ฆฌ์ โ๋น๋ฐ ์์คโ๋ ๋ชจ๋ธ์ด ์๋๋ผ ์ ์ฒด์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ต๋ณ์์ ๋ชจ๋ธ์ โํ์นโ๊ฒ์ ๋๋ค. ๋๊ตฐ๊ฐ๊ฐ โ๋ ๋์โ๋ชจ๋ธ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋๋จธ์ง ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ด์ผํฉ๋๋ค.
์ฐธ๊ณ ๋ก, Lempel-Ziv์ ๊ฐ์ ๋๋ถ๋ถ์ ์์ถ ๋ฐฉ๋ฒ์ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก โ์ธ์ด ๋ชจ๋ธโ๋ก ๊ฐ์ฃผ ๋ ์ ์์ง๋ง ์ฝ๊ฐ ์์ผ ์ฅ์ด ์ผ ํ ์๋ ์์ต๋๋ค. (Brows-Wheeler ๋ณํ์ ์ํํ๋ ๊ฒ์ ํนํ ๊น๋ค ๋กญ์ต๋๋ค!) ๋ํ user2699์ ๋ชจ๋ธ์ Markov ๋ชจ๋ธ์ ์์ ์ฌํญ์ ๋๋ค. ๋ณธ์ง์ ์ผ๋ก์ด ๋์ ์ ๋ํ ๊ฒฝ์ ๋๋ ๋์ฒด๋ก ํ ์คํธ๋ฅผ ๋ชจ๋ธ๋งํ๋ ๋ค๋ฅธ ์ด๋ค ๊ฒ๋ ์์ต๋๋ค.
์ ๋ฐ์ ์ธ ์ํคํ ์ฒ
์ดํด๋ฅผ ๋๊ธฐ ์ํด ์ ์ฒด ์ํคํ ์ฒ๋ฅผ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ต์์ ์์ค ๊ด์ ์์ ์ฝ๊ฐ์ ์ํ ๊ด๋ฆฌ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค. ์ด๊ฒ์ ํน๋ณํ ํฅ๋ฏธ๋กญ์ง๋ ์์ง๋ง, ์์ ์ฑ์ ์ํด ํ๋ก๊ทธ๋จ์ด ๋ค์ ์ถ์ธก์ ์๊ตฌํ ๋๋ง๋ค Moby Dick์ ์ฌ๋ฐ๋ฅธ ์ ๋์ฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ณผ๊ฑฐ์ ์๋ชป๋ ์ถ์ธก์ ์ด๋ค ์ ์ผ๋ก๋ ์ฌ์ฉํ์ง ์์ต๋๋ค. ํจ์จ์ฑ์ ์ํด ์ธ์ด ๋ชจ๋ธ์ ์ฒซ ๋ฒ์งธ N ๋ฌธ์์ ์ํ๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ์ฒซ ๋ฒ์งธ (N + 1) ๋ฌธ์์ ์ํ๋ฅผ ๊ณ์ฐํ ์ ์์ง๋ง ์์น์ ์ผ๋ก ํธ์ถ ๋ ๋๋ง๋ค ์ฒ์๋ถํฐ ๋ค์ ๊ณ์ฐํ ์ ์์ต๋๋ค.
ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ณธ โ๋๋ผ์ด๋ฒโ๋ฅผ ๋ฐ๋ก ์ค์ ํ๊ณ ๋ค์ ๋ฌธ์๋ฅผ ์ถ์ธกํ๋ ๋ถ๋ถ์ ๋ค์ฌ๋ค ๋ณด๋๋กํฉ์๋ค. ์ธ์ด ๋ชจ๋ธ (์์์ ๋ ผ์), โํํธโํ์ผ ๋ฐ โํต์ญ์ฌโ์ ์ธ ๋ถ๋ถ์ ๊ฐ๋ ์ ์ผ๋ก ๋ถ๋ฆฌํ๋ ๋ฐ ๋์์ด๋ฉ๋๋ค. ๊ฐ ๋จ๊ณ์์ ํต์ญ์ฌ๋ ์ธ์ด ๋ชจ๋ธ์ ๋ค์ ๋ฌธ์์ ๋ฐฐํฌ๋ฅผ ์์ฒญํ๊ณ ํํธ ํ์ผ์์ ์ผ๋ถ ์ ๋ณด๋ฅผ ์ฝ์ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด๋ฌํ ๋ถ๋ถ์ ์ถ์ธก์ผ๋ก ๊ฒฐํฉํฉ๋๋ค. ์ ํํ ํํธ ํ์ผ์ ์ด๋ค ์ ๋ณด๊ฐ ์๊ณ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง๋ ๋์ค์ ์ค๋ช ํ ๊ฒ์ด์ง๋ง ์ง๊ธ์์ด ๋ถ๋ถ๋ค์ ์ ์ ์ ์ผ๋ก ๋ถ๋ฆฌ์ํค๋ ๋ฐ ๋์์ด๋ฉ๋๋ค. ๊ตฌํ ์ธก๋ฉด์์ ํํธ ํ์ผ์ ๋ฌธ์ ๊ทธ๋๋ก ๋ณ๋์ (์ด์ง) ํ์ผ์ด์ง๋ง ํ๋ก๊ทธ๋จ ๋ด๋ถ์ ์ ์ฅ๋ ๋ฌธ์์ด์ด๊ฑฐ๋ ๋ฌด์ธ๊ฐ ์ผ ์ ์์ต๋๋ค. ๊ทผ์ฌ์น๋ก
์ด ๋ต๋ณ ์์์ฒ๋ผ bzip2 ์ ๊ฐ์ ํ์ค ์์ถ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ โhintsโํ์ผ์ ์์ถ ํ์ผ์ ํด๋นํฉ๋๋ค. โํต์ญ์ฌโ๋ ์์ถ ํด์ ๊ธฐ์ ํด๋นํ๋ ๋ฐ๋ฉด โ์ธ์ด ๋ชจ๋ธโ์ ์ฝ๊ฐ ์์ ์ ์ ๋๋ค (์์์ ์ธ๊ธ ํ ๋ฐ์ ๊ฐ์ด).
ํํธ ํ์ผ์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ถ๊ฐ ๋ถ์์์ํ ๊ฐ๋จํ ์๋ฅผ ์ ํํด ๋ด
์๋ค. ํ
์คํธ๊ฐ N
๊ธธ๊ณ ๊ทผ์ฌํ ๋ฌธ์ ๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ชจ๋ ๋ฌธ์๋ E
ํ๋ฅ ์ด ์ ๋ฐ๋ณด๋ค ์ฝ๊ฐ ์์ ๋ฌธ์ , ํ๋ฅ ์ด ์ ๋ฐ๋ณด๋ค ์ฝ๊ฐ ์์ ๋ฌธ์ T
, A
1/1000 = 0.1 %์ ํ๋ฅ ์ ๊ฐ๋ ๋ฌธ์ (๋
๋ฆฝ์ ์ผ๋ก) ์
๋๋ค. ๋ค๋ฅธ ๋ฌธ์๋ ๋ถ๊ฐ๋ฅํ๋ค๊ณ ๊ฐ์ ํ์. ์ด์จ๋ A
์ด์ ์ ๋ณด์ง ๋ชปํ ์บ๋ฆญํฐ๊ฐ ํ๋์์ผ๋ก ๋ณด์ด๋ ๊ฒฝ์ฐ์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
๋ง์ฝ ์ฐ๋ฆฌ๊ฐ L 0 ์ฒด์ ์์์ด ์ง๋ฌธ์ ๋ํ ๋ค๋ฅธ ๋ต๋ณ๋ค ๋๋ถ๋ถ์ด ์๋ ๋๋ถ๋ถ์ ์ด์ํ๋ค๋ฉด, E
and ์ค ํ๋๋ฅผ ์ ํํ๋ ๊ฒ๋ณด๋ค ํต์ญ์ฌ์๊ฒ ๋ ๋์ ์ ๋ต์ ์์ต๋๋ค T
. ํ๊ท ์ ์ผ๋ก ๋ฌธ์์ ์ฝ ์ ๋ฐ์ด ๋ง์ต๋๋ค. ๋ฐ๋ผ์ E โ N / 2์ โ N / 2๋ ์ ์์
๋๋ค. ๊ทธ๋ฌ๋ ์์ถ ์ ๋ต์ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๋น ํ๋ ์ด์์ ๋นํธ๋ก ์์ถ ํ ์ ์์ต๋๋ค. L์ ๋ฐ์ดํธ ๋จ์๋ก ๊ณ์ฐ๋๋ฏ๋ก L โ N / 8์ ์ป์ผ๋ฏ๋ก ์ด์ ์ ๋ต๋ณด๋ค ๋ ๋ฐฐ ์ข์ strategy N / 4๋ฅผ ์ป์ต๋๋ค.
์ด ๋ชจ๋ธ์์ ๋ฌธ์ ๋น ํ๋ ์ด์์ ๋นํธ๋ฅผ์ด ์๋๋ก ๋ฌ์ฑํ๋ ๊ฒ์ ์ฌ์ํ ๊ฒ์ด ์๋์ง๋ง ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฐ์ ์ฝ๋ฉ์ ๋๋ค.
์ฐ์ ์ฝ๋ฉ
์ผ๋ฐ์ ์ผ๋ก ์๋ ค์ง ๋ฐ์ ๊ฐ์ด, ์ธ์ฝ๋ฉ ์ ๋นํธ / ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ด๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด ASCII๋ ์์ด ํ ์คํธ ๋ฐ ๊ด๋ จ ๋ฌธ์์ 7 ๋นํธ / ๋ฌธ์ ์ธ์ฝ๋ฉ์ด๋ฉฐ, ๊ณ ๋ ค์ค์ธ ์๋ณธ Moby Dick ํ์ผ์ ์ธ์ฝ๋ฉ์ ๋๋ค. ์ผ๋ถ ๋ฌธ์๊ฐ ๋ค๋ฅธ ๋ฌธ์๋ณด๋ค ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ASCII์ ๊ฐ์ ๊ณ ์ ๋๋น ์ธ์ฝ๋ฉ์ด ์ต์ ์ด ์๋๋๋ค. ์ด๋ฌํ ์ํฉ์์ ๋ง์ ์ฌ๋๋ค์ด ํํ๋ง ์ฝ๋ฉ์ ๋๋ฌํฉ๋๋ค . ๋ฌธ์ ๋น ์ ์ ๋นํธ ์์ ๊ณ ์ (ํ๋ฆฌํฝ์ค ํ๋ฆฌ) ์ฝ๋๋ฅผ ์ํ๋ ๊ฒฝ์ฐ์ ์ต์ ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ฐ์ ์ฝ๋ฉ ์ด ํจ์ฌ ์ข์ต๋๋ค. ๋๋ต์ ์ผ๋ก ๋งํ๋ฉด, โ๋ถ์โ๋นํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ณด๋ฅผ ์ธ์ฝ๋ฉ ํ ์ ์์ต๋๋ค. ์จ๋ผ์ธ์ผ๋ก ์ฌ์ฉํ ์์๋ ์ฐ์ ์ฝ๋ฉ์ ๋ํ ๋ง์ ์๋ด์๊ฐ ์์ต๋๋ค. ์จ๋ผ์ธ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ค๋ฅธ ๋ฆฌ์์ค๋ก ์ธํด ์ฌ๊ธฐ์์ ์ธ๋ถ ์ฌํญ (ํนํ ์ค์ ๊ตฌํ, ํ๋ก๊ทธ๋๋ฐ ์ธก๋ฉด์์ ์ฝ๊ฐ ๊น๋ค๋ก์ธ ์ ์์)์ ๊ฑด๋ ๋ฐ์ง ๋ง ๋๊ตฐ๊ฐ๊ฐ ๋ถํํ๋ฉด์ด ์น์ ์ ๋ ์์ธํ ์ค๋ช ํ ์ ์์ต๋๋ค.
์๋ ค์ง ์ธ์ด ๋ชจ๋ธ์ ์ํด ์ค์ ๋ก ์์ฑ ๋ ํ ์คํธ๊ฐ์๋ ๊ฒฝ์ฐ, ์ฐ์ ์ฝ๋ฉ์ ํด๋น ๋ชจ๋ธ์ ํ ์คํธ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต์ ์ผ๋ก ์ธ์ฝ๋ฉํฉ๋๋ค. ์ด๋ค ์๋ฏธ์์ ์ด๊ฒ์ ํด๋น ๋ชจ๋ธ์ ์์ถ ๋ฌธ์ ๋ฅผ โํด๊ฒฐโํฉ๋๋ค. (์ค์ ๋ก ์ฃผ์ ๋ฌธ์ ๋ ๋ชจ๋ธ์ ์์ง ๋ชปํ๊ณ ์ผ๋ถ ๋ชจ๋ธ์ ์ธ๊ฐ์ ํ ์คํธ๋ฅผ ๋ชจ๋ธ๋ง ํ ๋ ๋ค๋ฅธ ๋ชจ๋ธ๋ณด๋ค ๋ซ๋ค๋ ๊ฒ์ ๋๋ค.)์ด ์ฝํ ์คํธ์์ ์ค๋ฅ๋ฅผ ํ์ฉํ์ง ์์ ๊ฒฝ์ฐ ์ด์ ์น์ ์ ์ธ์ด๋ก ์ด ๊ณผ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ๋ง๋๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฐ์ ์ธ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ด ๋ชจ๋ธ์์ โํํธโํ์ผ์ ์์ฑ ํ ๋ค์ ์ฐ์ ๋์ฝ๋๋ฅผ โํต์ญ์ฌโ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
์ด ๋ณธ์ง์ ์ผ๋ก ์ต์ ํ ๋ ์ธ์ฝ๋ฉ์์, ์ฐ๋ฆฌ๋ ํ๋ฅ p๋ฅผ ๊ฐ๋ ๋ฌธ์์ ๋ํด -log_2 (p) ๋นํธ๋ฅผ ์๋นํ๊ฒ๋๊ณ , ์ธ์ฝ๋ฉ์ ์ ์ฒด ๋นํธ ๋ ์ดํธ๋ Shannon ์ํธ๋กํผ ์ ๋๋ค. ์ด๋ ํ๋ฅ ์ด 1/2์ ๊ฐ๊น์ด ๋ฌธ์๋ ์ธ์ฝ๋ฉํ๋ ๋ฐ ์ฝ 1 ๋นํธ๊ฐ ๊ฑธ๋ฆฌ๊ณ , 1/1000์ ํ๋ฅ ์ด์๋ ๋ฌธ์๋ ์ฝ 10 ๋นํธ๊ฐ๋ฉ๋๋ค (2 ^ 10์ ๋๋ต 1000์ด๋ฏ๋ก).
๊ทธ๋ฌ๋์ด ๊ณผ์ ์ ๋ํ ์ ์ ๋ฉํธ๋ฆญ์ ์์ถ์ ์ต์ ์ ์ ๋ต์ผ๋ก ํผํ๊ธฐ ์ํด ์ ์ ํ๋์์ต๋๋ค. ๋ ์งง์ ํํธ ํ์ผ์ ์ป๋ ๋ฐ์์ด ํธ๋ ์ด๋ ์คํ๋ก ์ค๋ฅ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ผํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ ํ ์์๋ ์ ๋ต ์ค ํ๋๋ ๊ฐ๋จํ ๋ถ๊ธฐ ์ ๋ต์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ฐ์ ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ๋ ค๊ณ ํ์ง๋ง ๋ชจ๋ธ์ ํ๋ฅ ๋ถํฌ๊ฐ โ๋์โ๊ฒฝ์ฐ ๊ฐ์ฅ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ฌธ์๋ฅผ ์ถ์ธกํ์ฌ ์ธ์ฝ๋ฉํ์ง ๋ง์ญ์์ค.
์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๊น?
์ ์ฐ๋ฆฌ๊ฐ โ์๋์ ์ผ๋กโ์ค๋ฅ๋ฅผ ๋ง๋ค๊ณ ์ถ์ ์ง ๋๊ธฐ๋ฅผ ๋ถ์ฌํ๊ธฐ ์ํด ์ด์ ์ ์๋ฅผ ๋ถ์ํด ๋ด
์๋ค. ์ฌ๋ฐ๋ฅธ ๋ฌธ์๋ฅผ ์ธ์ฝ๋ฉํ๊ธฐ ์ํด ์ฐ์ ์ฝ๋ฉ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ E
๋๋ ์ ๊ฒฝ์ฐ ๋๋ต 1 ๋นํธ๋ฅผ ์ฌ์ฉ T
ํ์ง๋ง์ ๊ฒฝ์ฐ์๋ ์ฝ 10 ๋นํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค A
.
์ ๋ฐ์ ์ผ๋ก, ์ด๊ฒ์ ์ธ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ์์ง๋ง ๋ฌธ์ ๋น ์กฐ๊ธ ์ด์์ ์๋นํ๋ ๊ฝค ์ข์ ์ธ์ฝ๋ฉ์
๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก A
๋ ๊ฐ๋ฅ์ฑ์ด ๊ฑฐ์ ์์ผ๋ฉฐ ํด๋น 10 ๋นํธ๋ฅผ ๋๋ฌด ์์ฃผ ์๋นํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ A
? ์ ๊ฒฝ์ฐ ๋์ ์ค๋ฅ๋ฅผ ๋ง๋ค ์ ์๋ค๋ฉด ์ข์ง ์์๊น์? ๊ฒฐ๊ตญ ๋ฌธ์ ์ ๋ํ ๋ฉํธ๋ฆญ์ 1 ๋ฐ์ดํธ = 8 ๋นํธ ๊ธธ์ด์ ๊ธธ์ด๊ฐ 2 ๊ฐ์ ์ค๋ฅ์ ๊ฐ๋ค๊ณ ๊ฐ์ฃผํฉ๋๋ค. ๋ฐ๋ผ์ ๋ฌธ์์ 8/2 = 4 ๋นํธ ์ด์์ ์๋นํ๋ ๋์ ์ค๋ฅ๋ฅผ ์ ํธ ํด์ผํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ํ๋์ ์ค๋ฅ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด 1 ๋ฐ์ดํธ ์ด์์ ์๋นํ๋ฉด ํ์คํ ์ฐจ์ ์ฑ
์ผ๋ก ๋ค๋ฆฝ๋๋ค!
โ๋๊ฐ๊ธฐโ๋ฉ์ปค๋์ฆ
์ด ์น์ ์์๋์ด ์๋ฃจ์ ์ ์ฃผ์ ์๋ฆฌํ ์ธก๋ฉด์ ๋ํด ์ค๋ช ํฉ๋๋ค.์ด ๋ฐฉ๋ฒ์ ๋น์ฉ์์ด ์๋ชป๋ ์ถ์ธก์ ์ฒ๋ฆฌ ํ ์์๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ถ์ ํ ๊ฐ๋จํ ์์์ ๋๊ฐ๊ธฐ ๋ฉ์ปค๋์ฆ์ ํนํ ๊ฐ๋จํฉ๋๋ค. ์ธํฐํ๋ฆฌํฐ๋ ํํธ ํ์ผ์์ 1 ๋นํธ๋ฅผ ์ฝ์ต๋๋ค. 0์ด๋ฉด ์ถ์ธก E
ํฉ๋๋ค. 1์ด๋ฉด ์ถ์ธก T
ํฉ๋๋ค. ๋ค์์ ํธ์ถ ๋ ๋ ์ฌ๋ฐ๋ฅธ ๋ฌธ์๊ฐ ๋ฌด์์ธ์ง ํ์ธํฉ๋๋ค. ํํธ ํ์ผ์ด ์ ๋๋ก ์ค์ ๋๋ฉด E
or ์ ๊ฒฝ์ฐ T
์ธํฐํ๋ฆฌํฐ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ์ธก ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ป A
์ต๋๊น? ๋๊ฐ๊ธฐ ๋ฉ์ปค๋์ฆ์ ์์ด๋์ด๋ ๋จ์ํ ์ฝ๋ A
๋ฅผ ์์ฑ ํ์ง ์๋ ๊ฒ ์
๋๋ค. ๋ ์ ํํ๊ฒ ๋งํ๋ฉด, ์ธํฐํ๋ฆฌํฐ๊ฐ ๋์ค์ ์ฌ๋ฐ๋ฅธ ๋ฌธ์๊ฐ์ด๋ผ๋ ๊ฒ์ ์๊ฒ๋๋ฉด A
์์ ์ ์ผ๋ก โ ํ
์ดํ๋ฅผ ๋๊ฐ์ต๋๋ค โ: ์ด์ ์ ์ฝ์ ๋นํธ๋ฅผ ๋ฐํํฉ๋๋ค. ์ฝ์ ๋นํธ๋ ์ฝ๋ฉ E
ํ๊ฑฐ๋T
๊ทธ๋ฌ๋ ์ง๊ธ์ ์๋๋๋ค. ๋์ค์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๊ฐ๋จํ ์์์ ์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ ๋ฌธ์ ( ๋๋ )๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๊น์ง ๊ณ์ ์ถ์ธก ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค . ๊ทธ๋ฐ ๋ค์ ๋ค๋ฅธ ๋นํธ๋ฅผ ์ฝ๊ณ ๊ณ์ ์งํํฉ๋๋ค.E
T
์ด ํํธ ํ์ผ์ ์ธ์ฝ๋ฉ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ๋ชจ๋ s๋ฅผ ์์ ํ ๋ฌด์ํ๋ฉด์ ๋ชจ๋ E
s๋ฅผ 0 ๋นํธ๋ก, T
s๋ฅผ 1 ๋นํธ๋ก ์ ํ A
ํฉ๋๋ค. ์ด์ ์น์
์ ๋ ๋ถ๋ถ์์๋ ๋ถ์์ ๋ฐ๋ฅด๋ฉด์ด ์ฒด๊ณ๋ ์ค๋ฅ๋ฅผ ๋ฐ์ ์ํค์ง๋ง A
s๋ฅผ ์ธ์ฝ๋ฉํ์ง ์์ผ๋ฉด ์ ์ ์ฒด์ ์ผ๋ก ์ ์๋ฅผ ์ค ์
๋๋ค. ๋ ์์ ํจ๊ณผ๋ก ์ค์ ๋ก ํํธ ํ์ผ์ ๊ธธ์ด๋ ์ ์ฝ๋ฉ๋๋ค. ๋นํธ E
์ ๋นํธ๊ฐ T
์๋ ๋นํธ ์ ๋นํธ๋ง๋ค ์ ํํ ํ๋์ ๋นํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ ์
๋๋ค.
์์ ์ ๋ฆฌ
์ธ์ ์ค๋ฅ๋ฅผ ๋ด์ผํฉ๋๊น? ๋ชจ๋ธ์ด ๋ค์ ์บ๋ฆญํฐ์ ๋ํ ํ๋ฅ ๋ถํฌ P๋ฅผ ์ ๊ณตํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๊ฐ๋ฅํ ๋ฌธ์๋ฅผ coded ์ not coded์ ๋ ํด๋์ค๋ก ๋ถ๋ฆฌํฉ๋๋ค . ์ฌ๋ฐ๋ฅธ ๋ฌธ์๊ฐ ์ฝ๋ฉ๋์ง ์์ ๊ฒฝ์ฐ โ๋๊ฐ๊ธฐโ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ๊ธธ์ด์ ์๊ด์์ด ์ค๋ฅ๋ฅผ ํ์ฉํฉ๋๋ค. ์ฌ๋ฐ๋ฅธ ๋ฌธ์๊ฐ ์ฝ๋ฉ๋๋ฉด ๋ค๋ฅธ ๋ถํฌ Q๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ์ ์ฝ๋ฉ์ผ๋ก ์ธ์ฝ๋ฉํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ค ๋ถํฌ Q๋ฅผ ์ ํํด์ผํฉ๋๊น? ์ฝ๋ฉ ๋ ๋ฌธ์๊ฐ ์ฝ๋ฉ๋์ง ์์ ๋ฌธ์๋ณด๋ค ๋์ ํ๋ฅ (P)์ ๊ฐ์ ธ์ผํ๋ค๋ ๊ฒ์ ๋๋ฌด ์ด๋ ต์ง ์์ต๋๋ค. ๋ํ ๋ถํฌ Q๋ ์ฝ๋ํ ๋ ๋ฌธ์ ๋ง ํฌํจํด์ผํฉ๋๋ค. ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๊ฒ๋ค์ ์ฝ๋ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์ํธ๋กํผ๋ฅผ โ์ง์ถโํด์๋ ์๋ฉ๋๋ค. ํ๋ฅ ๋ถํฌ Q๊ฐ ์ฝ๋ฉ ๋ ๋ฌธ์์์ P์ ๋น๋กํด์ผํ๋ค๋ ๊ฒ์๋ณด๊ธฐ์๋ ์กฐ๊ธ ๊น๋ค ๋กญ์ต๋๋ค. ์ด๋ฌํ ๊ด์ฐฐ ๊ฒฐ๊ณผ๋ฅผ ์ข ํฉํ๋ฉด ๊ฐ์ฅ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ฌธ์๋ฅผ ์ฝ๋ฉํด์ผํ์ง๋ง ๊ฐ๋ฅ์ฑ์ด ์ ์ ๋ฌธ์๋ ์ฝ๋ฉํ์ง ์์์ผํ๋ฉฐ Q๋ ์ฝ๋ฉ ๋ ๋ฌธ์์ ๋ํด ๋จ์ํ P ๋ฐฐ์จ์ด ์กฐ์ ๋ฉ๋๋ค.
๋ํ ์ฝ๋ฉ ๋ฌธ์์ ๋ํด ์ด๋ค โ์ปท์คํโ๋ฅผ ์ ํํด์ผํ๋์ง์ ๋ํ ๋ฉ์ง ์ ๋ฆฌ๊ฐ ์์์ด ๋ฐํ์ก์ต๋๋ค. ๋ค๋ฅธ ์ฝ๋ํ ๋ ๋ฌธ์๊ฐ ๊ฒฐํฉ ๋ ๊ฐ๋ฅ์ฑ์ด ์ต์ 1 / 5.393 ์ธ ํ ๋ฌธ์๋ฅผ ์ฝ๋ฉํด์ผํฉ๋๋ค. ์ด๊ฒ์ 5.393
์์ ํ๋ก๊ทธ๋จ์ ๋ ๋ถ๋ถ์์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์์์ ์์ ๋ชจ์์ โ์ค๋ช
โํฉ๋๋ค . ์ซ์ 1 / 5.393 โ 0.18542๋ ๋ฐฉ์ ์ -p log (16)-p log p + (1 + p) log (1 + p) = 0์ ๋ํ ํด ์
๋๋ค.
์๋ง๋์ด ์ ์ฐจ๋ฅผ ์ฝ๋๋ก ์์ฑํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค. ์ด ์ค ๋ํซ์ C ++์ ๋๋ค.
// Assume the model is computed elsewhere.
unordered_map<char, double> model;
// Transform p to q
unordered_map<char, double> code;
priority_queue<pair<double,char>> pq;
for( char c : CHARS )
pq.push( make_pair(model[c], c) );
double s = 0, p;
while( 1 ) {
char c = pq.top().second;
pq.pop();
p = model[c];
if( s > 5.393*p )
break;
code[c] = p;
s += p;
}
for( auto& kv : code ) {
char c = kv.first;
code[c] /= s;
}
ํจ๊ป ๋ชจ์์
์ด์ ์น์ ์ ๋ถํํ๋ ์ฝ๊ฐ ๊ธฐ์ ์ ์ธ ๋ถ๋ถ์ด์ง๋ง ๋ค๋ฅธ ๋ถ๋ถ์ ๋ชจ๋ ํฉํ๋ฉด ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ํ๋ก๊ทธ๋จ์ด ์ฃผ์ด์ง ์ฌ๋ฐ๋ฅธ ๋ฌธ์ ๋ค์์ ๋ค์ ๋ฌธ์๋ฅผ ์์ธกํ๋๋ก ์์ฒญ ๋ ๋๋ง๋ค :
- Moby Dick์ ์๋ ค์ง ์ฌ๋ฐ๋ฅธ ์ ๋์ฌ์ ์ฌ๋ฐ๋ฅธ ๋ฌธ์๋ฅผ ์ถ๊ฐํ์ญ์์ค.
- ํ ์คํธ์ (Markov) ๋ชจ๋ธ์ ์ ๋ฐ์ดํธํ์ญ์์ค.
- ๋น๋ฐ ์์ค : ์ด์ ์ถ์ธก์ด ์ ํํ์ง ์์ผ๋ฉด, ๋๊ฐ๊ธฐ ์ด์ ์ถ์ธกํ๊ธฐ ์ ์ ์ํ๋ก ์ฐ์ ๋์ฝ๋์ ์ํ๋ฅผ!
- ๋ค์ ์บ๋ฆญํฐ์ ๋ํ ํ๋ฅ ๋ถํฌ P๋ฅผ ์์ธกํ๋๋ก Markov ๋ชจ๋ธ์ ์์ฒญํ์ญ์์ค.
- ์ด์ ์น์ ์ ์๋ธ ๋ฃจํด์ ์ฌ์ฉํ์ฌ P๋ฅผ Q๋ก ๋ณํํฉ๋๋ค.
- ๋ถํฌ Q์ ๋ฐ๋ผ ์ฐ์ ๋์ฝ๋์ ํํธ ํ์ผ์ ๋๋จธ์ง ๋ถ๋ถ์์ ๋ฌธ์๋ฅผ ๋์ฝ๋ฉํ๋๋ก ์์ฒญํ์ญ์์ค.
- ๊ฒฐ๊ณผ ์บ๋ฆญํฐ๋ฅผ ๋ง์ถฐ๋ณด์ธ์.
ํํธ ํ์ผ์ ์ธ์ฝ๋ฉ๋ ๋น์ทํ๊ฒ ์๋ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ ์ฌ๋ฐ๋ฅธ ๋ค์ ๋ฌธ์๊ฐ ๋ฌด์์ธ์ง ์๊ณ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ์ฝ๋ฉ๋์ด์ผํ๋ ๋ฌธ์๋ผ๋ฉด, ๋ฌผ๋ก ๊ทธ ์์ ์ฐ์ ์ธ์ฝ๋๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฝ๋ํ๋์ง ์์ ๋ฌธ์์ด๋ฉด ์ฐ์ ์ธ์ฝ๋์ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค.
ํ๋ฅ ๋ถํฌ, ์ํธ๋กํผ, ์์ถ ๋ฐ ์ฐ์ ์ฝ๋ฉ๊ณผ ๊ฐ์ ์ ๋ณด ์ด๋ก ์ ๋ฐฐ๊ฒฝ์ ์ดํดํ์ง๋ง์ด ๊ฒ์๋ฌผ์ ์ดํดํ์ง ๋ชปํ๊ณ ์๋ํ์ง ์์ ๊ฒฝ์ฐ (์ด๋ก ์ด ์ฐธ์ธ ์ด์ ๋ ์ ์ธ) ์๋ ค ์ฃผ์๋ฉด ์ ๋ฆฌํ ์ ์์ต๋๋ค. ์ฝ์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
๋ต๋ณ
ํ์ด์ฌ 3, 2 ยท 267 + 510193 = 510727
์์ธ์
def p():
d={};s=b''
while 1:
p={0:1};r=range(len(s)+1)
for i in r:
for c,n in d.setdefault(s[:i],{}).items():p[c]=p.get(c,1)*n**b'\1\6\f\36AcWuvY_v`\270~\333~'[i]
c=yield max(sorted(p),key=p.get)
for i in r:e=d[s[:i]];e[c]=e.get(c,1)+1
s=b'%c'%c+s[:15]
์ด๊ฒ์ 0,โฆ, 16 Markov ๋ชจ๋ธ์ ๊ฐ์ค์น ๋ฒ ์ด์ง์ ์กฐํฉ์ ์ฌ์ฉํ๊ณ ๊ฐ์ค์น๋ [1, 6, 12, 30, 65, 99, 87, 117, 118, 89, 95, 118, 96, 184, 126, 219, 126].
๊ฒฐ๊ณผ๋ ์ด๋ฌํ ๊ฐ์ค์น์ ์ ํ์ ๋งค์ฐ ๋ฏผ๊ฐํ์ง๋ ์์ง๋ง ๊ฐ ํ๋ณด ๋์ฐ๋ณ์ด๊ฐ์๋ โ์์ ๋ค์๊ฒฐโ์ ๋ํ ๋ต๋ณ ์์ ์ฌ์ฉํ ๊ฒ๊ณผ ๋์ผํ ํ๊ธฐ ํ์ฉ ์ธ๋ ๋ฑ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๊ฐ์ค์น๋ฅผ ์ต์ ํํ์ต๋๋ค. ๋จ์ผ ์ค๋์ ๋ํด ยฑ 1 ์ฉ ์ฆ๊ฐํฉ๋๋ค.
ํ ์คํธ ์ฝ๋
with open('whale2.txt', 'rb') as f:
g = p()
wrong = 0
a = next(g)
for b in f.read():
wrong += a != b
a = g.send(b)
print(wrong)
๋ต๋ณ
Python 3 , 2 * 279 + 592920 = 593478 2 * 250 + 592467 = 592967 2 * 271 + 592084 = 592626 2 * 278 + 592059 = 592615 2 * 285 + 586660 = 587230 2 * 320 + 585161 = 585801 2 * 339 + 585050 = 585728
d=m={}
s=1
w,v='',0
def f(c):
global w,m,v,s,d
if w not in m:m[w]={}
u=m[w];u[c]=c in u and 1+u[c]or 1;v+=1;q=n=' ';w=w*s+c;s=c!=n
if w in m:_,n=max((m[w][k],k)for k in m[w])
elif s-1:n=d in'nedtfo'and't'or'a'
elif'-'==c:n=c
elif"'"==c:n='s'
elif'/'<c<':':n='.'
if v>4*(n!=q)+66:n='\n'
if s:d=c
if c<q:w=w[:-1]+q;v=s=0
return n
์จ๋ผ์ธ์ผ๋ก ์ฌ์ฉํด๋ณด์ญ์์ค!
์ ์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ํจ์. ๋จ์ด ์์ค์์ ๋ชจ๋ธ์ ๊ตฌ์ถํ๋ฉด์ ํ์ตํฉ๋๋ค. ์ด ๋จ์ด์์ ์ง๊ธ๊น์ง ๋ณธ ๊ฒ ์ค์์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ค์ ๋ฌธ์๋ ๋ฌด์์ ๋๊น? ๋ ๋ง์ ์ ๋ ฅ์ด ๋ค์ด ์ค๋ฉด ํ ์คํธ์์ ์ผ๋ฐ์ ์ธ ๋จ์ด๋ฅผ ๊ฝค ์ ๋ฐฐ์ฐ๊ณ ๋ค์ ๋จ์ด ๋ฅผ ์์ํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฌธ์๋ฅผ ๋ฐฐ์๋๋ค .
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ง๊ธ๊น์ง ๋ณธ ๊ฒ์ด โCaptaiโ์ธ ๊ฒฝ์ฐ โnโ์ ์์ธกํฉ๋๋ค.
- โ์บกํดโ์ด๋ฉด ๊ณต๊ฐ์ ์์ธกํฉ๋๋ค
- ๋จ์ด์ ์์์ด๊ณ ๋ง์ง๋ง ๋จ์ด๊ฐ โ์บกํดโ์ธ ๊ฒฝ์ฐ โAโ๋ฅผ ์์ธกํฉ๋๋ค.
- ์ง๊ธ๊น์ง ๋จ์ด๊ฐ โAโ์ด๋ฉด โh'(๊ทธ๋ฆฌ๊ณ โaโ์ โbโ; โCโ์ ์ ์ฌํ๊ฒ)๋ฅผ ์์ธกํฉ๋๋ค.
์ฒ์์๋ ์ํ์ง ์์ง๋ง ๊ฒฐ๊ตญ ์ค์ ๋จ์ด์ ํฐ ๋ถ๋ถ์ด ๋์ต๋๋ค. ๋์ฒด ์ต์ ์ ๊ณต๋ฐฑ์ด๋ฉฐ, ์์ ๋ฌธ์๊ฐ โnedtfoโ, ์ซ์ ๋๋ ํ์ดํ ๋๋ ์ํฌ์คํธ๋กํผ ์ค ํ๋๊ฐ ์๋ ํ ๊ณต๋ฐฑ์ โaโ์ ๋๋ค. ๋ํ 71 ์ ๋ค์ ์ค ๋ฐ๊ฟ ๋๋ 66 ์ ๋ค์ ๊ณต๋ฐฑ์ด ์์๋๋ ๊ฒฝ์ฐ ์ ๊ทน์ ์ผ๋ก ์ค ๋ฐ๊ฟ์ ์์ธกํฉ๋๋ค. ๋ ๋ค ๋ฐ์ดํฐ์ ๋ง๊ฒ ์กฐ์ ๋์์ต๋๋ค ( โtโ๋ ๊ณต๋ฐฑ ํ์ ํจ์ฌ ํํ์ง ๋ง ์ด๋ฏธ ์์ฃผ ์์ธก๋์์ผ๋ฏ๋ก โ a โ๋ 6 ๊ฐ์ง ํน์ํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ๋์ ์ถ์ธก์ ๋๋ค.)
์ด๋ค ๋จ์ด ์์ด ํจ๊ป๋์๋์ง ๋ฐฐ์ฐ๊ณ ๋งคํ์ ๋ฏธ๋ฆฌ ์ค์ ํ๋ ๊ฒ์ ๊ฐ์น๊ฐ์๋ ๊ฒ์ผ๋ก ๋ฐํ์ก์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ํ ์คํธ๋ก ๋๋ฉ๋๋ค.
nl tneund his I woi tis tnlost ahet toie tn tant wod, ihet taptain Ahab ses
snd t
oeed Sft aoid thshtego Io, fhe soie tn tant tot the soie ahe sewbtoon
swn tagd aoths eatmved fhe sewbtoon wor ta I sfey aote of totsonld nive betse
d ahe
hate Whale iorst Ihe e ioi beaos! -there soi beaos! -there soi beaos!
์ด๊ฒ์ ์ ๋ ฅ ์์ด ๋ถ๋ถ์ ํด๋นํฉ๋๋ค.
๊ทธ์ ์ฃผ์์.
ํ์ ํ ๊ณ ๋๋ณ์ธ์โ์๋ธ ์ ์ฅ๊ณผ ๊ฑฐ์ ๊ฐ์ ์๊ฐ์ ๋ณด์์ต๋๋ค.
โ๋์ผํ ์๊ฐ์ด ์๋์๋ค. ๋์ผํ์ง ์๋ค.-์๋, doubloon์ ๋์ ๊ฒ์ด๋ค. Fate๋ ๋๋ฅผ ์ํด doubloon์ ์์ฝํ๋ค. ๋๋ ์ค์ง ์ด๋ ๋๊ตฌ๋ ํฐ ๊ณ ๋๋ฅผ ๋จผ์ ์ฌ๋ฆด ์ ์์๋ค. -๊ทธ๋ ๊ฐ ๋ถ์๋ค!
์ ์ ํ ๋ช ์ฌ๊ฐ ์ด๋์์ ๋์ค๋์ง ์ ์ ์์ง๋ง ๋จ์ด์ ๋์ด ๋๋ถ๋ถ ์ณ์ต๋๋ค. โdouโ์ด ํ์๋๋ฉด โdoubtโ๊ฐ ํ์ํ์ง๋ง โlโ์ด ํ์๋๋ฉด โdoubloonโ์ด๋ฉ๋๋ค.
๋์ผํ ๋ชจ๋ธ๋ก ๋ ๋ฒ์งธ๋ก ์คํํ๋ฉด ๋ฐฉ๊ธ ๊ตฌ์ถ ํ ๋ ๋ค๋ฅธ 92k ์ ํ๋ (51.7 %-> 59.3 %)๊ฐ ๋ฐ์ํ์ง๋ง ๋ ๋ฒ์งธ ๋ฐ๋ณต์์ ํญ์ 60 % ๋ฏธ๋ง์ ๋๋ค.
์ธก์ ์ฝ๋๋ TIO ๋งํฌ์ ์๊ฑฐ๋ ์ฝ๊ฐ ๋ ๋์ ๋ฒ์ ์ ๋๋ค.
total = 0
right = 0
with open('whale.txt') as fp:
with open('guess.txt', 'w') as dest:
for l in fp.readlines():
for c in l:
last = c
if p == c: right += 1
n = f(c)
p = n
total += 1
dest.write(n)
if total % 10000 == 0:
print('{} / {} E={}\r'.format(right, total, total-right), end='')
print('{} / {}: E={}'.format(right, total, total - right))
guess.txt
๋์ ์ถ์ธก ๋ ์ถ๋ ฅ์ด ์์ต๋๋ค.
๋ต๋ณ
C ++, ์ ์ : 2 * 132 + 865821 = 866085
217 ๋ฐ์ดํธ๋ฅผ ์ ์ฝ ํ @Quentin์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
int f(int c){return c-10?"t \n 2 sS \n - 08........ huaoRooe oioaoheu thpih eEA \n neo enueee neue hteht e"[c-32]:10;}
๋ฌธ์๊ฐ ์ฃผ์ด์ง๋ฉด ์ ๋ ฅ ๋ฌธ์ ๋ค์์ ๊ฐ์ฅ ์์ฃผ ๋ํ๋๋ ๋ฌธ์๋ฅผ ์ถ๋ ฅํ๋ ๋งค์ฐ ๊ฐ๋จํ ์๋ฃจ์ ์ ๋๋ค.
๋ค์์ ์ฌ์ฉํ์ฌ ์ ์๋ฅผ ํ์ธํ์ญ์์ค.
#include <iostream>
#include <fstream>
int f(int c);
int main()
{
std::ifstream file;
file.open("whale2.txt");
if (!file.is_open())
return 1;
char p_ch, ch;
file >> std::noskipws >> p_ch;
int incorrect = 0;
while (file >> std::noskipws >> ch)
{
if (f(p_ch) != ch)
++incorrect;
p_ch = ch;
}
file.close();
std::cout << incorrect;
}
ํธ์ง :๋ฅผ ์ฌ์ฉ whale2.txt
ํ๋ฉด ์ ์๊ฐ ๋์์ง๋๋ค.
๋ต๋ณ
ํ์ด์ฌ, 2 * 516 + 521122 = 522154
์ฐ์ฐ:
๋ ๋ค๋ฅธ ํ์ด์ฌ ์ ์ถ,์ด ์๊ณ ๋ฆฌ์ฆ์ ๊ธธ์ด 1, โฆ, l์ ์ํ์ค๋ฅผ๋ณด๊ณ ๊ฐ์ฅ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ค์ ๋ฌธ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ํ๋ฅ ์ ํฉ์ด ์ฌ์ฉ๋๋ฉฐ ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ์ํ ๋ช ๊ฐ์ง ํธ๋ฆญ์ด ์์ต๋๋ค.
from collections import Counter as C, defaultdict as D
R,l=range,10
s,n='',[D(C) for _ in R(l+1)]
def A(c):
global s;s+=c;
if len(s)<=l:return ' '
P=D(lambda:0)
for L in R(1,l+1):
w=''.join(s[-L-1:-1]);n[L][w].update([c]);w=''.join(s[-L:])
try:
q,z=n[L][w].most_common(1)[0];x=sum(list(n[L][w].values()))
except IndexError:continue
p=z/x
if x<3:p*=1/(3-x)
P[q]+=p
if not P:return ' '
return max(P.items(),key=lambda i:i[1])[0]
import this, codecs as d
[A(c) for c in d.decode(this.s, 'rot-13')]
๊ฒฐ๊ณผ :
๋๋ถ๋ถ์ ํก์ค์์ค์ด์ง๋ง โFather Mappleโ๊ณผ ๊ฐ์ ๊ฐํน ๋ฌธ๊ตฌ๊ฐ ๋ํ๋ฉ๋๋ค.
errors: 521122
TRAINING:
result: tetlsnowleof the won -opes aIther Mapple,woneltnsinkeap hsd lnd the thth a shoey,aeidorsbine ao
actual: ntal knobs of the man-ropes, Father Mapple cast a look upwards, and then with a truly sailor-like bu
FINAL:
result: mnd wnd round ahe ind tveryaonsracting th ards the sol ens-ike aeock tolblescn the sgis of thet t
actual: und and round, then, and ever contracting towards the button-like black bubble at the axis of that s
ํ ์คํธ ์ฝ๋ :
๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ํ ์คํธ์ ๋ช ๊ฐ์ง ์๋ฅผ ๋ค๋ฅธ ์ง์ ์์ ์ถ๋ ฅํฉ๋๋ค. whale2.txt๋ฅผ ์ฌ์ฉํ๋ฉด ์ค ๋ฐ๊ฟ์ ๊ณ์ฐํ๋ ์ถ๊ฐ ๋ ผ๋ฆฌ๊ฐ ํ์ํ์ง ์์ต๋๋ค.
from minified import A
def score(predict, text):
errors = 0
newtext = []
for i, (actual, current) in enumerate(zip(text[1:], text[:-1])):
next = predict(current)
errors += (actual != next)
newtext.append(next)
if (i % (len(text) // 100) == 0):
print ('.', end='', flush=True)
return errors, ''.join(newtext)
t = open('whale2.txt')
text = t.read()
err2, text2 = score(A, text)
print('errors:', err2)
print("TRAINING:")
print(text2[100000:100100].replace('\n', '\\n'))
print(text1[100001:100101].replace('\n', '\\n'))
print("FINAL:")
print(text2[121400:1215500].replace('\n', '\\n'))
print(text[121401:1215501].replace('\n', '\\n'))