Фон
У 1870 році Еміль Бодо винайшов Код Бодо , кодування символів фіксованої довжини для телеграфії. Він сконструював код, який потрібно вводити з ручної клавіатури лише з п'ятьма клавішами; двоє оперовані лівою рукою і три правою:
Правий вказівний, середній та безіменний пальці керують клавішами I , II та
III відповідно, а лівий вказівний та середній пальці працюють
IV та Ⅴ . (Відтепер я буду використовувати їх західноарабські цифри, тобто від
1 до 5. ) Символи вводяться як акорди. Наприклад, для введення літери "C", наприклад, оператор натискає значення 1 , 3 і 4клавіші одночасно, після чого обертається ручка кисті читає кожну клавішу послідовно і передає струм або, якщо клавіші не натиснуті, немає струму. Результатом цього є сучасне 5-бітове найменш значуще-бітове перше бінарне кодування, в якому наш приклад "C" кодується як 10110
.
5 біт ??
Ви можете подумати, що 5 біт, які можуть виразити не більше 32 унікальних символів, недостатньо навіть для всіх англійських букв та цифр, щоб не сказати нічого пунктуаційного. Однак Бодо мав хитрість до рукава: Його набір персонажів насправді є двома різними наборами: Letters and
Figures , і він визначив два спеціальні коди для перемикання між ними.
Зміна букви , яка переходить у режим Букви, активується одним натисканням клавіші 5 ( 00001
), а Фігура Зсув активовано
клавішею 4 ( 00010
).
Виклик
Ваше завдання полягає в тому, щоб написати програму чи функцію, яка розшифровує передачу коду Бодо.
Справжня передача розпочнеться з декількох бітів ініціалізації, плюс запуск та стоп біт до та після кожного символу, але ми збираємось пропустити їх і турбуємось лише про 5 унікальних бітів для кожного символу. Формати введення та виведення обговорюються нижче.
Код Бодо
Є дві різні версії коду Бодо: Континентальний та Великобританія. Ми будемо використовувати версію Великобританії, яка не містить символів типу "É" з рідної французької мови Бодо. Ми також не будемо залишати всі символи у Великобританії, які не належать до друку ASCII символів. Вам потрібно буде лише розшифрувати символи з наведеної нижче таблиці, всі вони - друковані символи ASCII, за винятком трьох останніх контрольних символів, пояснених під таблицею.
У стовпці "Ltr" відображаються символи в режимі букви, а "Fig" - символи режиму "Фігура":
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
це стирання . Телеграфні апарати Бодо надрукували для цього персонажа символ, що нагадує зірочку, щоб сказати читачеві, що попередній символ слід ігнорувати, але ми будемо ще приємніше читача і насправді опустімо (не друкуємо) попередній символ . Він діє однаково і в режимі Letter та Figure.FS
- Зміна фігури . Це перемикає набір символів з літер на цифри. Якщо декодер вже знаходиться в режимі малюнка, FS трактується як пробіл (ergoSP
у стовпці "Ltr"). Коли декодер перебуває у режимі малюнка, він залишається у режимі малюнка, доки не буде отримано символ LS.LS
- Зміна літер . Він перемикає набір символів з цифр на літери. Якщо декодер вже в режимі Letter, LS трактується як пробіл . У режимі Letter декодер залишається в режимі Letter до отримання символу FS.
Декодер завжди запускається в режимі Letter.
Ось приклад з "Зміна фігури", "Зміна літери" та пробіл:
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
(Letter Shift / Space) символ виступає як пробіл, оскільки декодер вже в режимі Letter. Наступний символ 00010
((Зміна фігури / пробіл) перемикає декодер на режим малюнка для друку 15
. Потім 00001
з'являється знову, але на цей раз він виконує функцію Letter Shift для повернення декодера в режим Letter.
Для вашої зручності ось символи у форматі, який, можливо, простіше засвоювати в редакторі, відсортованому за кодом:
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 квінтетів (для друку чи іншим способом), тобто 5–1 275 біт включно.
Вхід може містити лише біти передачі, за двома дозволеними винятками: Будь-яка кількість провідних або кінцевих 0
бітів та / або, для введення рядків, може бути додана одна передача нового рядка. Провідні або кінцеві біти або символи не можна додавати до або після кожного квінтету, тобто ви не можете додавати кожен квінтет до 8 біт (або приймати кожен квінтет як одне число в масиві - якщо ваша мова не має 5-бітний цілий чисельний тип) або окремо квінтети з будь-якими додатковими бітами, наприклад "01111\n11100"
.
Примітки та крайові футляри
Передача міститиме лише символи у стовпцях "Ltr" та "Fig" у таблиці вище. Ви ніколи не отримаєте, наприклад,
01110
у режимі "Фігура", оскільки він відсутній у стовпці "Fig".Передбачається, що декодер завжди буде в режимі Letter на початку передачі. Однак перший символ може бути символом FS, щоб негайно перейти в режим малюнка.
Коли декодер перебуває в режимі Letter, він може приймати символ LS, а коли він перебуває у режимі Рисунок, він може приймати символ FS. У будь-якому випадку повинен бути надрукований символ пробілу (див. Вихідний результат).
Символ ER ніколи не буде першим символом в передачі, і він не буде негайно слідувати за LS, FS або іншим ER.
Символ FS може негайно слідувати за символом LS і навпаки.
Ні символ LS, ні FS не будуть останнім символом у будь-якій передачі.
/
І-
символи можуть бути отримані в будь-якому режимі Letter (кодів11000
і10001
, відповідно) або в режимі (рис10111
і00111
).
Вихідні дані
Вихід може бути у будь-якому розумному форматі, найбільш розумним є ASCII (або UTF-8, для якого всі представлені символи такі ж, як ASCII). Будь ласка, вкажіть у своїй відповіді, чи є ваш вихід у іншому кодуванні чи форматі.
Примітки
- Символ пробілу (див. Вище 3) повинен бути простором ASCII (0x20) або еквівалентом кодування, тобто тим, що ви отримуєте, натискаючи пробіл.
Перемога
Це код-гольф . Виграє найкоротший код у байтах.
Обмеження
Стандартні лазівки заборонені.
Дозволені пробіли та / або один останній новий рядок. Провідні пробіли або інші символи (які не є частиною передачі) заборонені.
Ви не можете використовувати будь-які вбудовані або бібліотечні функції, які декодують Код Бодо (або будь-якого з його нащадків, наприклад, Код Мюррея, 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
.