Штрих-коды 4 штатов
Многие почтовые службы (Royal Mail UK, Canada Post, US Mail и т. Д.) Используют штрих-код из 4 штатов для кодирования информации о своей почте. Визуализированный в ASCII, он может выглядеть примерно так:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Штрих-код с 4 состояниями - ряд строк. Каждый стержень может быть расширен вверх, вниз или оба, что позволяет 4 варианта. Это означает, что каждый столбец представляет собой основную цифру 4:
| | Бар: | | | | | | Цифра: 0 1 2 3
Проблема с этой символикой состоит в том, что каждый штрих-код является действительным, другим штрих-кодом вверх ногами: радикально меняя значение, если ориентация неверна. Следовательно, последовательность запуска и остановки обычно реализуется, чтобы сканер мог рассчитать, каким образом он должен быть прочитан.
Для этой задачи мы будем использовать последовательность запуска / остановки, указанную Австралийской почтой: каждый штрих-код начинается и заканчивается 1 0
последовательностью.
Соревнование
Ваша задача - написать программу или функцию, которая при наличии положительного целого числа N
преобразует его в штрих-код ASCII с 4 состояниями, где каждая полоса (кроме последовательностей начала / остановки) представляет цифру в представлении base-4 для N
.
Пример:
Учитывая целое число 19623
, мы бы сначала преобразовать его в представление базовых 4 10302213
.
Затем мы сопоставили бы каждую цифру с соответствующей полосой:
1 0 3 0 2 2 1 3 | | | | | | | | | | | | | | | |
Наконец, мы бы добавили последовательности start / stop:
Начать конец: 1 0 1 0 | | | | | | | | | | | | | | | | | | | | | |
Полученный штрих-код должен быть выходом программы.
Правила:
- Входные данные будут положительным целым числом в диапазоне стандартного целочисленного размера вашего языка.
- Выход:
- Может быть либо списком строк, либо строкой, содержащей новые строки.
- Может содержать начальные или конечные символы новой строки / пробелы, если форма остается неизменной.
- Должен отображать штрих-код в указанном выше формате - он должен использовать символ трубы (
|
) и символ пробела () при рисовании полос, и между каждой вертикальной полосой должен быть один пробел.
- Это код-гольф , поэтому выигрывает самая короткая (в байтах) программа!
Тестовые случаи
4095:
| | | | | | | | | | | | | | | | | | | | | | | |
4096:
| | | | | | | | | | | | | |
7313145:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
источник
Ответы:
Python 3 ,
1039996 байтПопробуйте онлайн!
источник
МАТЛ ,
34302928 байтПопробуйте онлайн!
объяснение
источник
Желе ,
1615 байтПопробуйте онлайн!
Как это работает
источник
.......
но каждая точка обозначает отдельный байт.Желе , 19 байт
Попробуйте онлайн!
-1 спасибо мистеру Xcoder .
источник
Октава ,
78 77 75 74 7069 байтПопробуйте онлайн!
В отличие от оригинального подхода, этот использует простую справочную таблицу для отображения значений base-4 в их двоичный эквивалент. Справочная таблица также добавляет интервал между каждой полосой, добавляя ноль между каждой цифрой (которая отображается на полосу всех пробелов).
Таблица соответствия напрямую отображается на столбцы как:
Преобразование из двоичного в
|
итеперь выполняется путем индексации в строку этих двух символов - в основном тот же принцип, что и в таблице поиска для двоичного преобразования.
* Сохранено 1 байт, спасибо @LuisMendo
Оригинал:
Попробуйте онлайн!
Анонимная функция, которая возвращает штрих-код в виде строки.
Это основано на том факте, что если мы добавим 4 к цифрам base4, то мы можем представить бар / пробел числом, преобразованным в двоичный файл с замененными битами 1 и 2:
Сложно с точки зрения игры в гольф добавить пространство между барами и конвертировать из
0/1
в'|'/' '
.источник
JavaScript (ES6),
898783 байтаКонтрольные примеры
Показать фрагмент кода
Как?
NB . В приведенной ниже версии литералы шаблонов были заменены стандартными строками, чтобы код мог быть правильно вставлен.
источник
R ,
154109 байтПопробуйте онлайн!
Сохранена целая куча байтов путем индексации и использования,
cat
а не построения матрицы и использованияwrite
, а также 6 из немного другого преобразования в основание 4. Печатает с начальным пробелом в каждой строке и без завершающих строк.Индексация происходит с использованием некоторой модульной арифметики, мало чем отличающейся от некоторых других ответов, но поскольку R использует индексирование на основе 1, арифметика несколько отличается.
Объяснение:
источник
Древесный уголь , 50 байтов
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Введите число.
Нажмите последовательность остановки в предварительно определенный пустой список.
Если число положительное,
повторно применять divmod для преобразования его в обратную базу 4,
в противном случае просто нажмите его.
Нажмите начальную последовательность к списку.
Карта на три строки. Каждая строка представляет перевод штрих-кода для цифр
0123
для каждой строки.Нанесите на карту цифры (перевернутые в обычном порядке), преобразуйте их в столбцы или пробелы, используя перевод, затем объедините результаты в три строки, которые затем неявно печатаются в отдельных строках.
источник
Japt ,
3231 байтПроверьте это онлайн!
Пока не очень доволен, но это только начало ...
объяснение
источник
Haskell ,
9190 байтПопробуйте онлайн! Возвращает список строк.
Тот же вариант подсчета байтов для первой строки:
источник
J ,
57 4947 байт10 байтов благодаря FrownyFrog!
Как это работает:
1 0,4&#.inv,1,0:
- преобразует число в список из 4 цифр, добавляет 1 0 к началу и концу списка((#:2 6 3 7){' |')
- таблица поиска для шифрования, двоичный 0 соответствует пробелу, 1 к '|'{~
- шифрует основную цифру 4, выбирая строку из таблицы поиска выше (аргумент обратный)|:
- транспонирует полученный массив из 3 столбцов в 3 строки[:
- закрывает вилку,.2{."0
- ставит пробелы между решеткамиПопробуйте онлайн!
источник
APL + WIN, 63 байта
Объяснение:
источник
Python 2 ,
116114 байт-2 байта благодаря notjagan
Попробуйте онлайн!
источник
05AB1E , 19 байтов
Попробуйте онлайн!
Это половина подхода Денниса, который всего на один байт короче, чем метод, который я использовал ранее (которым я вполне доволен):
05AB1E , 20 байтов
Попробуйте онлайн!
Как это работает?
Я спросил Аднана (создателя 05AB1E) о сетке в чате , и они помогли мне сэкономить 2 байта, указав на особенность 05AB1E: при соединении многомерных списков с помощью новых строк, внутренние списки также соединяются пробелами так
ðý
ненужно.источник
APL (Dyalog Classic) , 33 байта
Попробуйте онлайн!
источник
2⊥⍣¯1
как вы получите список двоичных файлов?2⊥⍣¯1
является ли обратный ("лицевой"?) "Двух декодирования". Он кодирует в двоичный файл с таким количеством битов, сколько необходимо.J ,
42 4039 байтПобрился на 2 байта благодаря Денису. 1 байт благодаря ngn.
Попробуйте онлайн!
Как это работает
источник
JavaScript (ES6) 79 байт
Использует .toString, чтобы преобразовать число в основание 4, а затем работает с каждой строкой и побитовым ИЛИ, чтобы построить выход за строкой. Выводит список строк.
источник
`10${n.toString(4)}10`
:)Bash + coreutils,
7167 байтПопробуйте онлайн!
объяснение
В
dc
разрядных обращенных к основанию 4, Предварение и добавления с4
(оборотов в10
на выходе) и используяn
, чтобы держать все в одной строке.Остальное происходит в
sed
:источник
x
используя пространство удержания / паттерна, чтобы модифицировать их, а затем делатьs
все сразу, и ничто не заканчивалось короче.Сетчатка , 83 байта
Попробуйте онлайн!Ссылка включает в себя более быстрые тесты. Объяснение:
Преобразовать в одинарный.
Преобразовать в базу 4 в виде одинарных чисел, разделенных
;
s.Подготовьте начальную последовательность.
Добавить
;
, превратив его в разделитель цифр, а не в разделитель, и последовательность остановки.Преобразование в десятичное число, но с добавлением 1 к каждой цифре.
Утроить его
В первом ряду
1
s и3
s (представляющие0
s и2
s) становятся пробелами.В последнем ряду
1
s и2
s (представляющие0
s и1
s) становятся пробелами.Все остальные цифры становятся барами.
источник
Пип ,
3331292726 байт25 байтов кода, +1 за
-S
флаг.Попробуйте онлайн!
объяснение
Мы наблюдаем закономерность в четырех типах баров:
Так:
источник
SOGL V0.12 , 28 байт
Попробуй здесь!
источник
C (gcc) , 176 байт
Попробуйте онлайн!
Чуть менее ужасно отформатирован (меньше в гольфе):
объяснение
Сначала рассмотрим следующий код для чтения целого числа и вывода версии base 4:
Это использует хвостовую рекурсию, чтобы изменить порядок вывода. Сдвиг битов каждого рекурсивного шага на 2 (обрезает последние 2 бита и делит на 4). Он выводит результат, замаскированный с помощью 3 (0b11), который показывает только последние два бита, которые являются последними цифрами основания 4.
Вызов функции включен в
printf
качестве завершающего аргумента (он не печатается, но оценивается), чтобы избежать необходимости использовать {} (+2 байта) для группировкиprintf
вызова функции и.Решение здесь расширяет этот код base-4. Во-первых, m определяется как n, но так, что в базе 4 к нему будет добавлено 10 добавленных и добавленных символов. Затем мы печатаем m.
В печатной базе 4 регулярно мы использовали битовую маску 3, чтобы получить цифру. В почтовом коде верхняя строка - это бит младшего разряда этой цифры (битовая маска 1), а нижняя строка - бит старшего разряда (битовая маска 2). Соответственно,
r
inf(n,r)
является битовой маской - наша основная функция вызываетf(m,1)
первую иf(m,2)
последнюю строки.Чтобы заставить работать среднюю строку (всегда печатать «|»), мы добавляем
||!r
к условию - если r равно 0, оно всегда будет иметь значение true и печатать «|». Затем мы призываемf(m,0)
к средней линии.Наконец, мы хотим, чтобы переводы строки вели себя правильно. Включение extra обходится
printf
дорого, поскольку байты исходного кода идут, поэтому вместо этого мы добавляем еще один спецификатор% c к существующемуprintf
.n?32:10
печатает новую строку, если n равно 0 (false), и пробел в противном случае. 32 и 10 используются вместо '\ n' и '' для сохранения байтов.источник
f(n,r){n&&f(n>>2);printf("%c%c",n?32:10,(n&r|!r)&&n?'|':32);}main(n){scanf("%d",&n);f(n=(n+(4<<(32-__builtin_clz(n)/2*2)))*16+4,1);f(n,0);f(n,2);}
Common Lisp, 191 байт
Попробуйте онлайн!
источник
PHP, 99 + 1 байт
требует PHP> = 5.5 для индексации литеральной строки и <7.1 для индексации, чтобы не выдавать предупреждение.
Запустите как трубу с
-nR
или попробуйте онлайн .Вставьте еще одну новую строку, чтобы получить последний.
источник
Python 2,
142126 байтБольшое спасибо ovs!
Я пытался не копировать методы других ответов и ... чёрт.
источник
C # (.NET Core) , 160 байт
Попробуйте онлайн!
Я уверен, что пропустил некоторые улучшения.
DeGolfed
t<51 & y != 1 & t-(y>>1) != 49
проверяет, что символ не '3', не вторая строка, а затем некоторая двоичная магия, чтобы увидеть, должен ли первый или третий ряд содержать пробел.источник
Zsh ,
156154151133 байтаПопробуйте онлайн!
Принимает базовый-10 вход от вар
$x
источник
Japt , 42 байта
Попробуйте онлайн!
источник
Pyth , 32 байта
Попробуй это здесь!
источник
C, 120 байтов
К сожалению, работает только на Windows, так как
itoa
это слишком удобно для стандартного.источник