EAN-8 штрих - кода включает в себя 7 цифр информации и 8 - й контрольной цифрой.
Контрольная сумма рассчитывается путем поочередного умножения цифр на 3 и 1, сложения результатов и вычитания из следующего кратного 10.
Например, учитывая цифры 2103498
:
Digit: 2 1 0 3 4 9 8
Multiplier: 3 1 3 1 3 1 3
Result: 6 1 0 3 12 9 24
Сумма этих итоговых цифр равна 55 , поэтому контрольная сумма равна 60 - 55 = 5.
Соревнование
Ваша задача состоит в том, чтобы при наличии 8-значного штрих-кода проверить, является ли он действительным, - вернуть истинное значение, если контрольная сумма действительна, и неверно в противном случае.
- Вы можете принять участие в любой из следующих форм:
- Строка длиной 8 символов, представляющая цифры штрих-кода
- Список из 8 целых чисел, цифры штрих-кода
- Неотрицательное целое число (вы можете принять начальные нули там, где их нет, т.е.
1
=00000001
, или запросить ввод с данными нулями)
- Встроенные функции, которые вычисляют контрольную сумму EAN-8 (то есть принимают первые 7 цифр и вычисляют последние), запрещены.
- Это код-гольф , поэтому выигрывает самая короткая (в байтах) программа!
Тестовые случаи
20378240 -> True
33765129 -> True
77234575 -> True
00000000 -> True
21034984 -> False
69165430 -> False
11965421 -> False
12345678 -> False
Ответы:
Желе , 7 байт
Попробуйте онлайн!
Как это работает
источник
JavaScript (ES6),
414038 байтСохранено 2 байта благодаря @ETHProductions и 1 байт благодаря @Craig Ayre.
Вводит в виде списка цифр.
Определяет сумму всех цифр, включая контрольную сумму.
Если сумма кратна 10, то это действительный штрих-код.
Тестовые случаи
Показать фрагмент кода
источник
g=([n,...s],i=3,t=0)=>n?g(s,4-i,t+n*i):t%10<1
map
, что, я думаю, работает лучше, поскольку input может быть списком цифр вместо строки.s=>s.map(e=>t+=e*(i=4-i),t=i=1)&&t%10==1
?&&
с|
на выходе 1/0 , поскольку truthy / falsy разрешено?Python 2 ,
64483529 байтmypetlion сэкономил 19 байт
Попробуйте онлайн!
источник
lambda x:sum(x[::2]*3+x[1::2])%10<1
Для 35 байтов.lambda x:sum(x[::2]*2+x)%10<1
Для 29 байтов.Желе , 8 байт
Попробуйте набор тестов.
Желе , 9 байт
Попробуйте онлайн или попробуйте набор тестов.
Как это работает
Результат для первых 7 цифр штрих-кода и цифры контрольной суммы должен быть кратен 10, чтобы он был действительным. Таким образом, контрольная сумма действительна, если алгоритм, примененный ко всему списку, делится на 10 .
источник
JḂḤ‘×µS⁵ḍ
JḂaḤ+µS⁵ḍ
Pm2Ḥ+µS⁵ḍ
составляет 15 байт в UTF-8, если я не рассчитал это неправильно.MATL , 10 байт
Спасибо @Zgarb за указание на ошибку, теперь исправленную.
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Befunge-98 (PyFunge) ,
1614 байтСэкономили 2 байта, пропустив вторую часть, используя
j
вместо;
s, а также поменяв местами a~
и+
в первой части, чтобы избавиться от a+
во второй.Входные данные состоят из 8 цифр (с ведущими 0, если применимо) и больше ничего
Выводится через код выхода (откройте выпадающий список отладки на TIO), где 1 равно true, а 0 - false.
Попробуйте онлайн!
объяснение
Эта программа использует различные приемы.
Прежде всего, он принимает цифры по одной через их значения ASCII. Обычно для этого требуется вычитать 48 из каждого значения, когда мы читаем его из входных данных. Однако, если мы не изменим его, у нас останется 16 (3 + 1 + 3 + 1 + 3 + 1 + 3 + 1) дополнительных копий из 48 в нашей сумме, что означает, что наша общая сумма будет на 768 больше, чем что это "должно" быть. Поскольку нас интересует только мод mod 10, мы можем просто добавить 2 к сумме позже. Таким образом, мы можем принимать необработанные значения ASCII, сохраняя 6 байтов или около того.
Во-вторых, этот код только проверяет, является ли каждый другой символ EOF, потому что входные данные гарантированно будут иметь длину всего 8 символов.
В-третьих,#
в конце строки первый символ не пропускается, но пропускается,;
если идет в другом направлении. Это лучше, чем поставить#;
на передний план вместо.Поскольку вторая часть нашей программы запускается только один раз, нам не нужно настраивать ее так, чтобы она пропускала первую половину при запуске в обратном направлении. Это позволяет нам использовать команду прыжка, чтобы перепрыгнуть через вторую половину, когда мы выходим перед тем, как выполнить ее, возвращаясь назад.
Шаг за шагом
Примечание: «Нечетные» и «Четные» символы основаны на 0-индексированной системе. Первый символ четный, с индексом 0.
источник
C
7877 байтовПопробуйте онлайн!
C (gcc), 72 байта
Попробуйте онлайн!
источник
Wolfram Language (Mathematica) ,
2621 байтПопробуйте онлайн!
Вводит в виде списка из 8 цифр.
Как это работает
2-9^Range@8
является конгруэнтным по модулю 10 к2-(-1)^Range@8
, то есть{3,1,3,1,3,1,3,1}
. Мы берем скалярное произведение этого списка с входными данными и проверяем, делится ли результат на 10.Wolfram Language (Mathematica) , 33 байта и неконкурентный
Попробуйте онлайн!
Принимает ввод в виде строки. Возвращает
1
действительные штрих-коды и0
недействительные.Как это работает
Лучшее, что я мог найти на пути встроенного (так как Mathematica это все о них).
Внутренний бит,
#~BarcodeImage~"EAN8";1
генерирует изображение штрих-кода EAN8, затем полностью его игнорирует и оценивает в 1. Однако, если штрих-код недействителен,BarcodeImage
генерируется предупреждение, котороеCheck
перехватывает, возвращая в этом случае 0.источник
BarcodeImage
, что генерирует изображение штрих-кода и проверяет штрих-код в процессе. ТакCheck[#~BarcodeImage~"EAN8";0,1]<1&
будет работать (но это дольше).Java 8,
585655 байт-2 байта косвенно благодаря @RickHitchcock , используя
(m=4-m)*i
вместоm++%2*2*i+i
того, чтобы видеть его в своем ответе JavaScript .-1 байт косвенно благодаря @ETHProductions (и @RickHitchcock ), используя
(m^=2)*i
вместо(m=4-m)*i
.Объяснение:
Попробуй это здесь.
источник
m=4-m
наm^=2
.^=1
довольно часто в ответах, когда я хочу изменить между0
и1
.^=2
работает в этом случае, чтобы изменить между1
и3
. Хороший трюк, и спасибо за комментарий, чтобы упомянуть об этом. :)05AB1E , 14 байтов
Попробуйте онлайн!
Требуется ведущий
0
s, принимает список цифр.источник
3100004
(должно быть правдой).0
там.0
. Этот ответ на самом деле использует числовые функции для строк, одну из особенностей 05AB1E.Pyth , 8 байт
Проверьте все контрольные примеры!
Pyth , 13 байт
Если мы можем предположить, что ввод всегда имеет ровно 8 цифр:
Проверьте все контрольные примеры!
Как это работает?
Если сумма первых 7 цифр после применения алгоритма вычитается из 10, а затем сравнивается с последней цифрой, это эквивалентно проверке, является ли сумма всех цифр после применения алгоритма кратной 10 .
источник
3100004
(должно быть правдой).3*3+1*1+0*3+...
или0*3+3*1+1*0..
? Я думал, что мы должны сделать первоеHaskell ,
4038 байтПопробуйте онлайн!
Вводит в виде списка из 8 целых чисел. Практический пример использования бесконечных списков.
Изменить: Сохранено 2 байта благодаря GolfWolf
источник
cycle
сохранения 2 байтов .Сетчатка ,
2322 байта-1 байт благодаря Мартину Эндеру !
Попробуйте онлайн!
объяснение
Пример ввода:
20378240
Замените каждую пару цифр первой цифрой, повторенной дважды, а затем самой парой. Мы получаем
2220333788824440
Конвертировать каждую цифру в одинарный. С скобками, добавленными для ясности, мы получаем
(11)(11)(11)()(111)(111)...
Подсчитайте количество совпадений пустой строки, которое на единицу больше, чем количество совпадений в строке. (За последние два шага мы в основном взяли сумму каждой цифры +1) Результат:
60
Совпадение
1
в конце строки. Мы поочередно умножили цифры на 3 и 1 и суммировали их, для правильного штрих-кода это должно делиться на 10 (последняя цифра 0); но мы также добавили 1 в последнем шаге, поэтому мы хотим , чтобы последняя цифра будет 1. Конечный результат:1
.источник
.
на стадии матча и матч1$
в конце.PowerShell , 85 байт
Попробуйте онлайн! или проверить все контрольные примеры
Реализует алгоритм как определено. Принимает ввод
$a
, вытаскивает каждую цифру с помощью"$a"[0..6]
и просматривает их с помощью|%{...}
. На каждой итерации мы берем цифру, приводим ее как строку,"$_"
затем приводим ее как целое число, а+
затем умножаем на 13
или1
(выбираем, увеличивая$i
по модулю2
).Эти результаты собраны воедино и суммированы
-join'+'|iex
. Мы берем этот мод результата10
, вычитаем его из10
и снова берем мод результата10
(этот второй мод необходим для учета00000000
тестового случая). Затем мы проверяем, соответствует ли это-eq
последней цифре. Этот логический результат остается в конвейере, а вывод неявным.источник
3100004
(должно быть правдой).Желе , 16 байт
Попробуйте онлайн!
принимает входные данные в виде списка цифр
источник
D
в нижний колонтитул. И да, спасибо! : DDµṪ=Ç
.3100004
(должно быть правдой).APL (Dyalog) , 14 байтов
Эквивалентно решению стритстера .
Полное тело программы. Запрашивает список номеров из STDIN.
Попробуйте онлайн!
Является…
0=
ноль равен10|
мод-10 из+/
сумма⎕×
время ввода8⍴3 1
восемь элементов циклически взяты из[3,1]
?
источник
05AB1E , 9 байтов
Попробуйте онлайн!
источник
31×S*OTÖ
для 8 байтов.×
просто толкает 31n
количество раз. Когда вы умножаете, он автоматически сбрасывает лишние 31.69165430 -> 1
J, 17 байт
-10 байт благодаря Коул
Попробуйте онлайн!
При этом используется умножение списков одинакового размера, чтобы избежать комбинирования zip / multiply исходного решения, а также «трюк base 1»
1#.
для сложения продуктов. Подход высокого уровня похож на оригинальное объяснение.оригинал, 27 байт
Попробуйте онлайн!
объяснил
источник
0=10|1#.(8$3 1)*]
должен работать на 17 байт (тоже делает тот же алгоритм). Я почти уверен, что в бета-версии у вас может быть крючок с правой стороны, оканчивающийся на правую сторону, поэтому0=10|1#.]*8$3 1
может работать на 15 (я бы проверил tio, но он, кажется, не работает?)1#.
трюк как 2 или 3 раза ... спасибо, что напомнил мне. О, кстати, 15-байтовая версия не работает в TIO.C (gcc),
8482726154 байта-21 байт из Нила
-7 байтов от Науэля Фуйе
Попробуйте онлайн!
Разработано независимо от ответа Steadybox
'f' - это функция, которая принимает штрих-код в качестве
int
и возвращает значения1
True и0
False.f
сохраняет последнюю цифруx
вs
(s=x%10
),Затем вычисляет сумму в
c
(for(i=c=0;x;x/=10)c+=(1+2*i++%4)*x;
)c
это сумма,i
это счетчикдля каждой цифры, включая первую, добавьте число
1+2*i%4
раз (x%10
) к контрольной сумме и приращениеi
(значениеi++
in3-2*i++%4
)1+2*i%4
1, когдаi
четное и 0, когдаi
нечетноеЗатем возвращает значение, кратное десяти, и, поскольку мы добавили последнюю цифру (умноженную на 1), сумма будет кратна десяти, если штрих-код действителен. (использует GCC-зависимое неопределенное поведение, чтобы пропустить
return
).источник
(x%10)
может быть так,x
как вы принимаетеc%10
позже. Также я думаю, что вы можете использовать,i<8
а затем просто проверить,c%10
является ли ноль в конце.s
ненужным:c;i;f(x){for(i=c=0;i<8;x/=10)c+=(1+2*i++%4)*x;return c%10<1;}
x=c%10<1
илиc=c%10<1
вместо этогоreturn c%10<1
все еще работаетi<8
может быть заменено наx
C, 63 байта
Предполагается, что
0
естьtrue
и любое другое значениеfalse
.+3 байта для лучшего возвращаемого значения
Добавьте
==0
кreturn
заявлению.Ungolfed
При этом используется альтернативное определение контрольных сумм EAN, где контрольная цифра выбрана так, что контрольная сумма всего штрих-кода, включая контрольную цифру, кратна 10. Математически это работает так же, но записать намного проще.
Инициализация переменных внутри цикла, как предлагает Steadybox, 63 байта
Удаление фигурных скобок в соответствии с предложением Steadybox, 61 байт
Использование,
<1
а не==0
для лучшего возвращаемого значения, как это было предложено Кевином КруйссеномДобавьте
<1
кreturn
оператору, это добавляет только 2 байта, а не добавление,==0
которое добавляет 3 байта.источник
{}
послеfor
. Кроме того, представления функции должны быть многократно используемыми , поэтому вам нужно инициализироватьs
внутри функции (просто изменитеi;s=0;
наi,s;
иi=0;
наi=s=0;
).for
, тело цикла будет следующим оператором.for(i=0;i<8;i++){s+=v[i]*3+v[++i];}
так же, какfor(i=0;i<8;i++)s+=v[i]*3+v[++i];
.==0
можете использовать +2<1
вместо. :)JavaScript (Node.js) , 47 байт
Хотя здесь уже есть гораздо более короткий ответ, это моя первая попытка игры в гольф на JavaScript, поэтому я хотел бы услышать рекомендации по игре в гольф :-)
тестирование
Показать фрагмент кода
Кроме того, вы можете попробовать это онлайн!
источник
Perl 5,
3732 + 1 (-p) байт-5 байт благодаря Дому Гастингсу. 37 +1 байт было
попробуйте это онлайн
источник
--$|
переключается между ними,1
и0
поэтому вы можете использовать его вместо++$i%2
чередующегося логического значения! Кроме того, все, что имеет значение, это то, что total ($s
) соответствует/0$/
, удалось получить 33 байта, объединяя эти изменения сs///
: Попробуйте онлайн! (-l
только для наглядности)s/./(something with $&)/ge
и чтобы/0$/
соответствовать, но не два вместе взятых.Brainfuck, 228 байт
Вероятно, может быть улучшено немного. Ввод принимается по 1 цифре за раз, вывод 1 для истины, 0 для ложной.
Как это работает:
Поставьте 8 в положение 3.
Принимает ввод 8 раз, меняя его с значения ascii на фактическое значение +2 каждый раз. Входы разнесены теми, которые будут удалены, чтобы позже было легче умножить.
Вычтите одно из каждого элемента. Наша лента теперь выглядит примерно так
С каждым значением на 1 больше, чем должно быть. Это потому, что нули испортят наш процесс умножения.
Теперь мы готовы начать умножение.
Перейти ко второму последнему пункту.
При нулевом значении умножьте элемент на три, затем переместите два элемента влево. Теперь мы умножили все, что нам нужно, на три, и мы находимся на самой первой позиции на ленте.
Суммируйте весь список.
Значение у нас на 16 больше, чем фактическое значение. Исправьте это, вычитая 16.
Нам нужно проверить, является ли сумма кратной 10. Максимальная сумма равна всем 9, то есть 144. Поскольку никакая сумма не будет больше 10 * 15, поместите 15 и 10 на ленту в этом порядке и вправе право на сумму.
Двигайтесь туда, где 15. Пока он не равен нулю, проверьте, не равна ли сумма нулю. Если это так, вычтите 10 из него. Теперь мы находимся либо в (пустой) сумме, либо в (также пустой) десяти позиции. Двигайся вправо. Если бы мы находились в суммирующей позиции, мы теперь в ненулевой 15 позиции. Если это так, двигайтесь вправо дважды. Теперь мы находимся в одинаковом положении в обоих случаях. Добавьте десять к десяти позициям и вычтите одно из 15.
Остальное для вывода:
Перейти к сумме позиции. Если он ненулевой (отрицательный), штрих-код недействителен; установите положение -1. Теперь добавьте 49, чтобы получить правильное значение ascii: 1, если оно действительно, 0, если оно недействительно.
источник
Java 8, 53 байта
Golfed:
Прямой расчет в лямбде оказывается кратчайшим решением. Он помещается в одном выражении, сводя к минимуму издержки лямбды и удаляя лишние объявления переменных и точки с запятой.
Выход:
источник
QBasic,
5452 байтаТьфу, скучный ответ оказался самым коротким:
Это вводит цифры через запятую. Мое оригинальное 54-байтовое решение, которое вводит одну цифру за раз, использует более приятный подход:
источник
C # (.NET Core) ,
6562 байтаПопробуйте онлайн!
Подтверждения
-3 байта благодаря @KevinCruijssen и изящному трюку с использованием оператора exclusive или.
DeGolfed
C # (.NET Core) , 53 байта
Попробуйте онлайн!
Прямой порт ответа @ Snowman .
источник
b=>{int s=0,i=0,t=1;while(i<8)s+=b[i++]*(t^=2);return s%10<1;}
( 62 байта ) или, альтернативно, с foreach, также 62 байта:b=>{int s=0,t=1;foreach(int i in b)s+=i*(t^=2);return s%10<1;}
(это порт моего ответа Java 8 ).MATLAB / Octave , 32 байта
Попробуйте онлайн!
Я собираюсь опубликовать это несмотря на другой ответ Octave, так как я разработал этот код и подход, не глядя на другие ответы.
Здесь у нас есть анонимная функция, которая принимает входные данные в виде массива из 8 значений и возвращает true, если допустимый штрих-код, в противном случае - false.
Результат рассчитывается следующим образом.
источник
Excel, 37 байт
Интерпретация «списка из 8 целых чисел» как допускающего 8 отдельных ячеек в Excel:
источник
()
в вашем комментарии.=(A1:H1)
: это не обрабатывается как массив. Недопустимо, если помещено в любой столбец внеA-H
диапазона. Если помещено в столбец в AH, возвращает значение только для этого столбца. (Формула в% приводит к%: C2 -> C1 H999 -> H1 K1 -> # ЗНАЧЕНИЕ!)Рубин, 41 байт
Принимает массив целых чисел. -6 байт благодаря Джордану.
источник
map
:zip
занимает блок. Вы можете сохранить еще пару байтов, используя$.
вместо инициализацииs
:->n{n.zip([3,1]*4){|x,y|$.+=x*y};$.%10<1}
TI-Basic (серия 83), 18 байт
Принимает ввод в виде списка в
Ans
. Возвращает1
действительные штрих-коды и0
недействительные.Порт моего ответа Mathematica . Включает скриншот вместо среды онлайн-тестирования:
Заметная особенность:
binomcdf(7,0
используется для генерации списка{1,1,1,1,1,1,1,1}
(списка вероятностей того, что из 7 испытаний с вероятностью успеха 0 будет не более N успехов, для N = 0,1, ..., 7). ЗатемcumSum(
превращает это в{1,2,3,4,5,6,7,8}
.Это на один байт короче, чем при использовании
seq(
команды, хотя исторически сложилось так, что она также значительно быстрее.источник