হামিং ব্যবহার করে সঠিক ত্রুটি (7,4)


19

হামিং (,,৪) কোডটি ১৯৫০-এ ফিরে যায় then এর আগে রিচার্ড হামিং বেল ল্যাবসে গণিতবিদ হিসাবে কাজ করেছিলেন। প্রতি শুক্রবার হামিং ধারাবাহিক গণনা করার জন্য গণনা মেশিনগুলি সেট করে এবং নিম্নলিখিত সোমবারে ফলাফল সংগ্রহ করে। প্যারিটি চেক ব্যবহার করে, এই মেশিনগুলি গণনার সময় ত্রুটিগুলি সনাক্ত করতে সক্ষম হয়েছিল। হতাশ, কারণ তিনি প্রায়ই বার বার ত্রুটি বার্তা পেয়েছিলেন, হামিং ত্রুটি সনাক্তকরণটি উন্নত করার সিদ্ধান্ত নিয়েছে এবং বিখ্যাত হামিং কোডগুলি আবিষ্কার করেছে।

হামিংয়ের মেকানিক্স (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

ট্রান্সমিশন বা একটি গণনার সময় 6th ষ্ঠ বিট (= ২ য় ডেটা বিট) ফ্লিপ করতে দেয়। আপনি শব্দটি গ্রহণ করুন 0110001। কথিত প্রাপ্ত তথ্য হ'ল 1001। আপনি প্যারিটি বিট আবার নিরূপণ p1 = 1 + 0 + 1 = 0, p2 = 1 + 0 + 1 = 0, p3 = 0 + 0 + 1 = 1। কেবল p1কোডওয়ার্ডের প্যারিটি বিটের সাথে মেলে 0110001। সুতরাং একটি ত্রুটি ঘটেছে। উপরের টেবিলটির দিকে তাকিয়ে আমাদের জানান যে ত্রুটিটি ঘটেছে d3এবং আপনি মূল তথ্যটি পুনরুদ্ধার করতে পারেন 1011

চ্যালেঞ্জ:

একটি ফাংশন বা একটি প্রোগ্রাম লিখুন, এটি একটি শব্দ (7 বিট) গ্রহণ করে, বিটগুলির মধ্যে একটিও ভুল হতে পারে এবং আসল তথ্যটি পুনরুদ্ধার করে। ইনপুট (এসটিডিআইএন, কমান্ড-লাইন আর্গুমেন্ট, প্রম্পট বা ফাংশন আর্গুমেন্টের মাধ্যমে) ফর্ম্যাটটি স্ট্রিং "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


1
প্রথম ডেটা বিটের পরে শেষ প্যারিটি বিট দেওয়ার কোনও কারণ আছে কি?
xnor

2
@ এক্সনর গাণিতিকভাবে এটি কোনও পার্থক্য করে না, প্যারিটি বিটগুলি কোন অবস্থানে রয়েছে। Icallyতিহাসিকভাবে এগুলি দুটি শক্তির পদে স্থাপন করা হয়। উদাহরণস্বরূপ, হামিং (15,11) এর 1, 2, 4 এবং 8 পজিশনে সমতা বিট রয়েছে
জাকুবে

4
@ xnor আপনি যদি [is_p3_wrong][is_p2_wrong][is_p1_wrong]বেস দুইটি নেন তবে এটি শব্দের মধ্যে ভুল বিটের অবস্থান দেয়। (প্রশ্নের টেবিলের উপর ভিত্তি করে)) এটি সম্ভবত কিছু অ্যালগরিদমের জন্য কার্যকর হবে।
এলোমেলো

খুব সুন্দর :) আপনি যখন "একটি ফাংশন বা একটি প্রোগ্রাম লিখুন, যা একটি শব্দ (7 বিট) প্রাপ্ত করে, সেগুলির মধ্যে একটি ভুল হতে পারে, [...]" আমি মনে করি আপনার বিটগুলির মধ্যে একটি ভুল হতে পারে তবে আপনি আসলে একটি শব্দ হতে পারে বলে।

@ ল্যাম্বিক শিওর, এটি পরিষ্কার করে দিলেন।
জাকুব

উত্তর:


6

অক্টাভা, 70 66 55 বাইট

