Herausforderung
Schreiben Sie das kürzeste Programm oder die kürzeste Funktion zur Berechnung des Luhn-Algorithmus zur Überprüfung von Kreditkartennummern.
Luhn-Algorithmus erklärt
Von RosettaCode wird dieser Algorithmus für die Zwecke dieser Herausforderung als solcher angegeben, mit der Beispieleingabe von 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
IO-Regeln
Eingabe : Eine Zeichenfolge oder Zahl (Ihre Wahl) im Eingabe- / Ausgabeformat Ihrer Sprache
Ausgabe : Ein wahrer oder falscher Wert , der angibt, ob die Eingabe gemäß dem obigen Test gültig ist oder nicht.
Hinweise / Tipps
Versuchen Sie nicht, versehentlich Ihre eigenen Kreditkarten- oder Kontonummern zu veröffentlichen, wenn Sie diese zum Testen verwenden :)
Wenn die Eingabe ungültig und mit dem angegebenen Algorithmus nicht zu verarbeiten ist (dh zu kurz, um damit zu arbeiten), können Sie alles tun, was Sie wollen, auch meinen Computer in die Luft jagen.
Das vorige Aufzählungszeichen bedeutet jedoch nicht, dass Ihre Sprache mit Zahlen, die zu groß sind, um sie verarbeiten zu können, tun kann, was sie will. Wenn Ihre Sprache keinen Testfall verarbeiten kann, sollten Sie eine Zeichenfolge als Eingabe verwenden.
Beispiele
Die folgenden Beispiele wurden mit diesem Python-Skript überprüft. Wenn Sie der Meinung sind, dass eine falsch ist oder eine Frage hat, senden Sie einfach einen Ping an @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 **
** Gemäß der Python-Implementierung können Sie jedoch alles Mögliche tun, da diese zu kurz sind, um durch strikte Einhaltung der Spezifikation in Frage zu kommen.
Wenn eine der oben genannten Antworten vorhandene Antworten ungültig macht (obwohl ich glaube, dass dies nicht möglich sein sollte), sind diese Antworten weiterhin gültig. Jedoch neue Antworten, um gültig zu sein, sollten die Spezifikation oben folgen.
Bestenliste
quelle
echo -n
-1% 2/
kombinierbar zu-2/
.1,
kann durch ersetzt werden0
(0 wird zu einem Array gezwungen, dann+
wird verkettet).9>9*-
kann durch ersetzt werden9>+
(da es sich nur um die letzte Ziffer handelt). Außerdem ist die Überprüfung auf ungerade Längen etwas lang und die Verwendung.,2%,\+
ist kürzer. Ändern , nachdem diese Weise können wir auch{16%}%
und(\0=
in{16}/
(innerhalb der Schleife). Sobald Sie alles, was getan haben, wird es in etwa so aussehen:.,2%,\+-2/0\+{{16%}/2*.9>+++}*10%!
.Python,
7369 Zeichenquelle
D[-2::-2]
->D[1::2]
da die Reihenfolge einer Summe nicht wichtig ist :)==0
kann verkürzt werden auf<1
Python 3, 77 Bytes
quelle
C # 119 Zeichen:
Nicht zu schlecht für einen Code Golf n00b in einer statisch typisierte Sprache, hoffe ich.
Dies kann auf 100 reduziert werden :
quelle
i%2<1?1:2
rückwärts hatte. Vielen Dank.Golfscript - 34 Zeichen
Beispielnummer aus Wikipedia Seite 4992739871
quelle
.+(9%)
ist sehr innovativ (für mich jedenfalls). Ich mag! +10(9%)
9 und nicht 0).PHP, 108 Bytes
quelle
Ruby - 85 Zeichen
quelle
Haskell, 96 Bytes
Es muss einen besseren / kürzeren Weg geben, aber hier ist meine Haskell- Lösung in 96 Zeichen :
Leider kann die
digitToInt
Funktion nur verwendet werden, wenn Sieimport Data.Char
zuerst. Sonst könnte ich zu 88 Zeichen runter durch den Ersatz((+(-48)).fromEnum)
mitdigitToInt
.quelle
Windows PowerShell, 82
Geschichte:
+1 + +3
kann noch ausgewertet werden.quelle
Q, 63
Verwendungszweck
quelle
{0=mod[sum"J"$raze($)($)x*#:[x]#1 2]10}"I"$'(|)
einem anderen Weg, um die ungeraden Indizes zu verdoppeln.D, 144 Bytes
Besser leserlich:
quelle
APL, 28 Bytes
Explosionszeichnung
Beispiele
quelle
{0=10|+/⍎¨∊⍕¨⍵×⌽2-2|⍳⍴⍵}⍎¨
PowerShell 123
quelle
Perl,
464241 BytesBeinhaltet +1 für
-p
Geben Sie Input auf STDIN:
luhn.pl
:quelle
$=-=-$&-$&*/\G(..)+$/
?0..4
* 2 gibt0, 2, 4, 6, 8
aber5..9
gibt10,12,14,16,18
die Summe ,1 3 5 7 9
die die gleichen letzten Ziffern wie haben11 13 15 17 19
die die gleichen Werte wie0..9 * 2.2
wenn Sie auf ganzzahlige gestutzt. Der erste trägt$&
bereits einen Faktor bei1
, so dass eine Korrektur durch1.2
noch erforderlich ist.$=
Kann nur ganze Zahlen enthalten und beginnt mit einem Wert, der auf 0 endet. Die negativen Werte werden benötigt, da sich der/\G/
reguläre Ausdruck$&
noch auf dem Auswertungsstapel ändert , sodass sie geändert werden müssenJavaScript (ES6), 61 Byte
Nicht konkurrierend, da JavaScript im Jahr 2011 sehr unterschiedlich war.
Summe der Ziffern von
2*n
ist2*n
wennn in 0..4
,2*n-9
wennn in 5..9
. Trotzdem kann die gesamte Summe in einem Schritt berechnet werden.quelle
Jelly ,
1211 BytesProbieren Sie es online! (mit allen Testfällen)
Wie es funktioniert
Alternativ für 12 Bytes:
quelle
8086 Assembly , IBM PC DOS,
29282523 BytesVerwendet (missbraucht) die BCD-zu-Binär-Anweisungen des x86, um die Aufteilung und
modulo 10
Überprüfung der einzelnen Ziffern zu handhaben . Es stellt sich heraus, dass die BefehleAAM
undAAD
eine BCD / Binär-Konvertierung von Bytewerten durchführen (was sehr praktisch sein kann), obwohl nicht dokumentiert oder beschrieben wird, dass diese Funktion generisch ausgeführt wird.Für alle offiziellen IBM / MS DOS - Versionen,
AX
undBX
initialisiert , um0000
beim Start ( ref , ref ) undDX
zuCS
, was ein Wert ist 12-Bit ist so sein , nicht Null und positiv garantiert. Dies ist , wie wir garantieren können ,BX
ist0
und kann Flip / FlopDX
ungerade zu bestimmen , / selbst eingegebenen Ziffern Orte.Beispielausgabe:
Laden Sie das IBM PC DOS-Testprogramm LUHN.COM herunter .
quelle
Scala: 132
Aufruf:
quelle
JavaScript 1.8: 106 Zeichen
Dies ist eine originelle Lösung, die ich mir ausgedacht habe, bevor ich diesen Beitrag gefunden habe:
Lesbare Form:
quelle
K4, 35 Bytes
quelle
Retina ,
43-42BytesRetina ist (viel) neuer als diese Herausforderung.
Die führende Leerzeile ist signifikant.
Druck
0
für falsy und1
für truthy Ergebnisse.Probieren Sie es online! (Leicht modifiziert, um alle Testfälle gleichzeitig auszuführen.)
Erläuterung
An
;
jeder Stelle einfügen , um die Ziffern zu trennen.Ab dem
r
Zeitpunkt stimmen wir wiederholt mit zwei Ziffern überein und verdoppeln die linke. Auf diese Weise vermeiden wir eine teure Umkehrung der Liste.Wir passen jede Ziffer an und wandeln sie in so viele
1
s um (dh wir wandeln jede Ziffer in eine unäre Zahl um).Dies entspricht jeder unären Zahl und konvertiert sie zurück in eine Dezimalzahl, indem sie durch ihre Länge ersetzt wird. Zusammen mit der vorherigen Stufe werden die zweistelligen Ziffern hinzugefügt.
Auch hier stimmen wir mit jedem Charakter überein und verwandeln ihn in so viele
1
s. Das heißt, wir konvertieren jede Ziffer einzeln zurück in unär. Dies entspricht auch den;
Trennzeichen, die bei der Konvertierung als Nullen behandelt werden, dh sie werden einfach entfernt. Da nun alle unären Zahlen zusammengedrückt sind, haben wir die unären Darstellungen aller Ziffern automatisch addiert.Am Ende fügen wir die Länge des gesamten Strings ein, dh die dezimale Darstellung der unären Prüfsumme.
Zum Schluss zählen wir die Anzahl der Übereinstimmungen dieses Regex, dh wir prüfen, ob die Dezimaldarstellung endet
0
, druckt0
oder1
dementsprechend.quelle
Powershell, 74 Bytes
Erläuterung
Skript testen
Ausgabe
quelle
05AB1E ,
1210 BytesProbieren Sie es online! oder als Testsuite
Erläuterung
quelle
Haskell: 97
Aus irgendeinem Grund funktioniert das nicht für mich , also hier ist meine Version
quelle
GNU sed, 140 Bytes
(einschließlich +1 für die
-r
Flagge)Sed ist fast nie die natürlichste Sprache für Arithmetik, aber los geht's:
quelle
APL, 38 Bytes
erwartet die Zahl als Zahl, nicht als Zeichenfolge, aber das liegt nur daran, dass tryAPL (verständlicherweise) nicht implementiert wird
⍎
weiter reduzierbar, da bin ich mir sicher ...
quelle
PHP - 136 Zeichen
quelle
MATL ,
2320 Bytes (nicht konkurrierend)Probieren Sie es online!
Gibt 1 für eine gültige Zahl aus, sonst 0.
Dank Luis Mendos Vorschlägen wurden drei Bytes eingespart.
Erläuterung
quelle
Jelly , 14 Bytes
Probieren Sie es online!
Erläuterung:
quelle