Dies ist ein sehr sehr einfacher Algorithmus, der sicher in vielen verschiedenen Sprachen gelöst werden kann. In Spanien bestehen Ausweise ( DNI ) aus 8 Ziffern und einem Steuerzeichen. Das Steuerzeichen wird mit dem folgenden Algorithmus berechnet: Teilen Sie die Zahl durch 23, nehmen Sie den Rest der Operation und ersetzen Sie sie durch ein Zeichen gemäß dieser Tabelle:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
T R W A G M Y F P D X B N J Z S Q V H L C K E
Wenn der DNI einer in Spanien lebenden ausländischen Person gehört, wird die erste Ziffer in geändert X
, Y
oder, Z
und es wird ein NIE genannt . In diesem Fall werden vor der Berechnung des Steuerzeichens folgende Ersetzungen vorgenommen:
X Y Z
0 1 2
Es gibt viele Taschenrechner im Internet, mit denen Sie das Steuerzeichen ermitteln können. Aber wie kurz können Sie diesen Code schreiben? Schreiben Sie einen Algorithmus (Programm oder Funktion), der eine string
mit der DNI-Nummer (die immer aus 8 alphanumerischen Zeichen besteht) erhält und nur das berechnete einzelne Steuerzeichen und nichts weiter zurückgibt (eine abschließende Zeile wird akzeptiert).
Anmerkungen:
- Der DNI wird immer in Großbuchstaben geschrieben, aber in Ihrem Algorithmus können Sie die Eingabe und Ausgabe als Groß- oder Kleinbuchstaben auswählen, nur konsistent.
- Im wirklichen Leben, einige vor 2008 ausgestellt NIEs haben 8 Stellen nach dem
X
,Y
oderZ
aber für die Zwecke dieses Spiel, können betrachten Sie sie haben 7 Ziffern , wie sie heute haben. - Sie können davon ausgehen, dass die Eingabezeichenfolge immer 8 Zeichen hat. Wenn sie jedoch weder das Format "8 Stellen" noch das Format "[XYZ] plus 7 Stellen" aufweist, müssen Sie einen Fehler (Ihrer Wahl) zurückgeben oder einfach werfen eine Ausnahme.
Testfälle:
00000010 -> X (HRM Juan Carlos I's DNI number)
01234567 -> L
98765432 -> M
69696969 -> T
42424242 -> Y
Z5555555 -> W (Z=2)
Y0000369 -> S (Y=1)
A1234567 -> <Error code or exception>
1231XX12 -> <Error code or exception>
Das ist Code-Golf , also kann der kürzeste Code für jede Sprache gewinnen!
quelle
Antworten:
Python 3 , 83 Bytes
Probieren Sie es online!
-5 dank AlixEinsenhardt (von 99 bis 94). -1 Danke an JonathanAllan .
quelle
str('XYZ'.index(n[0]))
durchstr(ord(n[0])-88)
5 Bytes ersetzen und speichern-88
mit%4
.Haskell ,
1079392 BytesProbieren Sie es online!
quelle
Pyth,
3534 BytesDer Code enthält einige nicht druckbare Zeichen. Hier ist also ein umkehrbarer
xxd
Hexdump.Verwendet Kleinbuchstaben .
Probieren Sie es online aus. Testsuite.
Druckbare Version
Erläuterung
cz]1
an Position teilt den Eingang 1, zum Beispiel"y0000369"
an["y", "0000369"]
.>3G
Ruft die letzten 3 Buchstaben des Alphabets ab"xyz"
.U3
Ruft den Bereich [0, 3 [ ,[0, 1, 2]
.X
Kartenxyz
zu[0, 1, 2]
in Split - Array, zum Beispiel["y", "0000369"]
zu[1, "0000369"]
. Dies ersetzt das erste Zeichen, wenn es eines von istxyz
, wobei das Ende von 7 Zeichen unberührt bleibt , da eine 7-Zeichen-Zeichenfolge nicht einem einzelnen Zeichen entsprechen kann.s
tritt in das Array mit dem leeren String, zB[1, "0000369"]
auf"10000369"
.s
wandelt diesen String in eine Ganzzahl um, zB"10000369"
in10000369
. Dies löst einen Fehler aus, wenn in der Zeichenfolge zusätzliche nichtstellige Zeichen verbleiben.%
...23
erhält den Wert Modulo 23, zB10000369
an15
.C"
…"
Konvertiert die Binärzeichenfolge von der Basis 256 in eine Ganzzahl (ca. 3,06 × 10 26 )..P
…G
Erhält die Permutation des Alphabets mit diesem Index.@
erhält das richtige Zeichen aus der Permutation.quelle
MATL ,
6259 BytesDer Fehler bei ungültiger Eingabe ist
A(I): index out of bounds
(Compiler läuft in Octave) oderIndex exceeds matrix dimensions
(Compiler läuft in Matlab).Probieren Sie es online!
Erläuterung
quelle
ES6,
83 8281 BytesIn Aktion!
Nur in Großbuchstaben, der Fehlercode für ungültige Nummern lautet
undefined
.Ein Byte gespart dank Jonathan Allan.
Ein weiteres Byte wurde dank Shaggy gespeichert.
quelle
%4
anstatt-88
.0
auscharCodeAt()
zu.Java 8,
154145104 Bytes-9 Bytes dank @ OliverGrégoire .
-41 Bytes nochmals dank @ OliverGrégoire , indem die Eingabe als char-array (
char[]
) übernommen wird.Wenn die Eingabe ungültig ist, schlägt sie entweder mit einem
java.lang.NumberFormatException
oder fehljava.lang.StringIndexOutOfBoundsException
.Erläuterung:
Probieren Sie es hier aus. (Ungültige Testfälle sind von try-catch umgeben, damit sie nicht beim ersten Fehler aufhören.)
quelle
|
im Regex. Auchint t=s.charAt(0)-88
undt<0?t+40:t
ersparen Sie Ihnen ein Byte.'a'
oder'0'
einen anderen Großbuchstaben handelt, und gib diesen zurück, anstattt/0
das ganze Los zu werfenchar
. Sie würden auf diese Weise 7 Bytes sparen, denke ich. Auf diese Weise erhalten Sie 145 Bytes..matches
mit dieser Regex, übrigens. Aber vielleicht irre ich mich.s->{s[0]-=s[0]<88?0:40;return"TRWAGMYFPDXBNJZSQVHLCKE".charAt(new Integer(new String(s))%23);}
für nur 94 Bytes (mits
achar[]
): ps[0]<88&s[0]>90
für 8 weitere Bytes.PHP , 88 Bytes
Gibt 1 für einen Fehler aus
Probieren Sie es online!
quelle
Gelee , 42 Bytes
Probieren Sie es online!
Zu lange, Gelee! Dennis ist enttäuscht von dir! [Zitier-benötigt]
quelle
q / kdb + 68 Bytes
Lösung:
Beispiele:
Erläuterung:
Wenn das erste Zeichen,
x 0
in der Zeichenfolge"XYZ"
danna
wird0
,1
oder2
. Befindet sich das erste Zeichen nicht in der Zeichenfolge, ist diesa
der Fall3
. Wenna
kleiner als 3 ist, wird das erste Zeichen für die Zeichenfolge von a (0
,1
oder2
) ausgetauscht, andernfalls wird das erste Zeichen ausgetauscht (was effektiv nichts bewirkt). Diese Zeichenfolge wird in ein long ("J"$
) umgewandelt, das dannmod
mit 23 angegeben wird, um den Rest zu erhalten. Dieser Rest wird zum Indizieren in die Nachschlagetabelle verwendet.Anmerkungen:
" "
wird in den Fehlerszenarien zurückgegeben, da die Umwandlung eine Null zurückgibt und die Indizierung in eine Zeichenfolge bei Index Null ein leeres Zeichen ist. Ich könnte am Anfang 4 Bytes hinzufügen ("!"^
), um klarer zu machen, dass ein Fehler aufgetreten ist:quelle
JavaScript (ES6), 121 Byte
quelle
Japt , 50 Bytes
Ähnlich wie bei den meisten anderen Ansätzen.
Eingabe und Ausgabe erfolgen in Kleinbuchstaben, Ausgaben
undefined
für ungültige Eingaben.Test it
Teste alle gültigen Testfälle
quelle
Rust, 206 Bytes
Ich denke nicht, dass Rost gut zum Code-Golfen geeignet ist -_-
quelle
05AB1E ,
414039 BytesNimmt die Eingabe in Klein (speichern 1 Byte yay )
Probieren Sie es online!
Druckt die Eingabe in STDERR, wenn sie fehlerhaft ist
Erläuterung
quelle
Dyalog APL, 95 Bytes
{'TRWAGMYFPDXBNJZSQVHLCKE'[1+23|(10⊥¯1+'0123456789'⍳{(⍕{('XYZ'⍳⍵)<4:('XYZ'⍳⍵)-1⋄⍵} ⊃⍵),1↓⍵}⍵)]}
Dies ist ein monadischer Operator, der eine Zeichenfolge als Operanden akzeptiert und dessen Ergebnis zurückgibt.
FIXME überprüft seine Eingabe nicht. Es ist nicht richtig golfen.
Verwendung:
quelle