Schreiben Sie eine Funktion , die anhand der ersten 12 Ziffern eines ISBN-13- Codes die gesamte ISBN berechnet, indem Sie eine entsprechende Prüfziffer berechnen und anhängen.
Die Eingabe Ihrer Funktion ist eine Zeichenfolge, die die ersten 12 Ziffern der ISBN enthält. Seine Ausgabe ist eine Zeichenfolge, die alle 13 Ziffern enthält.
Formale Spezifikation
Schreiben Sie eine Funktion, die bei einer Zeichenfolge s, die vollständig aus 12 Dezimalstellen (und keinen weiteren Zeichen) besteht, eine Zeichenfolge t mit den folgenden Eigenschaften zurückgibt :
- t besteht aus genau 13 Dezimalstellen (und keinen weiteren Zeichen);
- s ist ein Präfix von t ;
- Die Summe aller Ziffern an ungeraden Stellen in t (dh die erste, dritte, fünfte usw.) plus das Dreifache der Summe aller Ziffern an geraden Stellen in t (dh die zweite, vierte, sechste usw.) ist a Vielfaches von 10.
Beispiel / Testfall
Eingang
978030640615
Ausgabe
9780306406157
Siegbedingung
Als Code-Golf- Herausforderung gewinnt die kürzeste Antwort.
Antworten:
Golfscript - 25 Zeichen
Ganze Programmversion ist nur 19 Zeichen
Versuchen Sie es später noch einmal. In der Zwischenzeit checke meine alte, nicht inspirierte Antwort aus
Golfscript - 32 Zeichen
Ähnlich wie bei der Luhn-Zahlenberechnung
Analyse für 978030640615
quelle
{
und letzten drei Zeichen entfernen.}:f
. Ich frage mich, ob das Gleiche für die erste Lösung getan werden kann ...:f
(ja, ich weiß, dass Funktionen damals allgemein benannt wurden).Python - 44 Zeichen
Python - 53 Zeichen
quelle
Haskell - 54 Zeichen
Dies erfordert Unterstützung für das parallele Listenverständnis , das von GHC (mit der
-XParallelListComp
Flagge) und Hugs (mit der-98
Flagge) unterstützt wird.quelle
[1,3]
durch[9,7]
und entfernen Sie die ,-
die Sie speichert ein Byte :)APL (27 Zeichen)
Ich benutze Dyalog APL als Dolmetscher. Hier eine kurze Erklärung, meistens von rechts nach links (innerhalb der Funktionsdefinition
F←{ ... }
):⍎¨⍵
: Führe⍎
jedes (¨
) Zeichen aus, das im rechten Argument (⍵
) angegeben ist.(12⍴1 3)
: Verwandle (⍴
) den Vektor1 3
in einen12
-Element-Vektor (Wiederholung, um die Lücken zu füllen).+.×
: Nehmen Sie das Skalarprodukt (+.×
) des linken Arguments ((12⍴1 3)
) und des rechten Arguments (⍎¨⍵
).10-
: Von 10 subtrahieren.10|
: Finde den Rest nach Division durch10
.⍕
: Formatieren Sie die Nummer (dh geben Sie eine Zeichendarstellung an).⍵,
: Hänge (,
) unsere berechnete Ziffer an das richtige Argument an.quelle
PHP -
868582 ZeichenNeuformatierung und Erläuterung:
quelle
Windows PowerShell, 57
quelle
Haskell,
787166 Zeichenquelle
Ruby -
7365 Zeichenquelle
"\\1"
->'\1'
?f=->s{...}
. Sparen Sie 6 Zeichen. Schreiben Sie auch,s<<(...).to_s
anstatt 48 zu addieren, und verwenden SieFixnum#chr
.C # (94 Zeichen)
Mit Zeilenumbrüchen / Leerzeichen zur besseren Lesbarkeit:
Getestet mit mehreren ISBNs aus Büchern in meinem Regal, damit ich weiß, dass es funktioniert!
quelle
Python -
91, 89quelle
for
(undin
dem dritten) in einem Listenverständnis sind optional , solange es vom Parser aufgeteilt werden kann (ohne Verwendung eines Variablennamens). -2 Zeichen dort.Perl, 53 Zeichen
quelle
C # -
8977 ZeichenZur besseren Lesbarkeit formatiert:
Wir multiplizieren nicht mit eins oder drei, wir addieren einfach alles und wir addieren alle geraden Zeichen noch einmal, multipliziert mit zwei.
9992 ist groß genug, damit die Summe aller ASCII-Zeichen kleiner ist (damit wir durch 10 modifizieren können und sicher sein können, dass das Ergebnis positiv ist, keine Notwendigkeit, durch 10 zweimal zu modifizieren) und nicht durch Null teilbar ist, weil wir addieren Addiere all diese zusätzlichen 2 * 12 * 48 (zwölf ASCII-Ziffern, gewichtet mit 1 und 3) == 1152, was uns erlaubt, ein zusätzliches Zeichen zu sparen (anstatt zweimal 48 zu subtrahieren, subtrahieren wir nur 0, um von char zu int zu konvertieren, aber statt 990 müssen wir 9992 schreiben).
Aber andererseits, obwohl viel weniger schön ;-), bringt uns diese Old-School-Lösung auf 80 Zeichen (aber das ist fast C-kompatibel):
quelle
J -
554538z.B
Alter Weg:
quelle
(i.12)(".@{)y
kann ersetzt werden durch"."0 y
Ruby - 80 Zeichen
quelle
dc, 44 Zeichen
Aufrufen als
lIx
, zB:quelle
Q, 36 Zeichen
quelle
D - 97 Zeichen
Gut leserlicher formatiert:
Die Ausführlichkeit des Besetzungsoperators von D erschwert es auf jeden Fall, obsessiv kurzen Code zu schreiben.
quelle
Java - 161 Zeichen :(
quelle
Q (44 Zeichen)
quelle
Scala 84
Testen:
Ergebnis:
quelle
C,
80 bis79 ZeichenDie Funktion ändert die vorhandene Zeichenfolge, gibt jedoch den ursprünglichen Zeichenfolgenzeiger zurück, um die Problemanforderungen zu erfüllen.
Einige Erklärungen: Anstatt 48 (den ASCII-Wert der Ziffer
0
) von jedem eingegebenen Zeichen zu subtrahieren , wird der Akkumulators
so initialisiert, dass Modulo 10 gleich 48 + 3 * 48 + 48 + 3 * 48 ... + 48 + 3 ist * 48 = 24 * 48 = 1152. Der Schritt10-sum
kann vermieden werden,s
indem anstelle der Addition durch Subtraktion akkumuliert wird. Der Moduloperator%
in C würde jedoch kein verwertbares Ergebnis liefern, wenns
es negativ wäre. Anstatts-=
die Multiplikatoren 3 und 1 zu verwenden, werden diese durch -3 = 7 Modulo 10 bzw. -1 = 9 Modulo 10 ersetzt.Testgeschirr:
quelle
Groovy
75, 66 Zeichenverwenden:
quelle
APL (25)
quelle
Perl 6 , 29 Bytes
Probieren Sie es online!
quelle
Python 2 ,
7876 BytesProbieren Sie es online!
Nimmt einen String als Argument.
Erläuterung:
Konvertiert mithilfe der Python-Slice-Notation eine Zeichenfolge in eine Liste von Zeichenpaaren. (978030640615 -> [(9, 7), (8, 0), (3, 0), (6, 4), (0 , 6), (1, 5)])
Konvertiert für diese Liste von Paaren jedes Element in eine Ganzzahl und gibt a + 3b zurück.
Summiert alle Ergebnisse.
Ruft die Summe Modulo 10 oder 10 ab, wenn der Rest 0 ist. (Dies verhindert, dass die letzte Ziffer 10 anstelle von 0 ist.)
Entfernt den Rest von 10, um die Prüfziffer zu erhalten.
Konvertiert die berechnete Prüfziffer über den veralteten Backtick-Ausdruck in eine Zeichenfolge.
Gibt die ursprüngliche Nummer plus die berechnete Prüfziffer zurück.
Bearbeiten:
2 Byes durch Entfernen von Leerzeichen gespeichert (danke Jo King !).
quelle
for
und entfernenor
APL (Dyalog Unicode) , 18 Byte SBCS
Anonyme implizite Präfixfunktion, die Zeichenfolge als Argument verwendet. Mit Bubbler Ansatz .
Probieren Sie es online!
≢
Länge des Arguments (12)9 7⍴⍨
zyklisch[9,7]
auf diese Länge umformen+.×
Punktprodukt der folgenden damit:⍎¨
`bewerte jedes Zeichen10|
mod-10 davon,∘⍕
Stellen Sie Folgendes der Stringifizierung voran:⊢
das unveränderte Argumentquelle
Gleichstrom , 25 Bytes
Probieren Sie es online!
Ich weiß, dass es hier bereits eine DC-Antwort gibt, aber 25 <44, also denke ich, fühle ich mich mit 19 Bytes in Ordnung. Dies verwendet die Tatsache, dass
8+9^z
entweder-3
oder-1
mod 10 äquivalent ist, abhängig davon, ob z gerade oder ungerade ist. Ich verwende alsoA~
, um die Zahl in Ziffern auf dem Stapel aufzuteilen, aber wenn ich den Stapel aufbaue, multipliziere ich jede Ziffer mit8+9^z
wobei z die aktuelle Stapelgröße ist. Dann füge ich sie alle hinzu, während sich der Funktionsstapel abwickelt, und drucke die letzte Ziffer.quelle
MATLAB - 82 Zeichen
quelle
R, 147 Zeichen
Verwendung:
quelle
J, 25
quelle