Почти каждый магазин в настоящее время использует штрих-коды универсального кода продукта (UPC), чтобы упростить процесс оформления заказа. Если имя ничего не значит для вас, вы наверняка узнаете, как они выглядят:
Формат
Наиболее распространенной системой является UPC-A, которая использует 12 цифр для обозначения каждого конкретного продукта. Каждая цифра закодирована в серию черно-белых полос, чтобы машины могли читать код длиной семь битов. Всего имеется 11 шаблонов, которые указывают начало, середину и конец штрих-кода. Это дает общую длину штрих-кода 12 × 7 + 11 = 95 бит. (Отныне, когда двоичный файл используется для обозначения цвета каждого бита, 0
он белый и 1
черный.)
Начало и конец имеют шаблон 101
. Затем цифры делятся на 2 группы по 6 и кодируются, как показано ниже, с шаблоном 01010
между левой и правой группами. В этой таблице перечислены шаблоны для каждого номера. Обратите внимание, что шаблон отличается в зависимости от того, находится ли цифра справа или слева (это позволяет сканировать штрих-код вверх ногами). Тем не менее, шаблон для правой стороны противоположен (поменять местами черный на белый и наоборот) от левого.
Если вы не видите изображение выше, это двоичный эквивалент каждого числа.
# Left Right
0 0001101 1110010
1 0011001 1100110
2 0010011 1101100
3 0111101 1000010
4 0100011 1011100
5 0110001 1001110
6 0101111 1010000
7 0111011 1000100
8 0110111 1001000
9 0001011 1110100
пример
Скажем, у вас есть СКП 022000 125033
. (Это не случайные числа. Оставьте комментарий, если вы выясните их значимость.) Вы начинаете с этого шаблона, который одинаков в каждом штрих-коде:
101xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx01010xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx101
Для цифр вы заменяете каждую на соответствующую кодировку для стороны (слева или справа), на которой она включена. Если вы все еще в замешательстве, см. Изображение ниже.
Вот вывод в двоичном виде с |
трубами, разделяющими части.
101|0001101|0010011|0010011|0001101|0001101|0001101|01010|1100110|1101100|1001110|1110010|1000010|1000010|101
Вызов
Напишите программу, которая выводит штрих-код UPC-A для пользовательского ввода. Размеры изображения должны составлять 95 × 30 пикселей, причем каждый «бит» имеет ширину в один пиксель и высоту 30 пикселей. Черные полосы rgb(0, 0, 0)
и белые полосы постоянно прозрачны или rgb(255, 255, 255)
.
Примечания
- Возьмите ввод из stdin или командной строки, или напишите функцию, которая принимает строку или целое число (обратите внимание, что ввод может иметь начальные нули, и большинство языков удаляют их или преобразуют число в восьмеричное).
- Выведите изображение одним из следующих способов:
- Сохраните его в файл с именем и форматом (PNG, PBM и т. Д.) По вашему выбору.
- Покажите это на экране.
- Вывести данные своего файла на стандартный вывод.
- Вы не можете использовать библиотеки или встроенные программы, которые генерируют штрих-коды ( я смотрю на вас, Mathematica ), хотя вы можете использовать библиотеки изображений или графики.
- Последняя цифра UPC обычно является контрольной цифрой , но для этих целей вам не нужно беспокоиться об этом.
Примеры
Вот еще несколько примеров для тестирования вашего кода. Двоичный вывод также приведен для удобства.
Входные данные: 012345678910
Выход:
10100011010011001001001101111010100011011000101010101000010001001001000111010011001101110010101
Входные данные: 777777222222
Выход:
10101110110111011011101101110110111011011101101010110110011011001101100110110011011001101100101
счет
Это код гольфа , поэтому самая короткая подача (в байтах выигрывает). Tiebreaker отправляется на самый ранний пост.
источник
["777777","222222"]
Ответы:
CJam,
5857 байтПечатает переносную битовую карту (ASCII) в STDOUT. Попробуйте онлайн.
Как это устроено
источник
Ред. 1 BBC BASIC, 155 символов, размер файла 132 байта
сэкономил несколько байтов, включив смещение 43 в
i
цикл. Чтобы избежать взлома,MOD2
нужно было добавить еще 47, всего 90.Это перемещает штрих-код дальше от источника, как показано, если это приемлемо:
Версия 0 BBC BASIC, 157 символов ascii, токенизированный размер файла 137 байт
Скачать переводчик можно по адресу http://www.bbcbasic.co.uk/bbcwin/bbcwin.html.
Режим экрана по умолчанию - черный текст на белом фоне. Это отличается от оригинального BBC BASC.
Безголовая версия с тестовой печатью
Расчет строки данных зависит
IF j<42
и должен быть выполнен в одной строке. В негольфированной версии это делается в три этапа. В версии для гольфа последние два шага объединены в одно огромное выражениеp=...
Мне пришлось изменить порядок битовых карт, потому что я использую
>>(j MOD 7)
для доступа к битам, что означает, что я сначала получаю доступ к младшему значащему биту. Как только это сделано, все левые растровые изображения удобно находятся в диапазоне ASCII.Типичный вывод, версия без присмотра, с тестовым выводом
источник
JavaScript ES6, 225 байт
Может быть, короче с функциями ES7, но я не уверен насчет их поддержки, поэтому я придерживаюсь ES6. Я также предполагаю ввод в виде массива. Вывод представляет собой файл PBN . Есть также много игры в гольф.
Если я что-то сделал не так, оставьте комментарий, и я обязательно исправлю
источник
Perl, 153 байта
Скопируйте в файл barcode.perl и запустите так:
затем введите номер штрих-кода.
Объяснение:
Битовые комбинации для цифр штрих-кода хранятся в строке и заменяются входными цифрами с помощью
y///
оператора транслитерации Perl . Каждое значение в строке подстановки имеет 48 (ASCII '0'), добавленных из него, чтобы избежать непечатаемых символов. Цифры во второй половине штрих-кода являются обратными цифрам в первой половине.Центральный шаблон установлен на 0000000 (шаблон, который в противном случае никогда не появится, кодируется как «A», а затем «0»), а затем заменяется 01010 вместо обработки его другой длины в качестве особого случая при использовании
sprint
.источник
Октава, 115 байт
Многострочная версия:
n
является ASCII-эквивалентом цифровых кодов с правой стороны (их было легче ввести, чем с левой стороны, поскольку все они были отображаемыми символами). После этого прямое десятичное преобразование в двоичное с некоторым раздражающим типом меняется с char на numeric.v
строит окончательную двоичную строку, а затем мы повторяем ее 30 раз и выводим на консоль.Пример выходных данных только для 2 из 30 строк, показанных для краткости:
Сжатый выход:
Первоначально я намеревался отобразить изображение, но отправка вывода на консоль сэкономила мне 9 байт. Вы можете отобразить результаты, используя
imshow
, но они отображаются1
белым и0
черным, поэтому вам нужно сначала инвертировать данные.источник
Кобра - 218
источник
Javascript ES6, 199 байт
источник
Python 2, 174 байта
Я знаю, это можно сыграть в гольф.
Строка
s
- это двоичная таблица в вопросе с левой половиной таблицы в качестве левой половины строки. Сначала значения И делятся на 63, если они находятся в правой половине (сначала удалите 1), а затем сдвигаются на 63 для печати в формате ASCII.BUG: в настоящее время пытаюсь исправить ошибку. Вывод первого примера отключен на одну цифру штрих-кода. Если вы поймете, дайте мне знать, пожалуйста.
источник