Задний план
В 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
.Ответы:
Pyth,
98979593908380 байтКод содержит непечатаемые символы, так что вот обратимый
xxd
hexdump:Попробуйте онлайн. Тестирование.
Довольно долго, но справочная таблица занимает
большуючасть пространства.Для 117 байтов то же самое без непечатаемых (хотя требуется ISO-8859-1):
Или, для 93 байтов, без сжатия в таблице поиска:
источник
JavaScript (ES6),
160158153 байтаисточник
Пакет,
306304 байтаПринимает участие в STDIN. Поскольку Batch не имеет двоичного преобразования, я должен подделать его, используя восьмеричное и шестнадцатеричное преобразование.
0
). Возможные значения00
,01
,10
и11
. Последние два имеют значение8
и ,9
но я хочу ,2
или3
так я взять остаток по модулю6
.14
либо252
умноженные на их желаемое значение, чтобы я взял остаток по модулю14
(252=14*18
).c
это закодированная строкаr
пока результатd
это массив декодированияs
является индексом (с учетом состояния сдвига) символа, который переключает состояние сдвигаn
это двоичное декодирование плюс бит 5s
, который либо равен состоянию сдвига, в этом случае состояние сдвига переключается, либо индексирует в массив декодирования, чтобы найти следующий символ (или! для удаления)источник
PHP, 206 байт
источник
Чип , 1069 байт
Это большое дело, но писать было довольно весело.
Принимает ввод в виде строки
"1"
's и"0"
'. (Хотя это действительно только смотрит на младший бит.)Попробуйте онлайн!
Примечание: Erasure использует символ возврата ASCII (
\x08
), что означает, что они будут выглядеть забавно в TIO, но они хорошо выглядят, скажем, в xterm.Базовая структура
Вверху, над
=
линией, находится входной декодер. Превращает вход в один из 32 отдельных сигналов. Они отправляются отo
выше=
к тем ниже.Треугольные горы
L
's' иR
's' просто вращают шаблон из отдельных строк в столбцы. Сетка ниже, которая переводит каждый столбец в его выходной символ. Для неизвестных сигналов выдается NUL (\x00
). Для специальных сдвигов вместо печати символа маленький шарик вправо меняет режим.Канатная дорога между двумя горами подавляет любую печать между каждым квинтетом, в противном случае это также попыталось бы декодировать все перекрывающиеся квинтеты. Попробуйте заменить
!
его пробелом, чтобы убедиться в этом. (Запуск в подробном режиме-v
также может быть интересным здесь.)Я не уверен, как сделать это меньше в данный момент; это уже довольно плотно для его размера.
источник
GNU sed, 334 + 1 = 335 байтов
+1 байт за
-r
флаг. Принимает участие в STDIN.Просматривая старые проблемы, я понял, что это будет довольно легко с sed, и хорошо для практики. Я не пытался выполнить какое-либо сжатие, поэтому таблица поиска составляет более половины кода.
Попробуйте онлайн!
объяснение
Код работает в два этапа: во-первых, он заменяет каждый набор из 5 двоичных цифр соответствующими двумя символами (буква и цифра) из справочной таблицы. Таблица поиска имеет формат 𝟎𝟎𝟎𝟎𝟎𝐋𝐅𝟎𝟎𝟎𝟎𝟎𝐋𝐅… где 𝟎 - двоичная цифра, а 𝐋 и 𝐅 - соответствующая буква и цифра соответственно.
%
заменяет отсутствующие символы (это может быть любой символ, кроме новой строки).FS/SP
представленf<space>
иSP/LS
есть<space>l
.ER
представлен<<
.Затем он проходит по каждой паре с «курсором», соответствующим текущему
#
режиму - для буквенного режима,@
для режима фигуры.#
Курсор удаляет второй символ из пары , а затем переходит к следующей паре, и@
удаляет первый и достижения. Другими словами,#A1B8
становитсяA#B8
и тогдаAB#
, и@A1B8
становится1@B8
и тогда18@
. Когда#
курсор встречается,f<space>
он удаляет его и заменяет собой@
курсор, и наоборот, когда@
встречает<space>l
.Если пар не осталось, последний курсор удаляется вместе с любыми символами, за которыми следует
<
.источник