এই ফাংশনটি Fডিকোডিং ম্যাট্রিক্স সেটআপ করছে H, ত্রুটিটি সন্ধান করছে এবং ত্রুটির অবস্থানটি সংশোধন করছে (যদি থাকে তবে)। তারপরে এটি সঠিক ডেটা বিটগুলি ফিরিয়ে দিচ্ছে। ইনপুট একটি স্ট্যান্ডার্ড সারি ভেক্টর।

@ জাকুব পরামর্শ দিলেন মতলবের পরিবর্তে আমার অষ্টাভে ব্যবহার করা উচিত যেখানে আপনি প্রকাশের সূচকগুলি ব্যবহার করতে পারেন, যা পুরো জিনিসটি আবার 11 টি বাইটকে আরও ছোট করে তোলে:

F=@(c)xor(c,1:7==bi2de(mod(c*de2bi(1:7,3),2)))([3,5:7])

মাতলাব- এর সংক্ষিপ্ত সমাধানটি নীচে দেওয়া হয়েছে , কারণ আপনি সরাসরি প্রকাশের সূচকে ব্যবহার করতে পারবেন না। (এটি অবশ্যই অক্টাভেতেও কাজ করে)) এর সাথে যোগ / মোড 2 প্রতিস্থাপন করতে সক্ষম হয়েছিল xor:

f=@(c)c([3,5:7]);F=@(c)f(xor(c,1:7==bi2de(mod(c*de2bi(1:7,3),2))))

পুরানো:

f=@(c)c([3,5:7]);F=@(c)f(mod(c+(1:7==bi2de(mod(c*de2bi(1:7,3),2))),2))

আপনাকে ধন্যবাদ, তবে এটি কার্যকর হয় না, দুর্ভাগ্যক্রমে আপনি কেবল
সেভাবে চলকগুলি

1
মতলব ইনস্টল করা হয়নি, আমি কেবল এটি ব্যবহার করেছি http://octave-online.net/, যেখানে এটি কাজ করে। ভাষা পরিবর্তন হতে পারে?
জাকুব

ওহ, আমি অষ্টাভটি এমনটি করতে পারে এমন সন্দেহ করে অলরেডি ছিলাম, তবে তারপরে আমি অবশ্যই ভাষা পরিবর্তন করব, আপনাকে অনেক ধন্যবাদ!
flawr

14

পিট 50x11 = 550

এখানে চিত্র বর্ণনা লিখুন

কোডেলের আকার 15. আকার সম্পর্কে খুব বেশি চিন্তিত নয়, তবে এটি সমস্ত পরীক্ষায় পাস করেছে।


4
আমি বরং সমস্যাটির প্রেক্ষাপটে এটিকে পছন্দ করি।

1
@ অপ্টিমাইজার "কোডেলের আকার" মূলত একটি পিট প্রোগ্রামের ম্যাগনিফিকেশন ফ্যাক্টর। এখানে, প্রতিটি লজিকাল পিক্সেল (বা কোডেল) আরও সহজে দৃশ্যমান করার জন্য 15x15 ব্লকে প্রসারিত করা হয়েছে। এটাই আমি বলতে চাইছি, "কোডের আকার" নয়
ক্যাপচার্যাগ

আহ ..... আমার খারাপ।
অপ্টিমাইজার

8

পাইথন, 79

f=lambda x,n=0,e=3:e&~-e and f(x,n+1,(n&8)*14^(n&4)*19^(n&2)*21^n%2*105^x)or~-n

ডানদিকে কমপক্ষে উল্লেখযোগ্য বিট সহ সংখ্যা হিসাবে ইনপুট এবং আউটপুট নিন।

ত্রুটি পুনরুদ্ধারের চেষ্টা করার পরিবর্তে, আমরা কেবল n1 থেকে 15 পর্যন্ত প্রতিটি সম্ভাব্য বার্তা এনকোড করার চেষ্টা করি যতক্ষণ না আমরা কোনও এনকোডিং না পেয়ে যা দেওয়া হয় তার থেকে কিছুটা দূরে। পুনরাবৃত্তি nযতক্ষণ না কাজ করে এবং এটি ফেরত না দেয় ততক্ষণ বাড়তে থাকে। যদিও কোনও স্পষ্ট সমাপ্তি নেই, এটি অবশ্যই 16 টি লুপের মধ্যেই শেষ হবে।

এক্সপ্রেশন (n&8)*14^(n&4)*19^(n&2)*21^n%2*105হ্যামিং ম্যাট্রিক্সটিকে কিছুটা বিভক্ত করে।

একটি একক ত্রুটি পরীক্ষা করার জন্য, আমরা একটি গণনা করা প্রদত্ত বার্তাটি পেয়েছি e, এবং এটি ক্লাসিক বিট-ট্রিকের সাথে দুটি (বা 0) এর শক্তি কিনা তা পরীক্ষা করে দেখি e&~-e==0। তবে, আমরা আসলে eএকটি ল্যাম্বডায় ভেরিয়েবলকে বরাদ্দ করতে পারি না এবং আমরা এই অভিব্যক্তিটিতে দু'বার উল্লেখ করেছি, সুতরাং আমরা পরবর্তী পুনরাবৃত্তির পদক্ষেপের একটি argumentচ্ছিক যুক্তি হিসাবে এটি পাস করার একটি হ্যাক করি।


7

জাভাস্ক্রিপ্ট (ES6), 92 87 81

এমএসবিতে একটি পূর্ণসংখ্যা প্রাপ্ত এবং ফিরে ফাংশন।
বাস্তবায়নটি সরাসরি র্যান্ডোমার মন্তব্যে অনুসরণ করা হয়েছে:

  • গণনা p3wrong | p2wrong | p1wrong (লাইন 2,3,4)
  • ভুল বিট (লাইন 1) ফ্লিপ করতে এটি একটি বিট মাস্ক হিসাবে ব্যবহার করুন,
  • তারপরে কেবল ডেটা বিটগুলি ফিরিয়ে দিন (শেষ লাইন)
F=w=>(w^=128>>(
  (w^w*2^w*4^w/2)&4|
  (w/8^w^w*2^w/16)&2|
  (w/16^w/4^w^w/64)&1
))&7|w/2&8

টেস্ট ইন Frefox / ফায়ারবাগ কনসোলটি

;[0b1110000,0b1100000,0b1111011,0b0110001,
0b1011011,0b0101001,0b1010000,0b0100010]
.map(x=>x.toString(2)+'->'+F(x).toString(2))

আউটপুট

["1110000->1000", "1100000->1000", "1111011->1111", "110001->1011", "1011011->1010", "101001->1", "1010000->1000", "100010->10"]

1
আমি আপনার কমপ্যাক্ট বিটওয়াইজ অপারেশন
সলিউশনটি

4

পাইথন 2, 71

f=lambda i,b=3:i&7|i/2&8if chr(i)in'\0%*3<CLUZfip'else f(i^b/2,b*2)

বেশ কয়েকটি অক্ষর অপরিশোধিত এএসসিআইআই তাই এখানে একটি পালানো সংস্করণ:

f=lambda i,b=3:i&7|i/2&8if chr(i)in'\0\x0f\x16\x19%*3<CLUZfip\x7f'else f(i^b/2,b*2)

ফাংশনে ইনপুট এবং আউটপুট পূর্ণসংখ্যা হিসাবে সম্পন্ন হয়।

আমি বৈধ বার্তাগুলির সংখ্যা মাত্র 16, এবং এগুলি সমস্তকে কঠোর কোডিং করে তুলছি। তারপরে আমি এর মধ্যে একটি না পাওয়া পর্যন্ত আমি বিভিন্ন বিট উল্টানোর চেষ্টা করি।


3

হাস্কেল, 152 বাইট

a(p,q,d,r,e,f,g)=b$(d+e)#p+2*(d+f)#q+4*(e+f)#r where b 3=(1-d,e,f,g);b 5=(d,1-e,f,g);b 6=(d,e,1-f,g);b 7=(d,e,f,g-1);b _=(d,e,f,g);x#y=abs$(x+g)`mod`2-y

ব্যবহার: a (1,1,1,1,0,1,1)যা আউটপুট(1,1,1,1)

সোজা সমাধান: p<x>মিল না থাকলে <x>সংখ্যায় বিট সেট করুন । এই সংখ্যা হয়, তাহলে 3, 5, 6বা 7সংশ্লিষ্ট টুসকি d<y>


