हेमिंग (7,4) कोड 1950 तक वापस चला जाता है। इसके बाद रिचर्ड हैमिंग ने बेल लैब्स में गणितज्ञ के रूप में काम किया। हर शुक्रवार को हैमिंग ने गणना की एक श्रृंखला करने के लिए गणना मशीनों को सेट किया, और अगले सोमवार को परिणाम एकत्र किए। समता जांच का उपयोग करते हुए, ये मशीनें गणना के दौरान त्रुटियों का पता लगाने में सक्षम थीं। निराश, क्योंकि उन्हें अक्सर त्रुटि संदेश प्राप्त हुआ, हेमिंग ने त्रुटि का पता लगाने में सुधार करने का फैसला किया और प्रसिद्ध हैमिंग कोड की खोज की।
हेमिंग के यांत्रिकी (7,4)
हैमिंग कोड का लक्ष्य समता बिट्स का एक सेट बनाना है जो एक डेटा बिट में एक एकल-बिट त्रुटि (एक बिट फ़्लिप) को ओवरलैप करता है या एक समता बिट का पता लगाया और ठीक किया जा सकता है। केवल अगर कई त्रुटियां होती हैं, तो हेमिंग कोड मूल डेटा को पुनर्प्राप्त करने में विफल रहता है। यह एक त्रुटि को बिल्कुल भी नोटिस नहीं कर सकता है, या इसे गलत तरीके से भी सही कर सकता है। इसलिए इस चुनौती में हम केवल एकल-बिट त्रुटियों से निपटेंगे।
हेमिंग कोड के एक उदाहरण के रूप में, हम हेमिंग (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, कमांड-लाइन तर्क, प्रॉम्प्ट या फ़ंक्शन तर्क के माध्यम से) प्रारूप एक स्ट्रिंग "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
[is_p3_wrong][is_p2_wrong][is_p1_wrong]
आधार दो में लेते हैं तो यह शब्द में गलत बिट की स्थिति देता है। (प्रश्न में तालिका के आधार पर।) यह संभवतः कुछ एल्गोरिदम के लिए उपयोगी होगा।