Код 39 , разработанный в 1974 году, является одной из наиболее часто используемых символик или типов штрих-кодов, хотя именно система UPC / EAN чаще всего встречается в розничных продажах. Штрих-коды Code 39 могут кодировать заглавные буквы, цифры и некоторые символы, и их легко распечатать из компьютерного программного обеспечения специальным шрифтом. Это привело к их широкому коммерческому и промышленному использованию (например, идентификационные значки компаний, отслеживание активов, автоматизация производства).
Создать самую короткую программу или функцию для считывания штрих-кода Code 39 в любой ориентации с изображения в оттенках серого 512x512 пикселей; штрих-код может быть не выровнен по горизонтали или вертикали.
- Ваша программа должна принимать стандартный формат файла изображения и выводить данные, закодированные в штрих-коде, в качестве стандартного выходного или возвращаемого значения (не включая символы запуска / остановки).
- Ни одно изображение не содержит более одного действующего штрих-кода Code 39, и ни один штрих-код не кодирует пробел (ASCII 32).
- Если на изображении нет действительного штрих-кода Code 39, программа должна вывести один знак вопроса (
?
).
Я подготовил эталонную реализацию JavaScript и тестовый набор изображений в формате PNG, как с допустимыми штрих-кодами, так и без. Эталонная реализация, которая не проходит только 3 из 46 тестовых случаев в большинстве современных веб-браузеров, предназначена для демонстрации одного возможного алгоритма декодирования, а не для строгого соответствия приведенной выше спецификации.
Действительная отправка проходит не менее 80% этих тестов (37/46) и занимает не более одной минуты для каждого изображения на достаточно быстром ЦП (например, четырехъядерный процессор с частотой 2,6 ГГц). Моя эталонная реализация проходит 93% тестов и обрабатывает каждое изображение в течение 10 секунд (на моем настольном компьютере с Google Chrome).
(Этот вопрос был предложен на Мете 28 мая 2011 года.)
Ответы:
Питон, 899 символов
Этот код принимает изображение формата pnm в качестве входных данных, поэтому я обычно запускаю его так:
Сам код просто выбирает множество случайных строк развертки и пытается сопоставить черно-белые прогоны на этой линии сканирования с шаблонами code39. Он рандомизирован, поэтому при определенных обстоятельствах может не найти штрих-коды. (Я получаю около 20% ложных отрицательных отказов на тестовых изображениях.) Если он терпит неудачу, его запуск занимает около минуты, а когда он успешен, он часто делает это намного быстрее. Я никогда не видел ложного позитива.
источник
M=dict(zip('UK.-RQA+HGYXON*TEDJ1/87$%540WVML SCBIZPF3296',[385,259,...]))