Existem algoritmos populares de dígito de verificação, como Luhn, e outros bons , por exemplo, o algoritmo Damm. A única razão possível por trás da popularidade de algoritmos como o Luhn é que existem implementações de código deles. Isso significa que nós, como comunidade, temos o poder de mudar o mundo, fornecendo implementações eficientes de algoritmos melhores.
Portanto, esse desafio é mudar o mundo escrevendo uma função ou um programa completo no seu idioma de escolha que calcula um dígito de verificação usando o algoritmo Damm . A resposta com o menor número de caracteres (não bytes) será escolhida como vencedora em algumas semanas. Observe que todas as funções de ajuda e a declaração da tabela de operações devem ser incluídas na contagem de caracteres. Em caso de empate, a resposta mais popular será escolhida.
Esse algoritmo gira em torno de uma tabela de operações que deve ser um quase-grupo fracamente totalmente anti-simétrico da ordem 10. A tabela de operações que pode ser encontrada no artigo da Wikipedia sobre o algoritmo Damm é a que deve ser usada neste desafio. Para completar, vou reproduzi-lo abaixo:
| 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
Em resumo (para detalhes, consulte o artigo da Wikipedia ) o algoritmo funciona da seguinte maneira:
- Você começa com uma lista de dígitos a serem processados e um dígito intermediário definido como 0.
- Para cada dígito da lista, você calcula um novo dígito intermediário usando o dígito como índice da coluna e o dígito intermediário anterior como o índice da linha.
- O dígito intermediário final é o dígito de verificação. Se você estiver validando um número que já possui um dígito de verificação adicionado, o dígito intermediário final será 0 se o número for válido.
Seu programa ou função deve aceitar uma sequência que possa conter caracteres exceto nulo, mas deve se preocupar apenas com os dígitos da sequência. Ele deve imprimir (se um programa) ou retornar (se uma função) a sequência original com o dígito de verificação calculado anexado. Se você optar por escrever um programa, o programa poderá aceitar a entrada como argumento ou como entrada padrão. Se a sequência de entrada estiver vazia ou não contiver nenhum dígito, você deverá retornar ou acrescentar um zero.
Alguns exemplos:
Input | Output
------------+-------------
42 | 427
427 | 4270
2 to 2 | 2 to 29
23 42 76- | 23 42 76-5
- | -0