Существуют популярные алгоритмы контрольных цифр, такие как 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