Ihre Aufgabe ist ziemlich einfach. Bei zwei gegebenen Floats xor bitweise die Binärdarstellung von ihnen und gibt diese als Float aus.
Beispielsweise,
Normal: 16.7472 ^ 123.61 = 7.13402e-37
Binary: 01000001100001011111101001000100 ^ 01000010111101110011100001010010 = 00000011011100101100001000010110
Normal: 2.2 ^ 4.4 = 1.17549e-38
Binary: 01000000000011001100110011001101 ^ 01000000100011001100110011001101 = 00000000100000000000000000000000
Normal: 7.898 ^ 3.4444 = 1.47705e-38
Binary: 01000000111111001011110001101010 ^ 01000000010111000110101001111111 = 00000000101000001101011000010101
Einschränkungen / Erläuterungen:
- Die Eingabe / Ausgabe kann auf jede bequeme Weise erfolgen .
- Das Programm kann ein vollständiges Programm oder nur eine Funktion sein. entweder ist in Ordnung.
- Der Float-Typ kann eine beliebige Größe haben, die Mindestgröße beträgt jedoch 2 Byte.
- Standardlücken sind verboten.
- Kürzester Code gewinnt.
code-golf
bitwise
floating-point
virchau13
quelle
quelle
Antworten:
x86-64-Maschinencode, 4 Byte
In Montage:
Dies ist eine aufrufbare Funktion, die zwei Floats oder Double als Argumente (in
xmm0
undxmm1
) verwendet und ein Float oder Double (inxmm0
) zurückgibt .Dies entspricht den Aufrufkonventionen von Windows x64 undDies x86-64 SysV ABI und funktioniert sowohl für Floats als auch für Doubles. (Sie werden in den niedrigen 4 oder 8 Bytes der XMM-Register übergeben / zurückgegeben).
quelle
C ++ (gcc) ,
7432 BytesProbieren Sie es online!
Ich habe noch nie in C ++ Golf gespielt und bin all jenen dankbar, die geholfen haben, die Größe des Codes zu halbieren! Ein Makro, das Zeiger auf zwei Gleitkommazahlen als Argumente verwendet und das erste so modifiziert, dass es das Ergebnis zurückgibt.
Vielen Dank an @ 12Me1 für das Speichern von 2 Bytes und @Arnauld für das Speichern von 4 Bytes! Vielen Dank an @Nishioka für das Speichern von weiteren 14, @Neil für weitere 6 und @AZTECCO und @Nishioka für weitere 11! Vielen Dank an @PeterCordes für die Einsparung von 5 Bytes!
quelle
z=*(int*)x^*(int*)y;
.#define f(x,y)({int z=*(int*)x^*(int*)y;*(float*)&z;})
(*(int*)x^=*(int*)y)
.#define f(x,y)({*(int*)x^=*(int*)y;*(float*)x;})
ARM Thumb Machine Code,
64 Bytes48 40 70 47
In Montage:
Gemäß der Standardkonvention für den Aufruf von Arm werden die ersten beiden Parameter in den Registern R0 und R1 übergeben, die Ergebnisse werden in R0 zurückgegeben und LR enthält die Rücksprungadresse. Angenommen, Sie verwenden das Soft-Float-ABI mit 32-Bit-Floats, wird die gewünschte Operation in 4 Bytes ausgeführt.
-2 Bytes dank Cody Gray
quelle
EORS r0, r1
stattdessen zu verwenden , um 2 Bytes zu sparen? Dies ist nur eine 2-Byte-Anweisung (48 40
) im Vergleich zu Ihrer 4-Byte -AnweisungEOR
. Sie zielen bereits auf Thumb, daher sollte dies, soweit ich sehen kann, gut funktionieren. Der einzige Unterschied besteht darin, dass Status-Flags aktualisiert werden. Diese Nebenwirkung ist Ihnen in diesem Fall jedoch egal.s0
unds1
.Python 3 + numpy,
7559 BytesProbieren Sie es online!
Definiert ein Lambda, das zwei numpy float32-Arrays als Argumente verwendet und ein numpy float32-Array zurückgibt.
Vielen Dank an @ShadowRanger für das Speichern von 14 Bytes und Joel für weitere 2!
Wenn der Import abgebrochen werden kann (da mein Lambda selbst Methoden für numpy-Objekte aufruft und keine grundlegenden numpy-Funktionen), könnte ich weitere 13 Bytes einsparen. Ich bin mir nicht sicher, was die Standardregeln für den Golf-Code angeht.
quelle
numpy.float32
damit Sie seine Methoden verwenden können) und beideint32
Verwendungen durch'i'
und diefloat32
Verwendung durch ersetzen'f'
. derdtype
Parameter kann eine Zeichenfolge sein , die auf den realen umgewandelt werdendtype
für Dich und bequem,'i'
und'f'
es rechtliche Möglichkeiten , diese dtypes zu machen, das die Notwendigkeit für die Funktion Import entferntnumpy
Zeug in seinen Namensraum überhaupt. Ichnumpy
f
int32
bis'i'
, vier vonfloat32
bis'f'
) eingespart , aber das ist immer noch etwas. Wenn der Import unbedingt erforderlich ist, können Sie ihn einfach in ändern, umimport numpy
zu bestätigen, dass das Paket vorhanden ist, ohne mithilfefrom numpy import*
von Namen daraus zu extrahieren. Das würde Ihnen weitere sechs Bytes bringen, also insgesamt 61 Bytes.Jelly + Numpy,
8977 BytesProbieren Sie es online!
Hat die zweifelhafte Ehre, länger zu sein als der Python 3-Code, den es reproduziert, hauptsächlich wegen der Notwendigkeit, zu / von numpy objecte zu konvertieren und der Tatsache, dass numpy nicht von Jelly geladen wird, so dass das
__import__()
eingebaute verwendet werden muss.Ein monadischer Link, der die beiden Floats als Liste als Argument verwendet und einen Float zurückgibt.
Wertet den folgenden Python 3-Code aus:
wo
x
undy
werden durch die Eingabe ersetzt.quelle
APL (Dyalog Unicode) , 14 Byte SBCS
Volles Programm. Fordert zur Eingabe einer 1-Spalten-Matrix aus zwei 64-Bit-Gleitkommazahlen nach IEEE 754 (binary64) von stdin auf. Gibt eine solche Nummer als Standard aus.
Probieren Sie es online!
⎕
prompt (Zahlen, die zu Nicht-Floats zusammenfallen, können mit der Funktion zu Floats gezwungen werden⊃⊢⎕DR⍨645,⍨⎕DR
)11⎕DR
Umrechnen in 1-Bit - Binär (1) D ata R ePresentation (2-Reihe, 64-Spalten - Matrix)≠⌿
vertikale XOR-Reduktion645⎕DR
Umrechnen in 64-Bit - Schwimmers (5) D ata R ePresentation (single - Nummer)quelle
VAX BASIC (später VMS BASIC, dann Compaq Basic) , 11 Byte
Scheint mir ein bisschen albern zu sein, offensichtlich werden ältere Sprachen besser abschneiden, weil sie sich nicht so viele Sorgen um das starke Tippen machten.
quelle
Oktave , 59 Bytes
Probieren Sie es online!
Typecast ist die MATLAB / Octave-Methode zum Casting, ohne die zugrunde liegenden Bits zu ändern. Dies ist erforderlich, da
bitxor
nur Ganzzahlen verarbeitet werden können. Keine Ahnung, warum sie niemals Gleitkommazahlen implementiert haben, obwohl Sie dasAssumedType
als drittes Argument explizit angeben könnenbitxor
. Ich denke, die einzige Verwendung ist Freizeitprogrammierung.quelle
exp()
Implementierung in das Exponentenfeld zu stopfen . Ich gehe aber davon aus, dass Octave bereits Funktionen / Operatoren für Copysign und Negation hat. Und sie interessieren sich nicht für Mikrooptimierungen wie die Verwendung von AND (mit einer konstanten Maske) und XOR, um das Vorzeichen eines Werts basierend auf dem Vorzeichen eines anderen Werts bedingt umzukehren. In einem echten Optimierungsprojekt in asm (tatsächlich C mit AVX intrinsics) habe ich XOR von Floats verwendet und dann das Vorzeichenbit betrachtet, um cmp gegen Null zu vermeiden.C # (Visual C # Interactive Compiler) , 92 Byte
Probieren Sie es online!
quelle
Perl 5
-p
,3127 Bytes-4 Bytes dank Grimy
Probieren Sie es online!
quelle
MATL , 10 Bytes
Probieren Sie es online!
Teilen mit
Z}
war kürzer als zwei Eingaben,4Z%]
quelle
C 23 Bytes
Probieren Sie es online!
Dies könnte etwas unbeständig sein. es braucht die Zeiger auf
float
s als Zeiger aufint
s.Es funktioniert jedoch (das ist immerhin C).
Dies nutzt akzeptable Eingaben aus, indem ein Zeiger auf die Variable gesetzt und an Ort und Stelle geändert wird. Es wird kein (verwendbarer) Wert zurückgegeben.
quelle
JavaScript (Node.js) ,
105101 ByteKürzere Node-Version vorgeschlagen von @Neil
Dank @ShieruAsakoto wurden 4 weitere Bytes gespeichert
Übernimmt die Eingabe als
(x)(y)
.Probieren Sie es online!
JavaScript (ES6), 115 Byte
Nimmt die Eingabe als Array von 2 Floats.
Probieren Sie es online!
quelle
Buffer
speichert ein paar Bytes:a=>(v=new Buffer(4),[x,y]=a.map(n=>v.writeFloatLE(n)&&v.readInt32LE()),v.writeInt32LE(x^y),v.readFloatLE())
.map
)new
innew Buffer(4)
Arbeit sollte auch iircWolfram Mathematica , 50 Bytes
Ich bin zwar der festen Überzeugung, dass dies besser funktioniert, aber die beiden zusätzlichen Argumente in der
RealDigits
Funktion scheinen notwendig zu sein, um ein korrektes Ergebnis zu erzielen .Probieren Sie es online!
quelle
Lua , 73 Bytes
Probieren Sie es online!
Dieser Code setzt 4-Byte-Ganzzahlen ohne Vorzeichen und Gleitkommazahlen voraus, für die die Konfiguration aktiviert ist
tio.run
. Führen Sie als vollständiges Programm mit Eingaben als Argumente aus.quelle
Ruby ,
7867 Bytes-11 Bytes dank @grawity.
Probieren Sie es online!
Input ist ein Array von zwei Floats.
quelle
x.map{|v|[v].pack(?g).unpack(?N)[0]}
⇒x.pack("gg").unpack("NN")
Java (JDK) ,
10976 BytesProbieren Sie es online!
Es ist schon eine Weile her, dass ich in Java Golf gespielt habe und ich bin mir nicht sicher, ob ich die Deklaration auf der LHS als Teil der Byteanzahl benötige? Wenn DoubleBinaryOperator verwendet würde, wäre die LHS kürzer, aber die RHS müsste Double.doubleToLongBits und Double.longBitsToDouble verwenden, das ist also tatsächlich länger.
Vielen Dank an Neil für die erheblichen Einsparungen bei der Byteanzahl!
quelle
Sauber , 36 Bytes
Probieren Sie es online!
Zum Glück die
Real
undInt
-Typen auf 64-Bit-Plattformen gleich groß ...Erfordert leider eine vollständige Signatur, da sich das Diagramm sonst in eine Brezel verwandelt und alles fehlerfrei funktioniert.
quelle