พื้นหลัง
ในปี 1870 Émile Baudot ได้คิดค้นBaudot Codeซึ่งเป็นการเข้ารหัสอักขระที่มีความยาวคงที่สำหรับโทรเลข เขาออกแบบรหัสที่จะป้อนจากแป้นพิมพ์คู่มือด้วยปุ่มเพียงห้าปุ่ม สองมือดำเนินการด้วยมือซ้ายและสามมือขวา:
สิทธิดัชนีกลางและแหวนนิ้วมือทำงานผม , IIและ
IIIปุ่มตามลำดับและดัชนีด้านซ้ายและนิ้วกลางดำเนิน
IVและⅤ (ต่อจากนี้ไปฉันจะใช้เลขอารบิคตะวันตกของพวกเขาคือ
1ถึง5 ) อักขระจะถูกป้อนเป็นคอร์ด ในการป้อนตัวอักษร "C" ผู้ดำเนินการกด1 , 3และ4ปุ่มพร้อมกันโดยที่แขนแปรงหมุนจะอ่านแต่ละคีย์ตามลำดับและส่งกระแสไฟฟ้าหรือสำหรับปุ่มที่ไม่ได้กดลงจะไม่มีกระแสไฟฟ้า ผลที่ได้คือในแง่ที่ทันสมัย 5 บิตอย่างน้อยอย่างมีนัยสำคัญบิตแรกเข้ารหัสไบนารีซึ่งในตัวอย่างของเรา "C" 10110
จะถูกเข้ารหัสเป็น
5 บิต
คุณอาจกำลังคิดว่า 5 บิตซึ่งสามารถแสดงสัญลักษณ์ที่ไม่ซ้ำกันมากที่สุดได้ไม่เกิน 32 ตัวนั้นไม่เพียงพอสำหรับตัวอักษรและตัวเลขภาษาอังกฤษทั้งหมดแม้กระทั่งการพูดถึงเครื่องหมายวรรคตอน Baudot มีอุบายแขนเสื้อของเขาแม้ว่า: ชุดอักขระของเขาเป็นจริงสองชุดที่แตกต่าง: ตัวอักษรและ
ตัวเลขและเขากำหนดสองรหัสพิเศษเพื่อสลับระหว่างพวกเขา
การเลื่อนตัวอักษรซึ่งเปลี่ยนไปใช้โหมดตัวอักษรเปิดใช้งานโดยการกดปุ่ม5เพียงอย่างเดียว ( 00001
) และการเลื่อนรูปถูกเปิดใช้งานด้วย
ปุ่ม4 ( 00010
)
ท้าทาย
ความท้าทายของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่ถอดรหัสการรับส่งสัญญาณของ Baudot
การส่งจริงจะเริ่มต้นด้วยบิตเริ่มต้นบางส่วนบวกเริ่มต้นและหยุดบิตก่อนและหลังอักขระแต่ละตัว แต่เราจะข้ามสิ่งเหล่านั้นและกังวลเฉพาะ 5 บิตที่ไม่ซ้ำกันสำหรับแต่ละอักขระ รูปแบบอินพุตและเอาต์พุตอธิบายไว้ด้านล่าง
รหัสของ Baudot
Baudot มีสองเวอร์ชั่นที่แตกต่างกัน: Continental และ UK พวกเราจะใช้เวอร์ชั่นของ UK ซึ่งไม่รวมถึงตัวอักษร "É" จากภาษาพื้นเมืองของ Baudot เราจะทิ้งสัญลักษณ์ทั้งหมดในเวอร์ชันสหราชอาณาจักรที่ไม่ใช่ตัวอักษร ASCII ที่พิมพ์ได้ คุณจะต้องถอดรหัสอักขระในตารางด้านล่างซึ่งทั้งหมดเป็นอักขระ ASCII ที่พิมพ์ได้ยกเว้นอักขระควบคุมสามตัวสุดท้ายที่อธิบายด้านล่างตาราง
คอลัมน์ "Ltr" แสดงตัวอักษรในโหมดตัวอักษรและ "รูป" แสดงตัวอักษรในโหมดรูป:
Encoding Encoding
Ltr Fig 12345 Ltr Fig 12345
--- --- -------- --- --- --------
A 1 10000 P + 11111
B 8 00110 Q / 10111
C 9 10110 R - 00111
D 0 11110 S 00101
E 2 01000 T 10101
F 01110 U 4 10100
G 7 01010 V ' 11101
H 11010 W ? 01101
I 01100 X 01001
J 6 10010 Y 3 00100
K ( 10011 Z : 11001
L = 11011 - . 10001
M ) 01011 ER ER 00011
N 01111 FS SP 00010
O 5 11100 SP LS 00001
/ 11000
สามแถวสุดท้ายในคอลัมน์ด้านขวาคืออักขระควบคุม:
ER
คือลบออก Baudot เครื่องโทรเลขจะพิมพ์เครื่องหมายดอกจันเหมือนสัญลักษณ์สำหรับตัวละครตัวนี้ที่จะบอกผู้อ่านว่าตัวละครก่อนควรละเลย แต่เรากำลังจะเป็นยัง nicer ให้ผู้อ่านและจริงงด (ไม่ได้พิมพ์) ตัวละครก่อน มันทำหน้าที่เหมือนกันทั้งในโหมดจดหมายและรูปFS
เป็นรูปกะ สิ่งนี้จะเปลี่ยนชุดอักขระจากตัวอักษรเป็นตัวเลข ถ้าตัวถอดรหัสอยู่ในโหมดรูปแล้ว FS จะถือว่าเป็นSpace (ดังนั้นSP
ในคอลัมน์ "Ltr") เมื่อตัวถอดรหัสอยู่ในโหมดรูปจะยังคงอยู่ในโหมดรูปจนกว่าจะได้รับอักขระ LSLS
เป็นจดหมายกะ มันสลับชุดอักขระจากรูปเป็นตัวอักษร ถ้าถอดรหัสที่มีอยู่แล้วในโหมด Letter, LS จะถือว่าเป็นพื้นที่ เมื่ออยู่ในโหมดจดหมายตัวถอดรหัสจะยังคงอยู่ในโหมดตัวอักษรจนกระทั่งได้รับอักขระ FS
ตัวถอดรหัสจะเริ่มในโหมดตัวอักษรเสมอ
นี่คือตัวอย่างของการเลื่อนรูป, การเลื่อนจดหมายและช่องว่าง:
01011 10000 00100 00001 00010 10000 11100 00001 10101 11010
M A Y LS/SP FS/SP 1 5 LS/SP T H
MAY 15TH
นี้อัตราผลตอบแทนข้อความ อย่างที่คุณเห็น00001
อักขระตัวแรก(ตัวอักษรเปลี่ยน / ช่องว่าง) ทำหน้าที่เป็นช่องว่างเนื่องจากตัวถอดรหัสอยู่ในโหมดตัวอักษรอยู่แล้ว ตัวอักษรถัดไป00010
(Shift รูป / อวกาศ) 15
สวิทช์ถอดรหัสไปที่โหมดรูปพิมพ์ จากนั้น00001
จะปรากฏขึ้นอีกครั้ง แต่คราวนี้มันทำหน้าที่เป็นตัวหนังสือกะเพื่อให้ตัวถอดรหัสกลับมาอยู่ในโหมดจดหมาย
เพื่อความสะดวกของคุณนี่คืออักขระในรูปแบบที่อาจย่อยง่ายในโปรแกรมแก้ไขเรียงลำดับตามรหัส:
A,1,10000|E,2,01000|/,,11000|Y,3,00100|U,4,10100|I,,01100|O,5,11100|FS,SP,00010|J,6,10010|G,7,01010|H,,11010|B,8,00110|C,9,10110|F,,01110|D,0,11110|SP,LS,00001|-,.,10001|X,,01001|Z,:,11001|S,,00101|T,,10101|W,?,01101|V,',11101|ER,ER,00011|K,(,10011|M,),01011|L,=,11011|R,-,00111|Q,/,10111|N,,01111|P,+,11111
อินพุต
อินพุตจะเป็นสตริงอาร์เรย์หรือรายการของบิตตามลำดับอย่างน้อยที่สำคัญบิตแรก อักขระแต่ละตัวจะถูกแทนด้วยกลุ่มของ 5 บิต บิตอาจอยู่ในรูปแบบที่สมเหตุสมผลเช่นสตริงไบนารี, อาร์เรย์ของ0
s และ1
s, สตริงของ"0"
และ"1"
ตัวอักษร, ตัวเลขที่มีขนาดใหญ่มากเดี่ยว ฯลฯ ตราบใดที่มันแมปโดยตรงกับบิตของการส่ง
การส่งทุกครั้งจะมีอย่างน้อยหนึ่งกลุ่มที่พิมพ์ได้และสูงสุด 255 quintets (สามารถพิมพ์ได้หรืออย่างอื่น) เช่น 5–1,275 บิตรวม
อินพุตสามารถมีเพียงบิตของการส่งโดยมีข้อยกเว้นที่อนุญาตสองข้อ: จำนวน0
บิตนำหน้าหรือต่อท้ายและ / หรือสำหรับอินพุตสตริงใด ๆบรรทัดใหม่ที่ต่อท้ายอาจเพิ่มการส่งผ่านได้ นำหน้าหรือต่อท้ายบิตหรือตัวละครไม่สามารถเพิ่มก่อนหรือหลังแต่ละกลุ่มได้เช่นคุณไม่สามารถแพ็ดแต่ละกลุ่มเป็น 8 บิต (หรือใช้แต่ละกลุ่มเป็นหมายเลขเดียวในอาร์เรย์ - ยกเว้นภาษาของคุณมีประเภทจำนวนเต็ม 5 บิต) หรือแยก quintets กับบิตใด ๆ "01111\n11100"
เพิ่มเติมเช่น
ซองโน้ตและขอบ
การส่งจะมีเฉพาะอักขระในคอลัมน์ "Ltr" และ "Fig" ในตารางด้านบน คุณจะไม่ได้รับเช่น
01110
ในโหมดรูปเพราะไม่อยู่ในคอลัมน์ "รูป"สันนิษฐานว่าตัวถอดรหัสจะอยู่ในโหมดจดหมายเสมอเมื่อเริ่มต้นการส่งสัญญาณ อย่างไรก็ตามอักขระตัวแรกอาจเป็นอักขระ FS เพื่อสลับไปยังโหมดรูปได้ทันที
เมื่อตัวถอดรหัสอยู่ในโหมดจดหมายมันอาจได้รับตัวอักษร LS และเมื่ออยู่ในโหมดรูปก็อาจได้รับตัวอักษร FS ไม่ว่าในกรณีใดอักขระอวกาศจะต้องพิมพ์ (ดูผลลัพธ์)
อักขระ ER จะไม่เป็นตัวอักษรตัวแรกในการส่งและจะไม่ติดตาม LS, FS หรือ ER อื่นทันที
อักขระ FS อาจตามอักขระ LS ทันทีและในทางกลับกัน
อักขระ LS หรือ FS จะไม่ใช่อักขระสุดท้ายในการส่งใด ๆ
/
และ-
ตัวอักษรอาจจะได้รับในโหมดตัวอักษรอย่างใดอย่างหนึ่ง (รหัส11000
และ10001
ตามลำดับ) หรือโหมดรูป (10111
และ00111
)
เอาท์พุต
เอาต์พุตอาจอยู่ในรูปแบบที่สมเหตุสมผลใด ๆ ซึ่งสมเหตุสมผลที่สุดคือ ASCII (หรือ UTF-8 ซึ่งอักขระที่แสดงทั้งหมดจะเหมือนกับ ASCII) โปรดระบุในคำตอบของคุณหากผลลัพธ์ของคุณอยู่ในการเข้ารหัสหรือรูปแบบอื่น
หมายเหตุ
- อักขระเว้นวรรค (ดู 3. ด้านบน) ควรเป็นพื้นที่ ASCII (0x20) หรือค่าที่เทียบเท่าของการเข้ารหัสของคุณนั่นคือสิ่งที่คุณจะได้รับเมื่อคุณกดแป้นเว้นวรรค
การชนะ
นี่คือรหัสกอล์ฟ รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ
ข้อ จำกัด
ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
ช่องว่างต่อท้ายและ / หรือขึ้นบรรทัดใหม่ต่อท้ายได้รับอนุญาต ช่องว่างนำหน้าหรืออักขระอื่น ๆ (ที่ไม่ได้เป็นส่วนหนึ่งของการส่งข้อมูล) จะไม่ได้รับอนุญาต
คุณไม่สามารถใช้ฟังก์ชั่นในตัวหรือไลบรารีใด ๆ ที่ถอดรหัสรหัส Baudot (หรือลูกหลานของมันเช่น Murray Code, ITA-1 ฯลฯ )
กรณีทดสอบ
Input: 001101000010100111101110010101
Output: BAUDOT
Input: 11010010001001100011110111101111100
Output: HELLO
Input: 01011100000010000001000101000011100000011010111010
Output: MAY 15TH
Input: 0001000100010000001000001011101110011100101010010110101010001111100101
Output: 32 FOOTSTEPS
Input: 10110000110101011100111100001111011010000001101110
Output: GOLF
Input: 000100011000001111100000100010110111001100010110010000111111
Output: 8D =( :P
Input: 0000100001000010000100010001111011111011000011100010001
Output (4 leading spaces): -/=/-
00010
จะแสดงรายการSP
ในโหมดตัวอักษรและFS
ในโหมดรูป ตามคำอธิบายถ้าเราอยู่ในโหมดตัวอักษรและเราได้รับรหัส00010
เราควรเลื่อนไปที่โหมดรูป แต่ค่าในตารางดูเหมือนจะเป็นวิธีอื่น 00001
นอกจากนี้ในทางกลับกันสำหรับ