Heim  >  Artikel  >  Backend-Entwicklung  >  Doppelter Luhn

Doppelter Luhn

Barbara Streisand
Barbara StreisandOriginal
2024-10-12 12:15:02938Durchsuche

Double Luhn

Wöchentliche Herausforderung 290

Jede Woche verschickt Mohammad S. Anwar die Weekly Challenge, eine Chance für uns alle, Lösungen für zwei wöchentliche Aufgaben zu finden. Meine Lösungen werden zunächst in Python geschrieben und dann in Perl konvertiert. Es ist eine großartige Möglichkeit für uns alle, etwas Codierung zu üben.

Herausforderung, meine Lösungen

Aufgabe 1: Double Exist

Aufgaben

Sie erhalten ein Array von Ganzzahlen, @ints.

Schreiben Sie ein Skript, um herauszufinden, ob es zwei Indizes $i und $j gibt, sodass:

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

Meine Lösung

Das scheint relativ einfach zu sein, aber es gibt ein großes Problem, das hoffentlich auch anderen Team-PWC-Mitgliedern aufgefallen ist. Für diese Aufgabe durchgehe ich die Liste und schaue, ob ein Wert existiert, der doppelt so hoch ist wie der Wert.

Wenn der Wert jedoch „0“ ist (und somit 0 × 2 = 0), muss ich überprüfen, ob mindestens zwei Nullen in der Liste vorhanden sind.

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>
  
  
  Beispiele
</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

Aufgabe 2: Luhns Algorithmus

Aufgabe

Sie erhalten eine Zeichenfolge $str mit Ziffern (und möglicherweise anderen Zeichen, die ignoriert werden können). Die letzte Ziffer ist die Nutzlast; Betrachten Sie es separat. Wenn Sie von rechts zählen, verdoppeln Sie den Wert der ersten, dritten usw. der verbleibenden Ziffern.

Summieren Sie für jeden Wert, der jetzt größer als 9 ist, seine Ziffern.

Die richtige Prüfziffer ist diejenige, die addiert zur Summe aller Werte den Gesamtwert von Mod 10 auf Null bringen würde.

Gib nur dann true zurück, wenn die Nutzlast mit der richtigen Prüfziffer übereinstimmt.

Meine Lösung

Ich beginne diese Aufgabe, indem ich nicht-stellige Zeichen aus der Zeichenfolge entferne und die umgekehrte Zeichenfolge in eine Liste von Ganzzahlen umwandle.

Ich verwende dann die bereitgestellte Formel und wechsle zwischen der Addition des zu zählenden Werts oder der Multiplikation mit zwei und dem Entfernen von 9. Wenn die resultierende Zahl durch 10 teilbar ist, gebe ich „True“ zurück, andernfalls gebe ich „False“ zurück.

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

Beispiele

$ ./ch-2.py  17893729974
true

$ ./ch-2.py  "4137 8947 1175 5904"
true

$ ./ch-2.py "4137 8974 1175 5904"
false

Das obige ist der detaillierte Inhalt vonDoppelter Luhn. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn