Einführung
In dieser Herausforderung besteht Ihre Aufgabe darin, den ISBN-10-Code für Bücher mit dem ISBN-13-Code zu generieren, sofern ein solcher Code vorhanden ist. Ein solcher ISBN-13-Code besteht aus mehreren Teilen, die durch Folgendes getrennt sind -
:
978-GG-PPPP-TTT-C
Die Buchstaben G
(Gruppe), P
(Herausgeber), T
(Titel) und C
(Prüfsumme) stehen alle für eine Ziffer. Für die Zwecke dieser die Gruppierung Herausforderung und die Berechnung C
(siehe diese Herausforderung ) sind nicht interessant , und wir werden alle Bindestriche fallen , um diese Aufgabe einfacher zu machen.
Eine ISBN-10-Nummer hat ein sehr ähnliches Layout:
GG-PPPP-TTT-c
Die Buchstaben G
, P
und T
die gleichen wie für die 13 Ziffern sind ISBN jedoch c
unterscheidet (und berechnet einen anderen Algorithmus verwendet wird ). Die Ziffer c
wird so gewählt, dass die folgende Äquivalenz gilt (Ziffern in Reihenfolge):
10*G + 9*G + 8*P + … + 3*T + 2*T + 1*c = 0 (mod 11)
Beispiel
Betrachten wir die ISBN-Nummer 9780345391803
: Um den entsprechenden ISBN-10-Code zu erhalten, lassen wir einfach die führende 978
und die Prüfsumme fallen, die 3
ergeben 034539180
.
Als nächstes müssen wir die neue Prüfsumme berechnen:
10*0 + 9*3 + 8*4 + 7*5 + 6*3 + 5*9 + 4*1 + 3*8 + 2*0 = 185
Die nächste durch teilbare Zahl 11
ist 187
, daher ist die neue Prüfsumme 2
und damit der resultierende ISBN-10-Code 0345391802
.
Regeln
- Ihre Eingabe hat immer eine entsprechende ISBN-10-Nummer (dh sie ist genau 13-stellig und beginnt mit
978
). - Die Eingabe muss nicht unbedingt eine gültige ISBN-13 sein (z. B.
9780000000002
). - Sie werden garantiert, dass die resultierende ISBN nicht mit enden wird
X
- Sie können Eingaben als Ganzzahl oder Zeichenfolge (mit oder ohne Bindestriche) vornehmen. Eine vorberechnete Liste von Ziffern ist jedoch nicht zulässig
- Ihre Ausgabe muss eine gültige ISBN-10-Nummer sein (mit oder ohne Bindestrich)
- Ihre Ausgabe kann eine Ganzzahl oder eine Zeichenfolge sein (wieder keine Ziffernlisten)
Testfälle
9780000000002 -> 0000000000
9780201882957 -> 0201882957
9781420951301 -> 1420951300
9780452284234 -> 0452284236
9781292101767 -> 1292101768
9780345391803 -> 0345391802
Beachten Sie die führenden Nullen!
0-684-84328-5
und99921-58-10-7
der erste Teil (0
und99921
jeweils) die Registrierungsgruppe, ist der zweite Teil der Verleger, und so weiter.Antworten:
Retina ,
443928 BytesProbieren Sie es online!
Erläuterung
Es ist Zeit, einige neue Retina-Funktionen vorzuführen. :)
Wir gleichen die gesamte Eingabe mit ab
.+
, geben diese Übereinstimmung zurückL
, wählen jedoch nur die Zeichen 3 (nullbasiert) bis einschließlich -2 (vorletzt) aus. Wir drucken das Ergebnis auch ohne nachfolgenden Zeilenumbruch (>
).Jetzt ist es etwas ärgerlich, Dinge in der Netzhaut zu subtrahieren. Aber zum Glück arbeiten wir mit Modulo 11, also können wir einfach die Koeffizienten der Linearkombination (Mod 11) invertieren und alles aufsummieren. Mit anderen Worten, wenn die Einschränkung ist:
dann bekommen wir:
Das vereinfacht die Sache hier sehr:
Wir ersetzen jedes Zeichen durch das unten stehende.
*
ist der Wiederholungsoperator von Retina. Es ist rechtsassoziativ und hat implizite Operanden$&
links und_
rechts. Die Substitution ist also eigentlich eine Abkürzung für$.>`*$&*_
.$&*_
Erstellt eine Zeichenfolge mit d Unterstrichen, wobei d die Ziffer ist, die derzeit ersetzt wird. Dann$.>`
ist die Länge der Zeichenfolge bis einschließlich der Übereinstimmung. 1 Somit ergibt der gesamte Ausdruck eine unäre Darstellung des n- ten Terms unserer linearen Kombination.Das eigentliche Modulo zu machen ist in unary trivial: Wir lassen einfach alle kompletten Sätze von 11 Unterstrichen fallen.
Schließlich zählen wir, wie viele Unterstriche noch vorhanden sind, und drucken das Ergebnis aus, wodurch die ISBN-10 vervollständigt wird.
1 Wie wird
$.>`
die Länge der Zeichenfolge einschließlich der Übereinstimmung angegeben? Vielleicht kennen Sie sich mit$`
regulären Ersetzungen aus, bei denen Sie die Zeichenfolge bis zur (aber ausschließlich) Übereinstimmung erhalten. Durch Einfügen von a>
können wir den Kontext von$`
zum Trennzeichen zwischen der aktuellen und der nächsten Übereinstimmung verschieben (wobei es sich um eine leere Zeichenfolge zwischen der aktuellen und der nächsten Ziffer handelt). Das Trennzeichen$`
enthält die aktuelle Übereinstimmung. Ist$>`
also eine kürzere Art zu schreiben$`$&
. Schließlich können Sie für alle$x
Substitutionselemente vom Typ Retina ein.
nach dem einfügen$
, um die Länge zu ermitteln.quelle
-2 ≡ 9 (mod 11)
(da das Addieren oder Subtrahieren von 11 von einer Zahl ihren "Wert" in der Kongruenzklasse mod 11 nicht ändert). Durch Addition und Multiplikation werden Kongruenzklassen berücksichtigt, sodass Sie jeden Wert in einer linearen Kombination durch einen äquivalenten Wert unter dem aktuellen Modulo ersetzen können. Der Grund, warum ich von negativen Zahlen spreche, ist, dass ich die Gleichung so umgestellt habe, dass siec
auf der einen Seite und alle anderen Terme (als Negative) auf der anderen Seite stehen.c
hinüber, um zu werden,-c = ...
und anstatt mit10 9 8...
dir zu multiplizieren , subtrahiere11
von jedem, um zu bekommen,-1 -2 -3...
und multipliziere dann alles mit -1, um zu bekommenc
.05AB1E ,
17151312 BytesProbieren Sie es online!
Erläuterung
quelle
PowerShell ,
9684 ByteProbieren Sie es online!
Nimmt Eingaben entgegen
"$args"
, führt einen regulären Ausdruck durch-replace
, um nur den relevanten Teil zu erhalten, und speichert diesen$x
als Zeichenfolge. Dann werfen wir das alschar
-array und durchlaufen jeden Buchstaben. Innerhalb der Schleife dekrementieren wir vor$a
(standardmäßig0
) und multiplizieren gemäß der Prüfsummenberechnung. Beachten Sie die Umwandlung inint
, da sonst ASCII-Werte verwendet werden.Wir dann
-join
diese Zahlen zusammen mit+
und leiten das zuiex
(Invoke-Expression
und ähnlich zueval
). Wir nehmen das%11
und speichern diese Prüfsumme in$y
. Schließlich verketten wir die Zeichenfolge$x + $y
und belassen sie in der Pipeline. Die Ausgabe ist implizit.Dank Emigna 12 Bytes gespart.
quelle
Oktave ,
46 41 3937 BytesProbieren Sie es online!
Der Code nimmt Eingaben als Zeichenfolge entgegen und gibt eine Zeichenfolge zurück.
Der Code setzt sich wie folgt zusammen:
@(a)
erstellt eine anonyme Funktion.Mit
[c=a(4:12) ... ]
extrahieren wir die Zeichen, die den Hauptcode bilden, speichern eine Kopiec
für die spätere Verwendung und fügen der endgültigen Ausgabezeichenfolge eine weitere Kopie hinzu.Basierend auf @ cleveren Weg der MartinEnter Swapping
10:-1:2
in1:10
, können wir leicht diesen Bereich zu generieren und umzusetzen ein Spaltenvektor zu erhalten.c*(1:10)'
Führt eine Array-Multiplikation des Zeilenvektorsc
und des Bereichsspaltenvektors durch. Dies entspricht einer elementweisen Multiplikation und anschließenden Summierung.Die Prüfsumme ist normalerweise die
mod(11-sum,11)
Berechnung der Zahl, die erforderlich ist, damit die Summe ein Vielfaches von 11 ist. Da es sich jedochc
um eine Zeichenfolge handelt, ist die Summe tatsächlich um 2592 (48 * 54) größer als sie sein sollte, da wir mit Zahlen multipliziert haben das waren 48 größer als der tatsächliche Wert.Wenn wir das Modulo ausführen, werden automatisch alle bis auf 7 von 2592 beseitigt. Als solches und unter Berücksichtigung der Negation des Bereichs wird die tatsächliche Berechnung
48+mod(7+sum,11)
. Wir addieren 48 zu dem Ergebnis, um es wieder in ein ASCII-Zeichen umzuwandeln.Das Prüfsummenzeichen wird an das Ende des Ergebnisses angehängt und der Wert zurückgegeben.
quelle
Gelee , 12 Bytes
Dies ist ein vollständiges Programm, das Zeichenfolgen für E / A verwendet.
Probieren Sie es online!
Wie es funktioniert
quelle
JavaScript (ES6),
5956 ByteCode-Snippet anzeigen
-3 Bytes dank @ Shaggys Vorschlag .
quelle
Perl 5 , 49 + 1 (
-p
) = 50 BytesProbieren Sie es online!
quelle
Pyth , 16 Bytes
Probieren Sie es hier aus!
Pyth , 17 Bytes
Probieren Sie es hier aus!
Erläuterung
quelle
Japt ,
1615 BytesKam damit neulich in der Kneipe runter und vergaß alles.
Versuch es
quelle
s3J
undU+¬x_*°TÃuB
U
- D'oh vergessen !Hexagony ,
7761 BytesProbieren Sie es online!
Farbig:
Hier ist eine größere Version. Es gibt einige Wegkreuzungen, aber da all diese Zellen
.
(in Hexagony kein Zugriff) vorhanden sind, müssen Sie sich keine Gedanken darüber machen:(Ich habe auch versucht, die alten Spiegel zu behalten, aber manchmal muss ich etwas ändern)
Der ausgeführte lineare Befehl lautet:
Erläuterung: Anstatt einen Zähler zu führen und mit jeder Ziffer zu multiplizieren, führt dieses Programm Folgendes aus:
p
undt
)(-p-t)%11
, wobei%
immer positive Ergebnisse zurückgegeben werden.quelle
K (oK) ,
29252423 BytesLösung:
Probieren Sie es online!
Beispiele:
Erläuterung:
Die Auswertung erfolgt von rechts nach links.
Zwei Tricks aus anderen Lösungen:
Nervenzusammenbruch:
Anmerkungen:
7
zur Summe)quelle
C (gcc),
96 95 87 8685 Bytes(-1 dank ceilingcat)
Probieren Sie es online!
Zu nennen als
f(s)
, wobeis
ein Zeiger auf das erste Element eines modifizierbaren Zeichenarrays ist. Ändert das Eingabearray und gibt einen Zeiger in das Eingabearray zurück.quelle
Python 2 , 62 Bytes
Probieren Sie es online!
Nimmt einen String als Eingabe; und gibt einen String aus.
quelle
Jelly , 14 Bytes
Testsuite!
Gelee , 17 Bytes
Probieren Sie es online! oder Testsuite!
Nimmt Ein- und Ausgaben als String.
quelle
ECMAScript 6 ,
8667 BytesProbieren Sie es online!
Vielen Dank für den Kommentar von Arnauld , der von
reduce
zumap
geändert und dasreturn
Keyword entfernt wurde.quelle
map()
,reduce()
usw. Mit einigen zusätzlichen Umschreiben, ist es oft möglich loswerden{}
undreturn
. Auch ist in diesem speziellen Fallmap()
wahrscheinlich kürzer alsreduce()
. ( Hier ist eine 65-Byte-Version.)f=
das nicht notwendig ist. Sie können auchc
bei der Verbreitung für so etwas initialisieren :a=>{i=10;s=[...c=a.substr(3,9)].reduce((g,v)=>+g+(i--)*v,0)%11;return c+=s?11-s:0}
(-4 Bytes)Retina 0.8.2 ,
7251 BytesProbieren Sie es online! Weil ich Retina 1.0 noch nicht gelernt habe. Erläuterung:
Löschen Sie die unerwünschten Zeichen und machen Sie eine zweite Kopie der entsprechenden Ziffern.
Suffixieren Sie jede Ziffer in der zweiten Kopie mit ihrem Suffix. Dies wiederholt effektiv jede Ziffer im Suffix nach ihrer Position.
Wandeln Sie die Ziffern in der zweiten Kopie in unäre um und addieren Sie sie so.
Modulo 11 reduzieren. (Die erste Kopie enthält nur 9 Ziffern, dies kann sich also nie auf sie auswirken.)
Wandle das Ergebnis zurück in eine Dezimalzahl und entferne die neue Zeile wieder.
quelle
APL (Dyalog Unicode) ,
2624 BytesProbieren Sie es online!
Tacit-Präfix-Funktion. Übernimmt die Eingabe als String.
2 Bytes gespart dank @ngn.
Wie?
quelle
Sauber ,
10410298 BytesProbieren Sie es online!
quelle
Kotlin , 83 Bytes
Verschönert
Prüfung
TIO
TryItOnline
quelle
Ruby ,
69 6864 BytesProbieren Sie es online!
quelle
PHP, 64 Bytes
Leider ist in PHP
(-$c)%11
das gleiche wie-($c%11)
; Ich muss also die Differenz auf mindestens die größtmögliche Summe bringen (55 * 9 = 495 = 45 * 11), anstatt nur zu verwenden-$c%11
.oder
Laufen Sie als Pipe mit
-nR
oder probieren Sie sie online aus .quelle
Java 10, 110 Bytes
Nimmt Ein- und Ausgaben als
long
Ganzzahl. Probieren Sie es hier online aus .Ungolfed-Version:
quelle