Einführung
Definieren wir eine neue Rechenoperation, die ich als Zipper-Multiplikation bezeichne . Um zwei nichtnegative Ganzzahlen mit dem Reißverschluss zu multiplizieren, fügen Sie führende Nullen hinzu, damit die Längen übereinstimmen, multiplizieren Sie die entsprechenden 10-stelligen Ziffern der Zahlen, fügen Sie führende Nullen zu den Ergebnissen hinzu, um zweistellige Zahlen zu erhalten, verketten Sie sie und lassen Sie schließlich führende Nullen fallen.
Hier ist ein Beispiel mit A = 1276 und B = 933024 :
1. Add leading zeros
A = 001276
B = 933024
2. Multiply digit-wise
A = 0 0 1 2 7 6
B = 9 9 3 0 2 4
-> 0 0 3 0 14 24
3. Pad to 2 digits
-> 00 00 03 00 14 24
4. Concatenate
-> 000003001424
5. Drop leading zeros
-> 3001424
Die Operation wird auf alle Ganzzahlen mit den üblichen Vorzeichenregeln ausgedehnt: positive Zeiten sind negativ, negative Zeiten sind positiv und so weiter.
Die Aufgabe
Ihre Eingaben sind zwei Ganzzahlen, und Ihre Ausgabe ist ihre Reißverschluss-Multiplikation. Sie sollten mit beliebig großen Eingaben umgehen können. Die Eingabe und / oder Ausgabe kann im Zeichenfolgenformat erfolgen (und muss auch erfolgen, wenn Ihre Sprache keine willkürlich großen Ganzzahlen unterstützt). Beachten Sie, dass dies -0
keine gültige Eingabe oder Ausgabe ist.
Regeln und Wertung
Sie können ein vollständiges Programm oder eine Funktion schreiben, und die niedrigste Byteanzahl gewinnt.
Testfälle
0 0 -> 0
302 40 -> 0
302 -40 -> 0
-4352 448 -> -122016
0 6623 -> 0
0 -6623 -> 0
20643 -56721 -> -1000420803
63196 21220 -> 1203021800
1276 933024 -> 3001424
-1276 933024 -> -3001424
-1276 -933024 -> 3001424
5007204555 350073039 -> 12001545
-612137119 -8088606033 -> 816060042000327
3389903661 -6619166963 -> -18180881090018543603
-23082746128560880381 1116941217 -> -8050600723200060807
-668336881543038127783364011867 896431401738330915057436190556 -> -485448120906320001351224000900090235004021121824000900403042
402878826066336701417493206805490000415 312487283677673237790517973105761463808 -> 120004325656161618004242182118140007280900200921180018080025285400000000320040
quelle
b⁵
mitD
bekommen die 10 Bytes. : PPython 2, 99 Bytes
Viele der Bytes sind dazu da, das Vorzeichen bei negativer Eingabe zu berücksichtigen.
n%d
Ist in Python immer nicht negativ, wennd
positiv 1 ist . Meiner Meinung nach ist dies im Allgemeinen wünschenswert, aber hier scheint es unpraktisch: Das Entfernen der Aufrufe vonabs
würde den obigen Code beschädigen. In der Zwischenzeit wirdp
der "Stellenwert" (Einsen, Hunderten usw.) protokolliert und das gewünschte Vorzeichen der Ausgabe gespeichert.Der Code ist im Grunde genommen symmetrisch
a
undb
abgesehen von derwhile
Bedingung: Wir fahren fort, bisa
Null ist, und enden zu diesem Zeitpunkt. Wenn natürlichb
zuerst Null ist, werden wir für eine Weile Nullen hinzufügen, bis aucha
Null ist.1 Gibt beispielsweise
(-33)%10
zurück7
und der ganzzahlige Quotient von(-33)/10
ist-4
. Das ist richtig, weil(-4)*10 + 7 = -33
. Das Reißverschlussprodukt von(-33)
with33
muss jedoch3*3 = 09
eher als enden7*3 = 21
.quelle
JavaScript (ES6), 44 Byte
Praktischerweise funktioniert dies automatisch für negative Zahlen.
quelle
f=
in die Byteanzahl miteinbezogen habe . Das liegt auch daran,|0
dass ich eine Ganzzahldivision benötige. Ich weiß nicht, wie Sie denken, dass Sie ohne diese die richtige Antwort erhalten.|0
. Vielleicht hat die Neuzuweisung der neuen Funktion zu f nicht funktioniert und ich habe die alte Version trotzdem mit getestet|0
.C 77 Bytes
-2 Bytes zum Entfernen redundanter Klammern (
*
assoziativ).t
= 1.100.10000, ... wird zum Auffüllen verwendet. Solangea
oderb
nicht Null ist, multiplizieren Sie die letzte Ziffer%10
mitt
und akkumulieren Sie. Löschen Sie dann die letzte Ziffer vona
undb
(/=10
) und verschieben Sie siet
um 2 Ziffern (*=100
).Ungolfed und Nutzung:
quelle
for(r=0;a|b;t*=100)r+=a%10*t*(b%10),a/=10,b/=10
stattdessen vorr=0;while(a|b)r+=t*(a%10)*(b%10),a/=10,b/=10,t*=100
Eigentlich ,
2319 BytesDie Eingabe erfolgt als zwei Zeichenfolgen. Offensichtlich funktioniert der Versuch, von der Basis 100 zu konvertieren, wie es ais523 in seiner Jelly-Antwort tut, in Actually nicht so gut. Hätte auch 9 Bytes gespart, wenn es geklappt hätte: / Golfvorschläge erwünscht! Probieren Sie es online!
Edit: -4 Bytes von der Änderung, wie das Ergebnis in eine neue Zahl aufgebaut wird.
Ungolfing
quelle
Mathematica 66 Bytes
Ungolfed:
Dabei bedeutet% die vorherigen Produktionserträge
quelle
R
18211010786 BytesNicht mehr die längste Antwort (danke, Racket) und tatsächlich kürzer als die Python-Lösung (eine seltene Belohnung)! Eine anonyme Funktion, die zwei Ganzzahlen als Eingabe verwendet.
So funktioniert das.
Bei der Zipper-Multiplikation werden die eingegebenen Zahlen in ihre konstituierenden Ziffern aufgeteilt. Wir nehmen den absoluten Wert der Zahl und führen modulo für absteigende Potenzen von 10 aus:
Also nehmen wir hier eine Zahl
x
und wenden modulo mit 99 anderen Zahlen (10^99
bis10^1
) an. R wiederholt sich implizitx
99 Mal und gibt einen Vektor (Liste) mit 99 Elementen zurück. (x %% 10^99
,x %% 10^98
,x %% 10^97
, Etc.)Wir nutzen
10^99
durch10^1
. Eine effizientere Implementierung würde den Wert der Anzahl der Ziffern in der längsten Zahl verwenden (überprüfen Sie den Bearbeitungsverlauf dieses Beitrags; frühere Versionen haben dies getan), benötigt jedoch einfach99..1
weniger Bytes.Dafür
x = 1276
gibt unsAls nächstes verwenden wir die Ganzzahldivision durch absteigende Zehnerpotenzen, um die Zahlen abzurunden:
Dies ergibt
Das ist genau die Darstellung, die wir wollen. Im Code möchten
10^(98:0)
wir ihn später wieder verwenden und weisen ihn einer Variablen zu:(Das Umschließen eines Ausdrucks in Klammern in R wertet den Ausdruck im Allgemeinen aus (in diesem Fall wird der Wert von
10^(98:0)
bis zugewiesene
) und gibt dann auch die Ausgabe des Ausdrucks zurück, sodass wir die Variablenzuweisungen in andere Berechnungen einbetten können.)Als nächstes führen wir eine paarweise Multiplikation der Ziffern in der Eingabe durch. Die Ausgabe wird dann auf zwei Ziffern aufgefüllt und verkettet. Das Auffüllen auf zwei Ziffern und Verketten entspricht dem Multiplizieren jeder Zahl mit
10^n
, wobein
der Abstand von der rechten Kante ist, und anschließendes Summieren aller Zahlen.Da die Multiplikation kommutativ ist, können wir die Multiplikation mit ausführen,
10^n
bevor wir A mit B multiplizieren . Also nehmen wir unsere frühere Rechnung und multiplizieren mit10^(98:0)
:das ist äquivalent zu
Nachdem wir dies auf A angewendet haben, möchten wir diese ganze Operation auf B wiederholen . Da dies jedoch kostbare Bytes erfordert, definieren wir eine Funktion, sodass wir sie nur einmal schreiben müssen:
Wir machen unseren Einbetten-in-Klammern-Trick, damit wir eine Funktion gleichzeitig definieren und anwenden können, um diese Funktion für A und B aufzurufen und sie miteinander zu multiplizieren. (Wir hätten es in einer separaten Zeile definieren können, aber weil wir dies alles irgendwann in eine anonyme Funktion umwandeln werden, muss alles in geschweifte Klammern gesetzt werden, was wertvoll ist Bytes.)
Und wir nehmen die Summe von all dem und wir sind fast fertig:
Das einzige, was jetzt zu berücksichtigen ist, ist das Vorzeichen der Eingabe. Wir wollen regulären Multiplikationsregeln folgen. Wenn also nur eine von A und B negativ ist, ist die Ausgabe negativ. Wir verwenden die Funktion,
sign
die1
bei einer positiven Zahl und-1
bei einer negativen Zahl zurückgibt , um einen Koeffizienten auszugeben, mit dem wir unsere gesamte Berechnung multiplizieren:Schließlich wird das Ganze in eine anonyme Funktion eingewickelt, der nimmt
a
undb
als Eingang:Entfernen Sie das Leerzeichen und es ist 86 Bytes.
quelle
Python 3 ,
92 Bytes, 119 BytesProbieren Sie es online!
Korrektur für den Umgang mit negativen Zahlen kostet 29 Bytes: /
quelle
lstrip
Teil ersetzen, indem Sie alles einpackenint()
und eine Zahl zurückgeben.Pyke, 16 Bytes
Probieren Sie es hier aus!
Wobei das Byte
0x84
oder ist132
quelle
PHP, 84 Bytes
etwas länger mit String-Verkettung (86 Bytes):
quelle
Schläger 325 Bytes
Ungolfed:
Testen:
Ausgabe:
quelle
PowerShell ,
153151 ByteProbieren Sie es online!
Weniger golfen:
quelle
Perl 5
-MList::Util=min
, 140 BytesProbieren Sie es online!
quelle