การเข้ารหัสแมนเชสเตอร์เป็นโปรโตคอลโทรคมนาคมที่ใช้ในการสื่อสารทางวิทยุที่รับประกันการเปลี่ยนบิตในช่วงเวลาปกติเพื่อให้ผู้รับสามารถกู้คืนอัตรานาฬิกาจากข้อมูลได้ มันเพิ่มบิตเรตเป็นสองเท่า แต่ราคาถูกและใช้งานง่าย มันถูกใช้อย่างกว้างขวางโดยผู้ประกอบการวิทยุสมัครเล่น
แนวคิดนี้ง่ายมาก: ในระดับฮาร์ดแวร์นาฬิกาและสายข้อมูลเป็นเพียง XORed ด้วยกัน ในซอฟต์แวร์นี่คือภาพที่แปลงอินพุตสตรีมของบิตให้เป็นเอาต์พุตสตรีมอัตราสองเท่าโดยแต่ละอินพุต '1' ถูกแปลเป็น '01' และแต่ละอินพุต '0' แปลเป็น '10'
นี่เป็นปัญหาที่ง่าย แต่เปิดให้มีการใช้งานมากมายเนื่องจากลักษณะของบิตสตรีม นั่นคือการเข้ารหัสเป็นแนวคิดแบบกระบวนการทีละบิตแทนที่จะเป็นกระบวนการไบต์ต่อไบต์ ดังนั้นเราทุกคนเห็นด้วยกับ endianness บิตที่สำคัญน้อยที่สุดของอินพุตกลายเป็นไบต์ที่สำคัญที่สุดของเอาต์พุต
เวลาเล่นกอล์ฟ! เขียนฟังก์ชั่นที่กำหนดอาร์เรย์ความยาวตามอำเภอใจเป็นไบต์ส่งกลับอาร์เรย์ของข้อมูลแมนเชสเตอร์ที่เข้ารหัส
อินพุตและเอาต์พุตควรถูกพิจารณาเป็น little-endian ไบต์ที่มีนัยสำคัญน้อยที่สุดก่อนและ BIT ที่สำคัญน้อยที่สุดในบิตสตรีม
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
- ประสิทธิภาพจะต้องไม่น่ากลัวเกินไป: <10 วินาทีสำหรับ 16KB
- ไบต์ที่สำคัญน้อยที่สุดก่อนในหน่วยความจำ
ความท้าทายด้านช่องทาง :
- ท้าทายคำตอบของผู้ใช้คนอื่นโดยการพิสูจน์รหัสของคุณเร็วขึ้นหน่วยความจำมีประสิทธิภาพมากขึ้นหรือสร้างไบนารีที่เล็กลง