Défi
Écrivez le programme ou la fonction le plus court pour calculer l' algorithme de Luhn permettant de vérifier les numéros (de carte de crédit).
Algorithme de Luhn expliqué
À partir de RosettaCode , cet algorithme est spécifié en tant que tel, avec l'exemple de l'entrée suivante 49927398716
:
Reverse the digits, make an array:
6, 1, 7, 8, 9, 3, 7, 2, 9, 9, 4
Double the numbers in odd indexes:
6, 2, 7, 16, 9, 6, 7, 4, 9, 18, 4
Sum the digits in each number:
6, 2, 7, 7, 9, 6, 7, 4, 9, 9, 4
Sum all of the numbers:
6 + 2 + 7 + 7 + 9 + 6 + 7 + 4 + 9 + 9 + 4 = 70
If the sum modulo 10 is 0, then the number is valid:
70 % 10 = 0 => valid
Règles IO
Entrée : une chaîne ou un nombre (votre choix), dans le format d'entrée / sortie de votre langue
Sortie : une valeur de vérité ou de fausseté , respectivement, indiquant si l'entrée est valide ou non selon le test ci-dessus.
Notes / Conseils
Essayez de ne pas poster accidentellement vos propres numéros de carte de crédit ou de compte si vous les utilisez pour tester :)
Si l'entrée est invalide et impossible à traiter avec l'algorithme spécifié (c'est-à-dire trop courte pour fonctionner), vous pouvez faire ce que vous voulez, y compris faire exploser mon ordinateur.
Cependant , la balle précédente ne signifie pas que votre langue peut faire ce qu'il veut avec des chiffres qui sont trop grands pour lui à gérer. Si votre langue n'est pas capable de gérer un scénario de test, envisagez de prendre une chaîne en tant qu'entrée.
Exemples
Les exemples suivants ont été validés avec ce script Python ; si vous pensez que vous avez tort ou si vous avez une question, envoyez simplement une requête ping à @cat.
49927398716 True
49927398717 False
1234567812345670 True
1234567812345678 False
79927398710 False
79927398711 False
79927398712 False
79927398713 True
79927398714 False
79927398715 False
79927398716 False
79927398717 False
79927398718 False
79927398719 False
374652346956782346957823694857692364857368475368 True
374652346956782346957823694857692364857387456834 False
8 False **
0 True **
** selon l'implémentation Python, mais vous pouvez faire n'importe quoi car elles sont trop courtes pour être éligibles par un strict respect de la spécification.
Si l'une des réponses ci-dessus invalide les réponses existantes (bien que j'estime que cela ne devrait pas être possible), ces réponses sont toujours valables. Cependant, les nouvelles réponses, pour être valables, devraient suivre la spécification ci-dessus.