Задний план
В 1870 году Эмиль Бодо изобрел код Бодо , кодировку символов фиксированной длины для телеграфии. Он разработал код для ввода с ручной клавиатуры всего пятью клавишами; два оперированы левой рукой и три - правой:
Правый указательный, средний и безымянный пальцы управляют клавишами I , II и
III соответственно, а левый указательный и средний пальцы управляют
IV и Ⅴ . (Отныне я буду использовать их западно-арабские цифры, то есть от
1 до 5. ) Символы вводятся как аккорды. Например, для ввода буквы «С» оператор нажимает 1 , 3 и 4.одновременно с клавишами, после чего вращающийся рычаг щетки считывает каждую клавишу последовательно и передает ток или, если клавиши не нажаты, тока нет. В современных терминах результатом является двоичное кодирование с 5-разрядным наименее значимым разрядом-первым, в котором наш пример, "C", кодируется как 10110
.
5 бит
Вы можете подумать, что 5 битов, которые могут выражать не более 32 уникальных символов, недостаточно даже для всех английских букв и цифр, не говоря уже о пунктуации. Однако у Бодо была хитрость: его набор символов на самом деле состоит из двух разных наборов: букв и
цифр , и он определил два специальных кода для переключения между ними.
Сдвиг букв , который переключается в режим букв, активируется нажатием одной клавиши 5 ( 00001
), а смещение цифр активируется
клавишей 4 ( 00010
).
Вызов
Ваша задача - написать программу или функцию, которая декодирует передачи кода Бодо.
Реальная передача будет начинаться с некоторых битов инициализации, плюс биты начала и остановки до и после каждого символа, но мы собираемся пропустить их и беспокоиться только о 5 уникальных битах для каждого символа. Форматы ввода и вывода обсуждаются ниже.
Код Бодо
Существует две разные версии кода Baudot: Continental и UK. Мы собираемся использовать версию для Великобритании, которая не включает символы типа «É» из французского языка Baudot. Мы также собираемся исключить все символы в британской версии, которые не входят в число печатных символов ASCII. Вам нужно будет только декодировать символы в таблице ниже, все из которых являются печатными символами ASCII, за исключением последних трех управляющих символов, которые объяснены под таблицей.
В столбце «Ltr» отображаются символы в режиме «Letter», а в «Fig» - символы режима «Figure»:
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
это Erasure . Телеграфные машины Бодо будут печатать символ, похожий на звездочку, для этого символа, чтобы сказать читателю, что предыдущий символ следует игнорировать, но мы собираемся быть еще более приятным для читателя и фактически опустим (не печатаем) предыдущий символ . Он действует одинаково как в буквенном, так и в графическом режиме.FS
это сдвиг фигуры . Это переключает набор символов с букв на цифры. Если декодер уже находится в режиме ввода рисунков, FS рассматривается как пробел (следовательно,SP
в столбце «Ltr»). Когда декодер находится в режиме «Рисунок», он остается в режиме «Рисунок», пока не будет получен символ LS.LS
это письмо сдвига . Он переключает набор символов с цифр на буквы. Если декодер уже находится в режиме Letter, LS рассматривается как пробел . В режиме Letter декодер остается в режиме Letter до получения символа FS.
Декодер всегда запускается в режиме Letter.
Вот пример с Figure Shift, Letter Shift и Space:
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
(Figure Shift / Space) переключает декодер в режим Figure для печати 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
с и 1
с, строки "0"
и "1"
символов, один очень большое количество, и т.д., до тех пор , как он отображает непосредственно битам передачи.
Каждая передача будет иметь, по крайней мере, один печатный квинтет и не более 255 квинтетов (для печати или иным образом), т.е. 5–1275 бит включительно.
Входные данные могут содержать только биты передачи, с двумя допустимыми исключениями: любое количество начальных или конечных 0
битов и / или, для ввода строки, одна конечная новая строка может быть добавлена к передаче. Начальные или конечные биты или символы не могут быть добавлены до или после каждого квинтета, т. Е. Вы не можете дополнить каждый квинтет до 8 бит (или принять каждый квинтет как одно число в массиве - если у вашего языка нет 5-битного целочисленного типа) или отдельно квинтеты с любыми дополнительными битами, например "01111\n11100"
.
Примечания и крайние случаи
Передача будет содержать только символы в столбцах «Ltr» и «Fig» в таблице выше. Вы никогда не получите, например,
01110
в режиме рисунка, потому что он отсутствует в столбце «Рис».Предполагается, что декодер всегда будет в режиме Letter в начале передачи. Тем не менее, первый символ может быть символом FS для немедленного переключения в режим рисунка.
Когда декодер находится в режиме Letter, он может получить символ LS, а когда он находится в режиме Figure, он может получить символ 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
.