Hamming(7,4)コードは1950年に遡ります。当時、Richard HammingはBell Labsで数学者として働いていました。毎週金曜日、ハミングは一連の計算を実行するように計算機を設定し、次の月曜日に結果を収集しました。パリティチェックを使用して、これらのマシンは計算中にエラーを検出できました。ハミングはエラーメッセージを頻繁に受信するため、エラー検出を改善することを決め、有名なハミングコードを発見しました。
ハミングの力学(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ビット)を受け取る関数またはプログラムを作成します。ビットの1つが間違っている可能性があり、元のデータを復元します。入力(STDIN、コマンドライン引数、プロンプト、または関数引数による)形式は、文字列"0110001"
、リスト、配列、[0, 1, 1, 0, 0, 0, 1]
またはMSBの整数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>