Existen algoritmos de verificación de dígitos populares como Luhn y luego hay otros buenos , por ejemplo, el algoritmo Damm. La única razón posible detrás de la popularidad de algoritmos como Luhn es que existen implementaciones de código de golf de ellos. Esto significa que nosotros como comunidad tenemos el poder de cambiar el mundo al proporcionar implementaciones de mejores algoritmos.
Entonces, este desafío es cambiar el mundo escribiendo una función o un programa completo en el idioma de su elección que calcule un dígito de verificación utilizando el algoritmo Damm . La respuesta con el menor número de caracteres (no bytes) será elegida como ganadora en unas pocas semanas. Tenga en cuenta que todas las funciones de ayuda y la declaración de la tabla de operaciones deben incluirse en el recuento de caracteres. En caso de empate se elegirá la respuesta más popular.
Este algoritmo gira en torno a una tabla de operaciones que debe ser un cuasigrupo de orden débilmente totalmente antisimétrico 10. La tabla de operaciones que se puede encontrar en el artículo de Wikipedia sobre el algoritmo Damm es la que se utilizará en este desafío. Para completar, lo reproduciré a continuación:
| 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
En resumen (para más detalles ver el artículo de Wikipedia ) el algoritmo funciona de la siguiente manera:
- Comienza con una lista de dígitos para procesar y un dígito provisional que se establece en 0.
- Para cada dígito de la lista, calcula un nuevo dígito intermedio utilizando el dígito como índice de columna y el dígito intermedio anterior como índice de fila.
- El último dígito provisional es el dígito de verificación. Si está validando un número que ya tiene un dígito de verificación agregado, el dígito intermedio final es 0 si el número es válido.
Su programa o función debe aceptar una cadena que pueda contener cualquier carácter excepto nulo, pero solo debe ocuparse de los dígitos de la cadena. Debe imprimir (si es un programa) o devolver (si es una función) la cadena original con el dígito de verificación calculado agregado. Si elige escribir un programa, el programa puede aceptar la entrada como argumento o como entrada estándar. Si la cadena de entrada está vacía o no contiene ningún dígito, debe devolver o agregar un cero.
Algunos ejemplos:
Input | Output
------------+-------------
42 | 427
427 | 4270
2 to 2 | 2 to 29
23 42 76- | 23 42 76-5
- | -0
Respuestas:
Pyth, 49 caracteres
Contiene dios sabe qué caracteres, así que aquí hay un programa Python3 para generar el programa anterior con precisión en su máquina:
Explicación:
fuente
CJam, 54 caracteres
Hay un carácter no imprimible allí, por lo que es posible que desee utilizar el enlace permanente a continuación.
Pruébalo aquí.
Explicación
El dígito interino se está rastreando en
T
, que CJam inicializa a 0.fuente
Pitón 3,
149141caracteresEjemplos:
Gracias a @MegaTom y @Sieg por ayudar a eliminar un total de 11 caracteres.
fuente
Ruby, 149 caracteres
Probado en repl.it
fuente
J, 117 bytes
Contiene solo ascii imprimible. (Tuve dificultades con J y Unicode). Genera la tabla de transición a partir de los índices de permutación de las filas.
Uso:
Pruébelo en línea aquí.
fuente
Haskell, 131 personajes
Prueba de funcionamiento:
fuente
k, 36 caracteres
q, 40 caracteres (implementación equivalente a k)
fuente