Maison  >  Article  >  développement back-end  >  Double Luhn

Double Luhn

Barbara Streisand
Barbara Streisandoriginal
2024-10-12 12:15:02930parcourir

Double Luhn

Défi hebdomadaire 290

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

Tâche 1 : Double existence

Tâches

Vous recevez un tableau d'entiers, @ints.

Écrivez un script pour trouver s'il existe deux indices $i et $j tels que :

  1. $i != $j
  2. 0 <= ($i, $j) < scalaire @ints
  3. $ints[$i] == 2 * $ints[$j]

Ma solution

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

Tâche 2 : Algorithme de Luhn

Tâche

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.

Ma solution

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

Exemples

$ ./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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn