Ihr Ziel ist es , die unten definierte Operation der XOR- Multiplikation ( Carryless ) in möglichst wenigen Bytes zu implementieren .
Wenn wir uns bitweises XOR ( ^
) als binäre Addition ohne Übertragen vorstellen
101 5
^ 1001 9
----
1100 12
5^9=12
Wir können eine XOR-Multiplikation durchführen, @
indem wir eine binäre Langmultiplikation durchführen, aber den Addierschritt ausführen, ohne ein bitweises XOR durchzuführen ^
.
1110 14
@ 1101 13
-----
1110
0
1110
^ 1110
------
1000110 70
14@13=70
(Für Mathematiker ist dies die Multiplikation im Polynomring F_2[x]
, wobei Polynome mit natürlichen Zahlen identifiziert werden, indem x=2
über Z als Polynom ausgewertet wird .)
Die XOR-Multiplikation pendelt a@b=b@a
, assoziiert (a@b)@c=a@(b@c)
und verteilt sich über bitweises XOR a@(b^c)=(a@b)^(a@c)
. In der Tat ist es die einzigartige solche Operation , die Multiplikation entspricht , a@b=a*b
wann immer a
und b
Befugnisse sind 2
wie 1,2,4,8...
.
Bedarf
Nehmen Sie zwei nicht negative Ganzzahlen als Eingabe und Ausgabe oder drucken Sie ihr XOR-Produkt. Dies sollte als Zahlen oder deren dezimale Zeichenfolgendarstellung erfolgen, nicht als binäre Erweiterung. Wenigste Bytes gewinnt.
Mach dir keine Sorgen über Integer-Überläufe.
Hier sind einige Testfälle formatiert als a b a@b
.
0 1 0
1 2 2
9 0 0
6 1 6
3 3 5
2 5 10
7 9 63
13 11 127
5 17 85
14 13 70
19 1 19
63 63 1365
PCLMULQDQ
aus der CLMUL-Erweiterung. Leider wurde ich für mein Wissen über den x86-Befehlssatz vor (Related toPEXT/PDEP
) abgelehnt , daher werde ich dies hier nur als Kommentar hinterlassen.Antworten:
x86-Maschinencode: 7 Byte
Nur zwei Anweisungen.
pclmulqdq
Wenn das schwere Heben ausgeführt wird, wird diese Art der Xor-Multiplikation buchstäblich implementiert.ret
um es zu einer aufrufbaren Funktion zu machen, die hoffentlich die Anforderung erfüllt, das Ergebnis (im Rückgabewertxmm0
) "auszugeben" . Ganzzahlige Argumente inxmm
args einzufügen ist etwas ungewöhnlich, aber ich hoffe, Sie werden mir vergeben.quelle
Z80, 11 Bytes
Der Code wird als Funktion aufgerufen.
a
undb
sind inD
undE
(die Reihenfolge spielt keine Rolle) und die Antwort wird in gespeichert,A
wenn der Code zurückkehrt (es gibt keine E / A-Funktionen).Es liefert die korrekten Ergebnisse für alle Testeingaben, mit
63@63
der Ausnahme ,85
dass alle Register 8-Bit und 1365 mod 256 = 85 sind (Integer-Überlauf).quelle
C
4438 BytesDank nimi verwenden wir jetzt die Rekursion für 6 Bytes weniger!
Wir definieren eine Funktion ,
f
die dauerta
,b
.Dies kann wie folgt aufgerufen werden:
Welche Ausgänge:
13 @ 14 = 70
Probieren Sie die Testfälle online aus !
quelle
f(a,b)={return(b)?(b&1)*a^f(2*a,b/2):0;}
?(b&1)
mitb%2
zwei weiteren Bytes zu speichern , da%
sie die gleiche links nach rechts Prioritätsstufe hat*
.Pyth,
1312 BytesDemonstration.
Alte Version, 13 Bytes:
Demonstration.
quelle
vz
zwei Integer-Eingaben zu vermeiden .CJam,
1413 BytesWie es funktioniert :
Wir erhalten zuerst die langen Multiplikationsergebnisse und arbeiten uns dann von den unteren beiden Paaren nach oben.
Probieren Sie es hier online aus
quelle
J, 14 Bytes
Verwendung:
Erklärung (meistens von rechts nach links lesen;
u
undv
für beliebige Funktionen stehen):u&.#:
giltu
für die Vektoren der binären Darstellungen der eingegebenen Zahlen, dann das Ergebnis zurück zu einer ganzen Zahl (u&.v == v_inverse(u(v(input_1), v(input_2)))
)*/
products (*
) von Eingaben im Descartes-Produkt (/
) der beiden binären Vektorenv(u@)
geltenu
fürv
(für das Descartes-Produkt)u/.
giltu
für jede Antidiagonale des Descartes-Produkts (Antidiagonalen stehen für die Ziffern 1, 2, ... in der Binärdarstellung)~:/
Reduzieren (/
) einer Antidiagonale mit XOR-Operation (~:
)Probieren Sie es hier online aus.
quelle
Python 2, 35 Bytes
Rufen Sie gerne an
f(13, 14)
. Ich denke, dass die meisten Sprachen mit einem ähnlichen Konstrukt auf so etwas konvergieren werden.quelle
Java, 62
Erweitert
quelle
for(;i<32;)
, zuwhile(i<32)
? Sie sind gleich lang, aber die zweite scheint eine natürlichere Art zu sein, sie zu schreiben.i++
war ursprünglich in derfor
Schleife und wurde zu seiner jetzigen Position golfen. Dawhile
es nicht kleiner ist, gibt es keinen Grund, es zu ändern.Haskell, 50 Bytes
Eine Übersetzung von @ BrainSteels C-Antwort. Anwendungsbeispiel:
quelle
Perl - 35 Bytes
Zählen der Befehlszeilenoption als eine. Die Eingabe erfolgt
STDIN
getrennt vom Leerzeichen.Beispielnutzung:
quelle
Julia,
353330 BytesDadurch wird eine rekursive Funktion erstellt,
f
die zwei Ganzzahlen verwendet und das XOR-Produkt der Eingaben zurückgibt.Ungolfed:
Mit Ermutigung von Sp3000 ein paar Bytes gespart!
quelle
Python 2,
104917866 BytesNehmen Sie die Bits
b
in umgekehrter Reihenfolge, bevor Sie'0b'
den Anfang der Zeichenfolge treffen . Multiplizieren Sie jedes mita
undxor
und verschieben Sie es dann nach linksa
. Dann drucken Sie die Summe.quelle
Los, 63 Bytes
Vollständiges Beispiel:
http://play.golang.org/p/-ngNOnJGyM
quelle
GAP , 368 Bytes
Klar, lass uns das machen! (Dies ist nur locker gespielt, es ging mehr darum, in F 2 [x] einzusteigen und die Berechnungen durchzuführen, als jeden Versuch, ein Gewinner zu sein.)
Hier ist der Code
Hier ist der ungolfed Code mit Erklärung:
Okay, also erstellen wir zuerst den univariaten Polynomring über dem Feld F 2 und nennen ihn
R
. Beachten Sie, dass in GAPGF(2)
F 2 ist .Als nächstes werden wir die GAP-Variable
x
der Unbestimmtheit des Rings zuweisenR
. Wenn ich jetztx
in GAP sage , weiß das System, dass ich von der Unbestimmtheit des Rings sprecheR
.Als nächstes haben wir zwei Funktionen, die Inverse Maps voneinander sind. Diese Karten sind beide in, aber sie sind nicht strukturerhaltend, sodass ich mir keinen besseren Weg vorstellen kann, sie in GAP zu implementieren. Es gibt mit ziemlicher Sicherheit einen besseren Weg, wenn Sie es wissen, bitte kommentieren Sie!
Die erste Map
to_ring
nimmt eine Ganzzahl und ordnet sie dem entsprechenden Ringelement zu. Dies geschieht durch eine Konvertierung in einen Binäralgorithmus, bei dem jedes1
, was in einer Binärzahl erscheint, durch ein ersetzt wird,x^n
won
die entsprechende Potenz ist, die 2 annehmen würde, wenn die Zahl tatsächlich binär wäre.Die nächste Funktion kehrt dies um.
to_ints
Nimmt ein Ringelement und ordnet es der entsprechenden Ganzzahl zu. Dazu erhalte ich eine Liste der Koeffizienten des Polynoms, und für jeden Koeffizienten ungleich Null wird das Ergebnis um 2 ^ n erhöht, auf dieselbe Weise, wie wir Binär in Dezimal umwandeln würden.Im letzten Schritt rufen wir diese Funktionen auf. Wir nehmen die beiden Ganzzahleingaben, konvertieren sie in Elemente im Ring
R
, multiplizieren diese Elemente dann und senden das Produkt zurück zu den Ganzzahlen.quelle
Ruby,
767573 BytesRuby, 60 Bytes (nur Funktion, keine E / A)
quelle
Mathematica, 40 Bytes
quelle
f@@{a,b,c,d}
=f[a,b,c,d]
. reference.wolfram.com/language/ref/Apply.htmlDart,
3432 BytesEinfache rekursive Implementierung.
quelle
Gnuplot, 29 Bytes
genau wie bei Dart (so)
quelle
GNU Assembler (x86_64 Mac OS X), 97 Byte
Dies ist eine korrekte Funktion, die von C aus aufgerufen werden kann:
& kann mit diesem C-Programm getestet werden:
Beachten Sie, dass Sie unter Mac OS X
clang -x c
C & nicht C ++ verwenden müssen , um es zu kompilieren.Für Linux (wenn ich mich recht erinnere) wäre der Code 95 Bytes:
Seltsamerweise ist diese Version tatsächlich länger als die Definition der Funktion in der Inline-Assemblierung, aber diese war länger als die reine C-Lösung, die wir bereits haben, und deshalb habe ich mich für die Assemblierung entschieden.
bearbeiten
Wenn es nach der zusammengesetzten Größe (ohne Etiketten usw.) gezählt wird, dann ist es
x86_64-Assembler, 22 Byte:
quelle
Golflua 68
Entspricht im Prinzip der Java-Antwort von Ypnypn , scheint jedoch die Division durch 2 am Ende erforderlich zu machen, um korrekt zu funktionieren. Nimmt Werte als stdin an, Beispiele unten
quelle
Ceylon, 90 Bytes
Dies ist nur der beschriebene Algorithmus: Multiplizieren Sie
a
mit2^i
demi
gesetzten Bitb
und addieren Sie alle mit xor. Iteriert,0:64
weil Ganzzahlen in Ceylon 64-Bit sind, wenn sie unter JVM ausgeführt werden (niedriger, wenn sie als Javascript ausgeführt werden, aber dannb.get(i)
nur false zurückgeben).Formatiert:
Der Alias speichert hier nur ein einziges Byte.
quelle
(nicht konkurrierend) Jelly, 16 Bytes
Probieren Sie es online!
quelle