Hamming (7,4) 코드는 1950 년으로 거슬러 올라갑니다. 당시 Richard Hamming은 Bell Labs에서 수학자로 일했습니다. 매주 금요일 Hamming은 계산 기계가 일련의 계산을 수행하도록 설정하고 다음 월요일에 결과를 수집했습니다. 패리티 검사를 사용하여이 기계는 계산 중에 오류를 감지 할 수있었습니다. 좌절 한 그는 오류 메시지를 너무 자주 받았기 때문에 오류 감지를 개선하기로 결정하고 유명한 해밍 코드를 발견했습니다.
해밍의 역학 (7,4)
해밍 코드의 목적은 데이터 비트 또는 패리티 비트에서 단일 비트 에러 (1 비트가 뒤집어 짐)가 검출되고 정정 될 수 있도록 중첩되는 패리티 비트 세트를 생성하는 것이다. 여러 오류가 발생하는 경우에만 해밍 코드가 원본 데이터를 복구하지 못합니다. 전혀 오류가 발생하지 않거나 잘못 정정 할 수도 있습니다. 따라서이 과제에서는 단일 비트 오류 만 처리합니다.
해밍 코드의 예로 해밍 (7,4) 코드를 살펴 보겠습니다. 또한 4 비트의 데이터에 d1, d2, d3, d4
3 개의 패리티 비트를 사용하는데 p1, p2, p3
, 이는 다음 방정식을 사용하여 계산됩니다.
p1 = (d1 + d2 + d4) % 2
p2 = (d1 + d3 + d4) % 2
p3 = (d2 + d3 + d4) % 2
결과 코드 워드 (데이터 + 패리티 비트)는 형식 p1 p2 d1 p3 d2 d3 d4
입니다.
오류를 감지하면 다음과 같은 방식으로 작동합니다. 패리티 비트를 다시 계산하고 수신 된 패리티 비트와 일치하는지 확인하십시오. 다음 표에서 볼 수 있듯이 모든 단일 비트 오류마다 패리티 비트가 서로 다르게 일치합니다. 따라서 모든 단일 비트 오류를 지역화하고 수정할 수 있습니다.
error in bit | p1 | p2 | d1 | p3 | d2 | d3 | d4 | no error
-------------|---------------------------------------------
p1 matches | no | yes| no | yes| no | yes| no | yes
p2 matches | yes| no | no | yes| yes| no | no | yes
p3 matches | yes| yes| yes| no | no | no | no | yes
예
당신의 데이터를 보자 1011
. 패리티 비트는 p1 = 1 + 0 + 1 = 0
, p2 = 1 + 1 + 1 = 1
및 p3 = 0 + 1 + 1 = 0
. 데이터와 패리티 비트를 결합하면 코드 워드가 표시 0110011
됩니다.
data bits | 1 011
parity bits | 01 0
--------------------
codeword | 0110011
전송 또는 계산 중에 6 번째 비트 (= 3 번째 데이터 비트)가 뒤집 힙니다. 당신은 단어를받습니다 0110001
. 수신 된 것으로 의심되는 데이터는 1001
입니다. 당신은 다시 패리티 비트를 계산 p1 = 1 + 0 + 1 = 0
, p2 = 1 + 0 + 1 = 0
, p3 = 0 + 0 + 1 = 1
. p1
코드 워드의 패리티 비트 만 일치합니다 0110001
. 따라서 오류가 발생했습니다. 위의 표를 보면 오류가 발생했음을 d3
나타내며 원래 데이터를 복구 할 수 있습니다 1011
.
도전:
워드 (7 비트)를 수신하고 비트 중 하나가 잘못되었을 수있는 함수 또는 프로그램을 작성하고 원래 데이터를 복구하십시오. STDIN, 명령 행 인수, 프롬프트 또는 함수 인수를 통한 입력 형식은 MSB 의 문자열 "0110001"
, 목록 또는 배열 [0, 1, 1, 0, 0, 0, 1]
또는 정수일 수 0b0110001 = 49
있습니다. 위에서 설명한 것처럼 입력 순서는 p1 p2 d1 p3 d2 d3 d4
입니다. 리턴 값 또는 STDOUT을 통한 출력은 형식은 동일하지만 순서대로되어 있어야 d1 d2 d3 d4
합니다. 4 데이터 비트 만 반환 / 출력합니다.
이것은 코드 골프입니다. 따라서 가장 짧은 코드가 승리합니다.
테스트 사례 :
1110000 -> 1000 # no error
1100000 -> 1000 # error at 1st data bit
1111011 -> 1111 # error at 2nd data bit
0110001 -> 1011 # error at 3rd data bit (example)
1011011 -> 1010 # error at 4th data bit
0101001 -> 0001 # error at 1st parity bit
1010000 -> 1000 # error at 2nd parity bit
0100010 -> 0010 # error at 3rd parity bit
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=45684;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;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>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>