Heim > Artikel > Backend-Entwicklung > Doppelter Luhn
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
Sie erhalten ein Array von Ganzzahlen, @ints.
Schreiben Sie ein Skript, um herauszufinden, ob es zwei Indizes $i und $j gibt, sodass:
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
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.
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
$ ./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!