मैनचेस्टर कोडिंग एक दूरसंचार प्रोटोकॉल है जो रेडियो संचार में उपयोग किया जाता है जो एक नियमित अंतराल पर बिट संक्रमण की गारंटी देता है ताकि एक रिसीवर डेटा से ही घड़ी की दर को पुनर्प्राप्त कर सके। यह बिटरेट को दोगुना कर देता है, लेकिन यह सस्ता और सरल है। यह शौकिया रेडियो ऑपरेटरों द्वारा व्यापक रूप से उपयोग किया जाता है।
अवधारणा बहुत सरल है: एक हार्डवेयर स्तर पर, घड़ी और डेटा लाइनें बस एक साथ XORed हैं। सॉफ्टवेयर में, यह बिट्स के इनपुट स्ट्रीम को डबल-रेट आउटपुट स्ट्रीम में परिवर्तित करने के रूप में चित्रित किया गया है, प्रत्येक इनपुट '1' का अनुवाद '01' और प्रत्येक इनपुट '0' का अनुवाद '10' में किया गया है।
यह एक आसान समस्या है, लेकिन इसकी बिटस्ट्रीम प्रकृति के कारण बहुत सारे कार्यान्वयन के लिए खुला है। यही है, एन्कोडिंग एक बाइट-बाय-बाइट प्रक्रिया के बजाय अवधारणात्मक रूप से बिट-बाय-बिट प्रक्रिया है। इसलिए हम सभी एंडियननेस पर सहमत हैं, इनपुट के कम से कम महत्वपूर्ण बिट आउटपुट के सबसे कम महत्वपूर्ण बाइट बन जाते हैं।
गोल्फ का समय! एक फ़ंक्शन लिखें, जो बाइट्स की मनमानी लंबाई सरणी को देखते हुए, उस डेटा मैनचेस्टर एनकोडेड की एक सरणी देता है।
इनपुट और आउटपुट को बिट-एंडियन, कम से कम महत्वपूर्ण बाइट, और कम से कम महत्वपूर्ण बीआईटी को पहली धारा में माना जाना चाहिए।
ASCII बिटस्ट्रीम ड्राइंग :
bit # 5 4 3 2 1 0 5 4 3 2 1 0
IN ------- 1 0 1 0 1 1 ---> [manchester encoder] --- 01 10 01 10 01 01 ----> OUT
उदाहरण :
Example 1 (hex):
LSB MSB <-- least sig BYTE first
IN : [0x10, 0x02]
OUT: [0xAA, 0xA9, 0xA6, 0xAA]
Example 1 (binary):
msb lsb msb lsb <-- translated hex, so msb first
BIN: [00010000, 00000010] <-- least sig NIBBLE...
BIN: [10101010, 10101001, 10100110, 10101010] <-- becomes least sig BYTE
LSB MSB
Example 2
IN : [0xFF, 0x00, 0xAA, 0x55]
OUT: [0x55, 0x55, 0xAA, 0xAA, 0x66, 0x66, 0x99, 0x99]
Example 3
IN : [0x12, 0x34, 0x56, 0x78, 0x90]
OUT: [0xA6, 0xA9, 0x9A, 0xA5, 0x96, 0x99, 0x6A, 0x95, 0xAA, 0x69]
Example 4
IN : [0x01, 0x02, 0x03, 0xF1, 0xF2, 0xF3]
OUT: [0xA9, 0xAA, 0xA6, 0xAA, 0xA5, 0xAA, 0xA9, 0x55, 0xA6, 0x55, 0xA5, 0x55]
नियम :
- इनपुट को आउटपुट में इनपुट बदलने के लिए केवल एल्गोरिदम की आवश्यकता होती है।
- इनपुट और प्रिंटिंग आउटपुट को प्राप्त करना समाधान का एक आवश्यक हिस्सा नहीं है, लेकिन इसमें शामिल किया जा सकता है। यदि आप अपने समाधान में शामिल नहीं हैं, तो आपको अपना परीक्षण / प्रिंट कोड प्रदान करने के लिए प्रोत्साहित किया जाता है।
- इनपुट 8-बिट बाइट्स का एक सरणी है (जो भी आपकी पसंद की भाषा में हो सकता है), एक पाठ स्ट्रिंग नहीं। यदि आप अपनी भाषा में सुविधाजनक हैं, तो आप स्ट्रिंग्स को स्टोरेज प्रारूप के रूप में उपयोग कर सकते हैं, लेकिन गैर-मुद्रण योग्य वर्ण (यानी 0xFF) का समर्थन किया जाना चाहिए। यदि आवश्यक हो तो इनपुट एक लंबाई भी ले सकता है।
आउटपुट के लिए मेमोरी को आपकी दिनचर्या द्वारा आवंटित किया जाना चाहिए, प्रदान नहीं किया गया।संपादित करें: अनावश्यक आवश्यकता- आउटपुट भी 8-बिट बाइट्स की एक सरणी है, और यदि आवश्यक हो तो एक लंबाई।
- कम से कम 16KB इनपुट का समर्थन करना चाहिए
- प्रदर्शन बहुत भयानक नहीं होना चाहिए: <10s 16KB के लिए
- स्मृति में पहले से महत्वपूर्ण बाइट।
साइड-चैनल चुनौती :
- अपने कोड को साबित करके किसी अन्य उपयोगकर्ता के जवाब को तेज़, अधिक मेमोरी कुशल, या एक छोटा बाइनरी पैदा करता है!