Цель
Азбука Морзе часто представляется как звук. Учитывая поток битов, которые представляют, включен ли звук или нет, переведите поток в буквы, цифры и пробелы.
конкретика
- Поток битов анализируется на основе длины повторяющихся битов ВКЛ / ВЫКЛ.
- 1 бит ON - это точка
- 3 ON биты - это тире
- 1 бит OFF ограничивает точки и тире
- 3 ВЫКЛ биты символов
- 7 ВЫКЛ битов отделяют слова (пробел)
- Входные данные могут быть строкой или массивом. На вход допускаются только два уникальных символа / значения по вашему выбору. (например, 0/1, истина / ложь, запятая / пробел)
- Вывод возвращает строку или выводится на стандартный вывод.
пример
Input: 101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
Analysis: \--H--/ E \---L---/ \---L---/ \----O----/\-- --/\---W---/ \----O----/ \--R--/ \---L---/ \--D--/
Output: HELLO WORLD
Предположения
- Поток всегда начинается и заканчивается битом ON.
- Нет пробелов в начале или в конце.
- Ввод всегда действителен.
- Все буквы (без учета регистра) и цифры поддерживаются.
Тестовые случаи
101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
HELLO WORLD
10100000001011100011101110000000101110000000101011101000101000101010001010101
I AM A FISH
1010111011101110001110111011101110111000101110111011101110001110111010101
2017
101010001110111011100010101
SOS
счет
Это код гольф. Наименьший код подсчета байтов к этому времени на следующей неделе побеждает.
Ответы:
APL (Дьялог) ,
65626057 байтов-3 благодаря нгн.
Функция молчаливого префикса.
Попробуйте онлайн! Заголовок,
f←
и Footer только , чтобы вызвать функцию от входа, сохраняя при этом количество байт Тио в. В обычном сеансе APL (в соответствии с полем ввода TIO) это не требуется .⎕CY'dfns'
с оп у в dfns рабочего пространства (библиотека)(
…)
Применить эту молчаливую функцию:'1+|(00)+'⎕S 1
PCRE S earch 1-серийный и четный-0-серийный и6|
остаток от деления длин совпадений при делении на 6⊃∘'/. -'¨
для каждой длины совпадения, выбрать соответствующий символ из этой строки'/|[-.]+'⎕S'&'∘
PCRE S косые черты и тире / точка -выбирает и возвращает этиmorse
переводы из азбуки Морзе в обычный текстисточник
Python 2 ,
142135 байтПопробуйте онлайн!
Объяснение:
Разбивает строку на буквы
000
(0
значит, пробел)Заменяет каждый
111
на3
и конвертирует в базу 16.Затем каждое число модифицируется
57
, что дает диапазон0..54
, который является индексом текущего символа.Предыдущая версия, которая преобразована в базу 3:
Python 2 ,
273252247 байтПопробуйте онлайн!
Предыдущая версия, которая преобразована в двоичный файл:
Python 2 ,
282261256 байтПопробуйте онлайн!
источник
Рубин , 123 байта
Попробуйте онлайн!
Разбить входную строку по пределу символов. Используйте 3 или 4 бита OFF, чтобы пробелы были преобразованы в пустые строки. Возьмите базовые 2 значения каждого символа и приведите их в разумный диапазон (менее 60 возможных значений), используя модуль по 3 последовательным делениям.
источник
0?
из Regexp, он все равно будет работать для четырех тестовых случаев.Python ,
175168 байтСначала преобразуйте строку в список строк 0 (тире) / 1 (точка), добавьте префикс
1
(для предотвращения начальных нулей и обработки пробелов), затем преобразуйте в двоичный файл.Поскольку каждый код имеет длину не более 5, результат варьируется от 0 до 63 и может быть указан в строке.
источник
lambda s:''.join("_ TEMNAIOGKDWRUS__QZYCXBJP_L_FVH09_8___7_______61_______2___3_45"[int('1'+filter(int,l).replace('2','0'),2)]for l in s.replace('111','2').split('000'))
filter
!Желе ,
6762 байтаПопробуйте онлайн!
источник
Visual Basic .NET (.NET Core) , 252 байта
-7 байт благодаря @recursive
Функция, которая принимает строку
1
s и0
s и возвращает строку. (На самом деле, жестким требованием является только0
forOFF
. Все, что неOFF
предполагаетсяON
).Строковый литерал - это код Морзе, настроенный как двоичная куча в виде массива. VB.NET позволяет индексировать строки как массивы символов.
\
Это целое деление, с левой суб кучи для1
или правой суб кучи для111
.Я использовал
!
как пробел, когда в этой куче нет значения. Нужно только правильно раскладывать индексы.VB.NET позволяет вам вернуться, присвоив значение имени функции (в данном случае,
A
). Я просто итеративно выполняю конкатенацию строк (&
) для создания выходной строки. В самый первый раз, когда мне нужно использовать,&
потому что использование+
оставляет нулевой начальный символ, но в любое другое время я могу использовать+
, который ведет себя так же, как&
для строк.Попробуйте онлайн!
источник
"!ETIANMSURWDKGOHVF!L!PJBXCYZQ!!5473!!8290!!!!!16"
, а затем индексировать с помощьюM(c-c\48*22)
, а затем вы можете сохранить еще 4, даже не используяM
, а просто используя строковый литерал, встроенный в строку.M(c-c\48*22)
, я получаю индекс вне границ для случая 2017 года. Я думаю, что VB будет делать деление и умножение с одинаковым приоритетом; я пропускаю скобки?c\48*22
будет либо0
или22
. Это способ условно вычесть 22 изc
, чтобы сделатьM
короче, «сложив» конец струны. Если это не сработает для вас, вы всегда можете удалить паренсыA &=(" ")
еще на 2 байта. :)&=
чтобы+=
и удалить еще два пробела.JavaScript (ES6),
170131 байтКак это работает:
Если вы измените точки на 0, а тире на 1 и префикс с 1, вы получите двоичные числа, которые при преобразовании в десятичные числа дают вам:
Их можно преобразовать в правильные буквы, указав в
' ETIANMSURWDKGOHVF L PJBXCYZQ'
.Если мы возьмем эти числовые модули 11, мы получим числа 0 - 8 и 10, которые можно преобразовать в правильные числа с помощью индексация в
'473168290 5'
.Программа разделяется на символы, а затем преобразует каждый символ в точки и тире, которые преобразуются в соответствующие выходные данные на основе вышеуказанных правил.
Тестовые случаи:
Показать фрагмент кода
источник
Python 2 , 127 байт
Попробуйте онлайн!
Построение решения TFeld путем удаления замены и работы с базой 10 ценой побитового xor и более длинной ссылочной строки.
источник
PHP,
321284 байтаСохранено 37 байтов благодаря @ovs
Предыдущая версия (321 байт)
Попробуйте онлайн!
Безголовая версия:
источник
Java (OpenJDK 8) , 370 байт
Попробуйте онлайн!
источник
GNU sed , 261 + 1 = 262 байта
+1 байт за
-r
флаг.Попробуйте онлайн!
объяснение
Это очень простое решение для таблицы поиска.
Первые три строки преобразуют входные данные, чтобы штрихи были
_
s, а точки -1
s. Во-первых,000
s заменяются на;
, поэтому символы отделяются;
и слова на;;0
. Затем111
s заменяются на,_
а все остальные0
s отбрасываются, оставляя1
s для точек.Следующая строка добавляет таблицу поиска. Он принимает форму,
cmcmcm...
гдеc
находится символ иm
представляет собой последовательность_
s и1
s, представляющих его.i
заменяется1
в таблице для устранения неоднозначности. Поскольку регулярные выражения в sed всегда жадные, таблица сортируется от самого длинного до самого короткого кода (например,1_
совпаденияA1_
вместоi1____
).Далее в цикле каждая последовательность
_
s и1
s (и последующие;
) заменяется соответствующим символом:Наконец, cleanup:
i
s заменяются на1
s, остальные;
s - это пробелы, а таблица поиска удаляется:источник
Желе , 67 байт
Попробуйте онлайн!
источник
JavaScript (ES6),
10410210199 байтКонтрольные примеры
Показать фрагмент кода
Как?
Поскольку преобразование из двоичных в десятичные байты стоит, мы используем хеш-функцию, которая работает непосредственно с двоичными блоками, интерпретируемыми в базе 10.
пример
источник
n*p%m0%m1
дляRetina ,
144138130103 байтПопробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:
Измените двоичные цифры на другие символы, потому что 0 и 1 являются допустимыми выходами.
Вставьте пробел перед каждым символом и два пробела между словами.
Предположим, что все символы являются Es.
Переведите все буквы, предполагая, что за ними будет следовать точка. Например, если у нас есть E, и мы видим вторую точку (мы использовали первую, когда мы вставили E), то она переводится в I. Для букв, за которыми юридически может следовать только тире, они переводятся с этим Предположение, а затем тире потребляется на следующем этапе. Остальные буквы удаляются (сохраняя
L
стоимость в байте).Если выяснится, что на самом деле за ними последовала тире, исправьте неправильные переводы. Это также потребляет тире, когда это предполагалось на предыдущем этапе. Оба перевода повторяются до тех пор, пока не будут использованы все точки и тире.
источник
Perl 5 , 241 + 1 (
-p
) = 242 байтаПопробуйте онлайн!
источник
PHP, 181 + 1 байт
Запустите как трубу с
-nR
или попробуйте онлайн .источник
ES6 , 268 байт
Использует ASCII-кодирование после сопоставления от представления 36 азбуки Морзе до позиции индекса. Не мой лучший день в гольф, но это заняло всего около 15 минут.
Легче читать (вроде):
источник
Wolfram Language (Mathematica) , 288 байтов
Мысль о чтении данных в двоичном виде из файла, но это трудно объяснить. База 36 казалась хорошим компромиссным способом эффективного хранения данных.
Принимает строку из 0 и 1 в качестве входных данных. Выполняет серию замен, начиная с серий 7 нулей, затем серий 3, затем самых длинных двоичных букв вплоть до самых коротких. Порядок замены важен.
Попробуйте онлайн!
источник
Perl 5 , 195 байт
Код 194 байта + 1 для
-p
.Я не мог заставить это работать только со стандартной упакованной двоичной строкой, я должен был избегать старших байтов, иначе я был бы на 171, если кто-нибудь знает, что я пропустил, или почему это ломается, это было бы здорово !
Попробуйте онлайн!
объяснение
Двоичная строка представляет собой
pack
редактор список номеров , которые имеют отношение к персонажам Морзе (101011101
-349
дляF
т.д.) , и это заархивировано с диапазонамиA..Z,0..9
и использовать в качестве поиска. Вs///
выражении заменить все пробеги семи0
секунд с пространством , а затем все пробеги цифр, разделенные тремя0
с или границами слова\b
, с их соответствующей клавишей из%h
хэша.источник