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.
Classement
la source
echo -n
-1% 2/
peut être combiné dans-2/
.1,
peut être remplacé par0
(0 est forcé dans un tableau, puis+
est concaténé).9>9*-
peut être remplacé par9>+
(puisque nous ne nous intéressons qu'au dernier chiffre). En outre, la vérification des longueurs impaires est un peu longue, l'utilisation.,2%,\+
est plus courte. Après cela, nous pouvons aussi changer{16%}%
et(\0=
en{16}/
(à l'intérieur de la boucle). Une fois que vous avez fait tout ça, ça va ressembler à quelque chose comme ceci:.,2%,\+-2/0\+{{16%}/2*.9>+++}*10%!
.Python,
7369 caractèresla source
D[-2::-2]
->D[1::2]
l'ordre des sommes n'a pas d'importance :)==0
peut être raccourci à<1
Python 3, 77 octets
la source
Caractères C # 119:
Pas trop mal pour un code golf n00b dans un langage typé statiquement, j'espère.
Cela peut être réduit à 100 :
la source
i%2<1?1:2
revenir en arrière. Merci.Golfscript - 34 caractères
Exemple numéro de la page wikipedia 4992739871
la source
.+(9%)
est très innovant (pour moi en tout cas). J'aime! +10(9%)
vaut 9 et non 0).PHP, 108 octets
la source
Ruby - 85 caractères
la source
Haskell, 96 octets
Il doit y avoir un moyen meilleur / plus court, mais voici ma solution Haskell en 96 caractères :
Malheureusement, la
digitToInt
fonction ne peut être utilisée que si vous en êtes leimport Data.Char
premier. Sinon, je pourrais passer à 88 caractères en remplaçant((+(-48)).fromEnum)
pardigitToInt
.la source
Windows PowerShell, 82
Histoire:
+1 + +3
peut encore être évalué.la source
Q, 63
usage
la source
{0=mod[sum"J"$raze($)($)x*#:[x]#1 2]10}"I"$'(|)
une manière différente de doubler les index impairs.D, 144 octets
Plus lisiblement:
la source
APL, 28 octets
Vue éclatée
Exemples
la source
{0=10|+/⍎¨∊⍕¨⍵×⌽2-2|⍳⍴⍵}⍎¨
PowerShell 123
la source
Perl,
464241 octetsInclut +1 pour
-p
Donnez votre avis sur STDIN:
luhn.pl
:la source
$=-=-$&-$&*/\G(..)+$/
?0..4
* 2 donne0, 2, 4, 6, 8
mais5..9
donne10,12,14,16,18
quelle somme1 3 5 7 9
a les mêmes derniers chiffres que11 13 15 17 19
les mêmes valeurs que0..9 * 2.2
si vous tronquiez en entier. Le premier$&
contribue déjà à un facteur1
, de sorte qu'une correction par1.2
est toujours nécessaire.$=
ne peut contenir que des entiers et commence par une valeur qui se termine par 0, donc se charge de la troncature. Les valeurs négatives sont nécessaires car les/\G/
expressions rationnelles modifient toutes les notes$&
restant sur la pile d'évaluation, elles doivent donc être modifiéesJavaScript (ES6), 61 octets
Non-concurrence, car JavaScript était très différent en 2011.
Somme des chiffres de
2*n
is2*n
sin in 0..4
,2*n-9
sin in 5..9
. Cela dit, toute la somme peut être calculée en une étape.la source
Gelée ,
12 à11 octetsEssayez-le en ligne! (avec tous les cas de test)
Comment ça fonctionne
Alternativement, pour 12 octets:
la source
ASM x86-16 , IBM PC DOS, 23 octets
Utilise (abuse) l'instruction BCD-to-binary du x86
AAM
pour gérer le fractionnement et lamodulo 10
vérification de chiffres individuels .Pointeur de la chaîne de saisie de la carte d'entrée
SI
, longueur deCX
. Sortie:ZF
si valide.Exemple de sortie du programme de test:
Téléchargez le programme de test LUHN.COM IBM PC DOS.
la source
Scala: 132
invocation:
la source
JavaScript 1.8: 106 caractères
C’est une solution originale que j’ai imaginée avant de trouver ce post:
Forme lisible:
la source
K4, 35 octets
la source
Retina ,
4342 bytesLa rétine est (beaucoup) plus récente que ce défi.
La ligne vide principale est significative.
Imprime
0
pour les résultats de fausseté et1
de vérité.Essayez-le en ligne! (Légèrement modifié pour exécuter tous les tests en même temps.)
Explication
Insérer
;
dans chaque position pour séparer les chiffres.Dès le
r
début, nous cherchons deux chiffres et doublons le chiffre de gauche. De cette façon, nous évitons un renversement coûteux de la liste.Nous comparons chaque chiffre et le convertissons en autant de
1
s (c’est-à-dire que nous convertissons chaque chiffre en unaire).Cela correspond à chaque nombre unaire et le reconvertit en décimal en le remplaçant par sa longueur. Avec l'étape précédente, cela ajoute les chiffres doublés.
Encore une fois, nous correspondons à chaque personnage et le transformons en autant de
1
s. C'est-à-dire que nous convertissons chaque chiffre individuellement en unaire. Cela correspond également aux;
séparateurs, qui sont traités comme des zéros lors de la conversion, ce qui signifie qu'ils sont simplement supprimés. Puisque tous les nombres unaires sont maintenant regroupés, nous avons automatiquement ajouté les représentations unaires de tous les chiffres.À la fin, nous insérons la longueur de la chaîne entière, c'est-à-dire la représentation décimale de la somme de contrôle unaire.
Enfin, nous comptons le nombre de correspondances de cette expression rationnelle, c’est-à-dire que nous vérifions si la représentation décimale se termine par
0
, en imprimant0
ou en1
conséquence.la source
Powershell, 74 octets
Explication
Script de test
Sortie
la source
05AB1E ,
12 à10 octetsEssayez-le en ligne! ou en tant que suite de tests
Explication
la source
Haskell: 97
Pour une raison quelconque, cela ne fonctionne pas pour moi , alors voici ma version
la source
GNU sed, 140 octets
(y compris +1 pour le
-r
drapeau)Sed n’est presque jamais le langage le plus naturel pour l’arithmétique, mais on y va:
la source
APL, 38 octets
attend le nombre sous forme de nombre, pas de chaîne, mais c'est uniquement parce que tryAPL (de manière compréhensible) ne met pas en œuvre
⍎
plus réductible, je suis sûr…
la source
PHP - 136 caractères
la source
MATL ,
2320 octets (non en compétition)Essayez-le en ligne!
Affiche 1 pour un nombre valide, 0 sinon.
Économisé trois octets grâce aux suggestions de Luis Mendo.
Explication
la source
Gelée , 14 octets
Essayez-le en ligne!
Explication:
la source