Напишите функцию или программу, которая кодирует строку в код 39 штрих-код формата , где каждый символ кодируется в виде пяти столбцов, разделенных четырьмя пробелами. Либо два из столбцов и один из промежутков являются широкими, а другие узкими (коды 10 * 4), или три из промежутков являются широкими, и ни один из столбцов не является (4 кода). Это дает 44 различных кода, из которых один является зарезервированным кодом, который используется для обозначения начала и конца кодированной строки.
Соревнование
Входные данные представляют собой строку, содержащую только символы из набора
1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ-. +/$%
Выход - строка, закодированная как строка штрих-кода. Узкий зазор и межсимвольные промежутки представляют собой единое пространство, а широкий промежуток - три пробела. Узкая полоса - это последовательность байтов UTF-8 для символа Unicode «Полный блок», █, т. Е. 0xE2 0x96 0x88
Широкая полоса - три таких последовательности байтов / символов ( ███
). Полный список кодов:
Spaces
0100 0010 0001 1000 1011 1101 1110 0111
Bars
00000 + / $ %
10001 1 A K U
01001 2 B L V
11000 3 C M W
00101 4 D N X
10100 5 E O Y
01100 6 F P Z
00011 7 G Q -
10010 8 H R .
01010 9 I S space 1=wide
00110 0 J T start/end 0=narrow
Полосы и пробелы чередуются, начиная с бара, поэтому, например, Q
bar 0 0 0 1 1
code █ █ █ ███ ███
space 0 0 0 1
После кодирования всех символов строка разделяется с обоих концов █ █ ███ ███ █
. Межсимвольный промежуток, один пробел, вставляется между каждой буквой. Ваше решение может выводить завершающие пробелы и завершающий перевод строки (в этом порядке).
Примеры
"" → "█ █ ███ ███ █ █ █ ███ ███ █"
"A" → "█ █ ███ ███ █ ███ █ █ █ ███ █ █ ███ ███ █"
"C++" → "█ █ ███ ███ █ ███ ███ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ███ ███ █"
"GOLF" → "█ █ ███ ███ █ █ █ █ ███ ███ ███ █ ███ █ █ █ ███ █ █ ███ █ ███ ███ █ █ █ █ ███ ███ █"
Разрешены стандартные форматы ввода / вывода, а стандартные лазейки запрещены. Это код-гольф , поэтому выигрывает самый короткий код в байтах!
#
символа, поскольку, например,"#"
это не единственная причина, по которой он может использоваться в языке.Ответы:
JavaScript (ES6),
225212 байтСохранено 4 байта благодаря @ l4m2
Попробуйте онлайн!
Как?
Таблицу можно переставить так, чтобы 9-разрядная двоичная маска символа быстро выводилась из его строки и столбца по следующей формуле:
с:
источник
s=>`#${s}#`.replace(/./g,c=>'0202020202'.replace(/./g,(j,k)=>[C='#',C+C+C,' ',' '][(i="%+/$U1AKV2BLW3CMX4DNY5EOZ6FP-7GQ.8HR 9IS#0JT".indexOf(c),[,257,260,5,272,17,20,320,65,68,80][i>>2]|(2<<i%4*2^(i<4)*170))>>k&1|j]))
(221)Красный ,
452445 байтПопробуйте онлайн!
Я попытаюсь играть в гольф дальше, но я не ожидаю многого от этого наивного решения.
источник
Java 10, 455 байт
Попробуйте онлайн.
Объяснение:
источник
C (gcc) ,
311, 303 байтаПопробуйте онлайн!
-8 благодаря потолку
Использует стратегию кодирования из ответа Арно. TIO Link включает в себя
-w
переключатель и шаблон для удаления предупреждений, они не нужны и, следовательно, не включены в счет.Помимо схемы кодирования, описанной Арно, еще одна хитрость заключается в том, чтобы поддерживать
w
переменную как переключающуюся между 2 и 0 (w=2*!w
). Это позволяет мне выбирать между первой и второй строкамиb
. Первый - это пробел, второй - закрашенный прямоугольник.источник
C (gcc) ,
241 239 227 213207 байтПопробуйте онлайн!
Основано на реализации @ LambdaBeta .
Немного меньше в гольф:
источник
Древесный уголь , 90 байт
Попробуйте онлайн! Примечание: конечный пробел. Ссылка на подробную версию кода. Объяснение:
Оберните входную строку в
*
s, а затем дважды сопоставьте ее, в результате чего результат объединяется с пробелами. Для второй карты существует дополнительная карта в неявном диапазоне0..4
, где две подстроки объединяются, и эти результаты затем объединяются с предопределенной пустой строковой константой.Для первой внутренней карты создайте строку, сформированную путем взятия увеличенных цифр, прописного алфавита и символов
-. *+/$%
, и найдите положение сопоставленного входного символа. Например,C++
будет отображаться в[12, 40, 40]
.Первая подстрока представляет пробелы перед столбцами. Перед первым столбцом ничего нет, но остальные столбцы зависят от положения сопоставленного входного символа: если он больше 39, то только одно место имеет один пробел, а если ему меньше 40, то только одно место имеет три пробелы, и позиция также преобразуется в столбец путем деления его на 10. Если столбец и индекс цикла отличаются на 2 (по модулю 4), то это нечетное место.
Вторая подстрока представляет столбцы. Если позиция больше 39, то всегда есть один столбец, в противном случае позиция ищется в массиве битов, сопоставленных с символами. Например, если позиция равна 12, то она циклически индексируется для символа
'
, который находится100111
в двоичном формате, указывая широкие полосы в столбцах 1 и 2. (Ведущий1
игнорируется, он просто обеспечивает постоянный счетчик битов.)источник
Perl 5 , 244 байта
Попробуйте онлайн!
Содержит много непечатаемых и старших байтов, ссылка TIO обеспечивает
xxd
представление. Я надеялся, что это закончилось бы меньше, и я мог бы все еще быть в состоянии упаковать данные более эффективным способом, таким образом я посмотрю, как я иду. Это создает все перестановки" "," ","█","███"
и затем отображает признаки списка в соответствующие символы.источник
Haskell ,
275270 байтПопробуйте онлайн!
Оператор,
x!n
который вычисляет x-базовые цифры n, используется дважды для распаковки кодов. Коды сначала сжимаются в виде двоичных строк с широким = 1 и узким = 0 без учета цвета, напримерR↔10000110↔262
. Эти числа затем сортируются и дифференцируются, чтобы получить числа в диапазоне [3,66], которые сжимаются с помощью обратного алгоритма двоичных чисел в виде0x117CDBC49F9EEEF11C3A659CACB31236
. Это содержит только половину кодов, остальные обратные.Ungolfed:
источник