Существуют популярные алгоритмы контрольных цифр, такие как Luhn, а также хорошие , например алгоритм Damm. Единственная возможная причина популярности таких алгоритмов, как Luhn, заключается в том, что существует их реализация в виде кода. Это означает, что мы, как сообщество, можем изменить мир, предлагая лучшие алгоритмы.
Таким образом, эта задача состоит в том, чтобы изменить мир, написав функцию или полную программу на выбранном вами языке, которая вычисляет контрольную цифру с использованием алгоритма Дамма . Ответ с наименьшим количеством символов (не байтов) будет выбран победителем через несколько недель. Обратите внимание, что все вспомогательные функции и объявление таблицы операций должны быть включены в число символов. В случае ничьей будет выбран самый популярный ответ.
Этот алгоритм вращается вокруг операционного стола, который должен быть слабо полностью антисимметричной квазигруппой порядка 10. Операционный стол, который можно найти в статье в Википедии об алгоритме Дамма, является тем, который должен использоваться в этой задаче. Для полноты картины я воспроизведу его ниже:
| 0 1 2 3 4 5 6 7 8 9
----+----------------------------------------
0 | 0 3 1 7 5 9 8 6 4 2
1 | 7 0 9 2 1 5 4 8 6 3
2 | 4 2 0 6 8 7 1 3 5 9
3 | 1 7 5 0 9 8 3 4 2 6
4 | 6 1 2 3 0 4 5 9 7 8
5 | 3 6 7 4 2 0 9 5 8 1
6 | 5 8 6 9 7 2 0 1 3 4
7 | 8 9 4 5 3 6 2 0 1 7
8 | 9 4 3 8 6 1 7 2 0 5
9 | 2 5 8 1 4 3 6 7 9 0
Вкратце (подробнее см. Статью в Википедии ) алгоритм работает следующим образом:
- Вы начинаете со списка цифр для обработки и промежуточной цифры, которая установлена в 0.
- Для каждой цифры в списке вы вычисляете новую промежуточную цифру, используя цифру в качестве индекса столбца и предыдущую промежуточную цифру в качестве индекса строки.
- Последняя промежуточная цифра - контрольная цифра. Если вы проверяете номер, который уже имеет добавленную контрольную цифру, последняя промежуточная цифра будет 0, если номер действителен.
Ваша программа или функция должна принимать строку, которая может содержать любые символы, кроме нуля, но она должна касаться только цифр в строке. Он должен либо напечатать (если программа), либо вернуть (если функция) исходную строку с добавленной вычисленной контрольной цифрой. Если вы решили написать программу, программа может принять ввод в качестве аргумента или в качестве стандартного ввода. Если входная строка пуста или не содержит цифр, вы должны вернуть или добавить ноль.
Несколько примеров:
Input | Output
------------+-------------
42 | 427
427 | 4270
2 to 2 | 2 to 29
23 42 76- | 23 42 76-5
- | -0
Ответы:
Pyth, 49 символов
Содержит бог знает, какие символы, поэтому вот программа на Python3 для точной генерации вышеуказанной программы на вашем компьютере:
Объяснение:
источник
CJam, 54 символа
Там есть один непечатаемый символ, поэтому вы можете использовать постоянную ссылку ниже.
Проверьте это здесь.
объяснение
Отслеживается промежуточная цифра
T
, которую CJam инициализирует в 0.источник
Python 3,
149 141138 символовПримеры:
Спасибо @MegaTom и @Sieg за помощь в удалении в общей сложности 11 символов
источник
Рубин, 149 знаков
Проверено на repl.it
источник
J, 117 байт
Содержит только для печати ASCII. (Мне было тяжело с J и юникодом.) Создает таблицу переходов из индексов перестановки строк.
Использование:
Попробуйте это онлайн здесь.
источник
Хаскель, 131 персонаж
Тестовый забег:
источник
к, 36 символов
q, 40 символов (эквивалентно реализации k)
источник