Il existe des algorithmes de chiffres de contrôle populaires tels que Luhn, puis il y en a de bons , par exemple l'algorithme Damm. La seule raison possible de la popularité d'algorithmes tels que Luhn est qu'il existe des implémentations de code de golf. Cela signifie que nous, en tant que communauté, avons le pouvoir de changer le monde en fournissant des implémentations de meilleurs algorithmes.
Ce défi consiste donc à changer le monde en écrivant une fonction ou un programme complet dans la langue de votre choix qui calcule un chiffre de contrôle à l'aide de l' algorithme Damm . La réponse avec le plus petit nombre de caractères (pas d'octets) sera choisie comme gagnante dans quelques semaines. Notez que toutes les fonctions d'aide et la déclaration de la table d'opération doivent être incluses dans le nombre de caractères. En cas d'égalité, la réponse la plus populaire sera choisie.
Cet algorithme s'articule autour d'une table d'opération qui doit être un quasigroupe faiblement totalement anti-symétrique d'ordre 10. La table d'opération qui se trouve dans l'article Wikipédia sur l'algorithme Damm est celle qui doit être utilisée dans ce défi. Par souci d'exhaustivité, je vais le reproduire ci-dessous:
| 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 bref (pour plus de détails, voir l'article Wikipedia ), l'algorithme fonctionne comme suit:
- Vous commencez avec une liste de chiffres à traiter et un chiffre intermédiaire qui est défini sur 0.
- Pour chaque chiffre de la liste, vous calculez un nouveau chiffre intermédiaire en utilisant le chiffre comme index de colonne et le chiffre intermédiaire précédent comme index de ligne.
- Le dernier chiffre intermédiaire est le chiffre de contrôle. Si vous validez un numéro qui a déjà un chiffre de contrôle ajouté, le dernier chiffre intermédiaire est 0 si le numéro est valide.
Votre programme ou fonction doit accepter une chaîne qui peut contenir tous les caractères sauf null, mais elle ne doit concerner que les chiffres de la chaîne. Il doit soit imprimer (s'il s'agit d'un programme), soit renvoyer (s'il s'agit d'une fonction) la chaîne d'origine avec le chiffre de contrôle calculé ajouté. Si vous avez choisi d'écrire un programme, le programme peut accepter l'entrée comme argument ou comme entrée standard. Si la chaîne d'entrée est vide ou ne contient aucun chiffre, vous devez retourner ou ajouter un zéro.
Quelques exemples:
Input | Output
------------+-------------
42 | 427
427 | 4270
2 to 2 | 2 to 29
23 42 76- | 23 42 76-5
- | -0
Réponses:
Pyth, 49 caractères
Contient Dieu sait quels caractères, voici donc un programme Python3 pour générer le programme ci-dessus avec précision sur votre machine:
Explication:
la source
CJam, 54 caractères
Il y a un caractère non imprimable là-dedans, vous pouvez donc utiliser le lien permanent ci-dessous.
Testez-le ici.
Explication
Le chiffre intermédiaire est suivi
T
, que CJam initialise à 0.la source
Python 3,
149 141 141138 caractèresExemples:
Merci à @MegaTom et @Sieg d'avoir aidé à supprimer un total de 11 caractères
la source
Rubis, 149 caractères
Testé sur repl.it
la source
J, 117 octets
Contient uniquement des ascii imprimables. (J'ai eu du mal avec J et unicode.) Génère la table de transition à partir des indices de permutation des lignes.
Usage:
Essayez-le en ligne ici.
la source
Haskell, 131 caractères
Essai:
la source
k, 36 caractères
q, 40 caractères (implémentation équivalente à k)
la source