কীভাবে আপনার কোডটি কল করা যায় (উদাহরণস্বরূপ আইডোন.কম এর মতো কোনও অনলাইন সংকলক ব্যবহার করে ) আপনি আরও কিছু নির্দেশাবলী যুক্ত করতে পারেন ? আমি সবসময় কিছু অদ্ভুত ত্রুটি পাই (খুব সম্ভবত আমার দোষ)।
জাকুব

@Jakube: একটি ফাইলে code সেভ বলতে hamming.hsএবং Haskell REPL ghci সেটিকে লোড: ghci hamming.hsaউপরে বর্ণিত হিসাবে ফাংশন কল করুন । আমি জানি ( অনলাইনে ) একমাত্র অনলাইন হ্যাশেল দোভাষীর জন্য আরও কিছু কোড প্রয়োজন:let a(p,q, ... 2-y in a (1,1,1,1,0,1,1)
নিমি

3

আইএ -32 মেশিন কোড, 36 বাইট

Hexdump:

33 c0 40 91 a8 55 7a 02 d0 e1 a8 66 7a 03 c0 e1
02 a8 78 7a 03 c1 e1 04 d0 e9 32 c1 24 74 04 04
c0 e8 03 c3

সমতুল্য কোড কোড:

unsigned parity(unsigned x)
{
    if (x == 0)
        return 0;
    else
        return x & 1 ^ parity(x >> 1);
}

unsigned fix(unsigned x)
{
    unsigned e1, e2, e3, err_pos, data;
    e1 = parity(x & 0x55);
    e2 = parity(x & 0x66);
    e3 = parity(x & 0x78);
    err_pos = e1 + e2 * 2 + e3 * 4;
    x ^= 1 << err_pos >> 1;
    data = x;
    data &= 0x74;
    data += 4;
    data >>= 3;
    return data;
}

x86 সিপিইউ স্বয়ংক্রিয়ভাবে প্রতিটি মধ্যবর্তী ফলাফলের সমতা গণনা করে। এটির একটি উত্সর্গীকৃত নির্দেশ আছে jpযা সাম্যের উপর নির্ভর করে জাম্প দেয় বা না যায়।

এটি চ্যালেঞ্জটিতে স্পষ্টভাবে নির্দিষ্ট করা হয়নি, তবে হামিং কোডগুলির সুবিধাজনক সম্পত্তি হ'ল আপনি প্যারিটি বিটকে বাইনারি সংখ্যা হিসাবে ব্যাখ্যা করতে পারেন এবং এই সংখ্যাটি নির্দেশ করে যে সংক্রমণকালে কোন বিটটি নষ্ট হয়েছিল। প্রকৃতপক্ষে, এই সংখ্যাটি 1-ভিত্তিক, 0 টির সাথে কোনও সংক্রমণ ত্রুটি ছিল না। এটি 1 বাম দিকে err_posএবং তারপরে ডানদিক দিয়ে শিফট করে প্রয়োগ করা হয় 1

সংক্রমণ ত্রুটি ঠিক করার পরে, কোডটি প্রয়োজনীয় ক্রমে ডেটা বিটের ব্যবস্থা করে। কোডটি আকারের জন্য অনুকূলিত হয়েছে এবং এটি কীভাবে কাজ করে তা প্রথমে অস্পষ্ট হতে পারে। তা ব্যাখ্যা করার জন্য, আমি দ্বারা বোঝাতে a, b, c, dতথ্য বিট, এবং দ্বারা P, Qএবং Rসমতা বিট। তারপর:

    data = x;     // d  c  b  R  a  Q  P
    data &= 0x74; // d  c  b  0  a  0  0
    data += 4;    // d  c  b  a ~a  0  0
    data >>= 3;   // d  c  b  a

সমাবেশ উত্স ( fastcallকনভেনশন, ইনপুট ecxএবং আউটপুট ইন eax):

    xor eax, eax;
    inc eax;
    xchg eax, ecx;

    test al, 0x55;
    jp skip1;
    shl cl, 1;

skip1:
    test al, 0x66;
    jp skip2;
    shl cl, 2;

skip2:
    test al, 0x78;
    jp skip3;
    shl ecx, 4;

skip3:
    shr cl, 1;
    xor al, cl;

    and al, 0x74;
    add al, 4;
    shr al, 3;

    ret;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.