Maison > Article > développement back-end > Double Luhn
Chaque semaine, Mohammad S. Anwar envoie The Weekly Challenge, une chance pour nous tous de trouver des solutions à deux tâches hebdomadaires. Mes solutions sont d'abord écrites en Python, puis converties en Perl. C'est une excellente façon pour nous tous de pratiquer le codage.
Défi, Mes solutions
Vous recevez un tableau d'entiers, @ints.
Écrivez un script pour trouver s'il existe deux indices $i et $j tels que :
Cela semble relativement simple, mais il y a un énorme piège que, espérons-le, d'autres membres de l'équipe PWC ont également remarqué. Pour cette tâche, je parcoure la liste et vois s'il existe une valeur double de sa valeur.
Cependant, si la valeur est '0' (et donc 0 × 2 = 0), je dois vérifier qu'il y avait au moins deux zéros dans la liste.
def double_exists(ints: list) -> bool: for i in ints: if i * 2 in ints: if i != 0 or ints.count(0) > 1: return True return False <h3> Exemples </h3> <pre class="brush:php;toolbar:false">$ ./ch-1.py 6 2 3 3 true $ ./ch-1.py 3 1 4 13 false $ ./ch-1.py 2 1 4 2 true $ ./ch-1.py 1 3 0 false $ ./ch-1.py 1 0 3 0 true
Vous recevez une chaîne $str contenant des chiffres (et éventuellement d'autres caractères qui peuvent être ignorés). Le dernier chiffre est la charge utile ; considérez-le séparément. En comptant à partir de la droite, doublez la valeur du premier, du troisième, etc. des chiffres restants.
Pour chaque valeur désormais supérieure à 9, additionnez ses chiffres.
Le chiffre de contrôle correct est celui qui, ajouté à la somme de toutes les valeurs, ramènerait le mod total 10 à zéro.
Renvoie vrai si et seulement si la charge utile est égale au chiffre de contrôle correct.
Je commence cette tâche en supprimant les caractères non numériques de la chaîne et en transformant la chaîne inversée en une liste d'entiers.
J'utilise ensuite la formule fournie, en alternant entre ajouter la valeur à compter ou la multiplier par deux et supprimer 9. Si le décompte obtenu est divisible par 10, je renvoie Vrai, sinon je renvoie Faux.
def luhn_algorithm(s: str) -> bool: s = re.sub('[^0-9]', '', s) ints = [int(n) for n in s[::-1]] count = 0 for pos, i in enumerate(ints): if pos % 2 == 1: i *= 2 if i > 9: i -= 9 count += i return count % 10 == 0
$ ./ch-2.py 17893729974 true $ ./ch-2.py "4137 8947 1175 5904" true $ ./ch-2.py "4137 8974 1175 5904" false
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!