Tugas Anda cukup sederhana. Diberi dua float, bitwise untuk representasi binernya, dan mengeluarkannya sebagai float.
Sebagai contoh,
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
Batasan / klarifikasi:
- Input / output dapat diberikan dengan metode apa pun yang mudah .
- Program dapat berupa program lengkap atau hanya fungsi; baik baik saja.
- Tipe float dapat berupa ukuran apa saja, tetapi ukuran minimumnya adalah 2 byte.
- Celah standar dilarang.
- Kode terpendek menang.
code-golf
bitwise
floating-point
virchau13
sumber
sumber
Jawaban:
kode mesin x86-64, 4 byte
Dalam perakitan:
Ini adalah fungsi yang bisa dipanggil yang membutuhkan dua float atau double sebagai argumen (dalam
xmm0
danxmm1
) dan mengembalikan float atau ganda (dalamxmm0
).Itu cocok dengan konvensi pemanggilan Windows x64 dan SysV ABI x86-64, dan berfungsi untuk float serta ganda. (Mereka lulus / dikembalikan dalam register XMM 4 atau 8 byte yang rendah).
sumber
C ++ (gcc) ,
7432 byteCobalah online!
Saya belum pernah bermain golf di C ++ jadi saya berterima kasih kepada semua yang telah membantu membagi dua ukuran kode! Makro yang mengambil pointer ke dua mengapung sebagai argumennya dan memodifikasi yang pertama untuk mengembalikan hasilnya.
Terima kasih kepada @ 12Me1 untuk menghemat 2 byte dan @Arnauld untuk menghemat 4! Terima kasih kepada @Nishioka karena telah menyimpan 14 lainnya, @Neil tambahan 6 dan @AZTECCO dan @Nishioka 11 lainnya! Terima kasih kepada @PeterCordes untuk menghemat 5 byte!
sumber
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
Dalam perakitan:
Di bawah konvensi standar pemanggilan Arm, dua parameter pertama dilewatkan dalam register R0 dan R1, hasilnya dikembalikan dalam R0, dan LR memegang alamat pengirim. Dengan asumsi Anda menggunakan ABI float lunak dengan float 32 bit, ini akan melakukan operasi yang diinginkan dalam 4 byte.
-2 byte berkat Cody Grey
sumber
EORS r0, r1
sebagai gantinya, untuk menghemat 2 byte? Itu hanya instruksi 2-byte (48 40
), dibandingkan dengan 4-byte AndaEOR
. Anda sudah menargetkan Jempol, jadi ini akan berfungsi dengan baik, sejauh yang saya bisa lihat. Satu-satunya perbedaan adalah pembaruan flag status, tetapi Anda tidak peduli tentang efek samping dalam kasus ini.s0
dans1
.Python 3 + numpy,
7559 byteCobalah online!
Mendefinisikan lambda yang menggunakan dua array float32 numpy sebagai argumennya dan mengembalikan array float32 numpy.
Terima kasih kepada @ShadowRanger untuk menghemat 14 byte, dan Joel 2 lebih lanjut!
Jika impor dapat dijatuhkan (karena lambda saya sendiri memanggil metode pada objek numpy daripada fungsi dasar numpy), saya bisa menyimpan 13 byte lebih lanjut. Saya tidak yakin tentang ini dari aturan standar kode golf.
sumber
numpy.float32
sehingga Anda dapat menggunakan metode mereka) dan mengganti keduaint32
penggunaan dengan'i'
danfloat32
penggunaan dengan'f'
; yangdtype
parameter dapat berupa string yang akan dikonversi ke nyatadtype
untuk Anda, dan nyaman,'i'
dan'f'
cara hukum untuk membuat orang-orang dtypes, yang menghilangkan kebutuhan untuk fungsi untuk impornumpy
barang ke namespace sama sekali. Tidak yakin apakah Code Golf legal untuk menghapus impor tetapi masih menganggapnumpy
input ...f
int32
ke'i'
empat darifloat32
ke'f'
), tapi itu masih sesuatu. Jika impor benar-benar diperlukan, Anda bisa mengubahnyaimport numpy
untuk menegaskan paket itu ada, tanpa menggunakanfrom numpy import*
untuk mengekstrak nama darinya. Itu akan memberi Anda enam byte lagi, hingga total 61 byte.Jelly + numpy,
8977 byteCobalah online!
Memiliki kehormatan yang meragukan karena lebih panjang dari kode Python 3 yang direproduksi, sebagian besar karena kebutuhan untuk mengkonversi ke / dari objek numpy dan fakta bahwa numpy tidak dimuat oleh Jelly sehingga
__import__()
built-in harus digunakan.Tautan monadik mengambil dua pelampung sebagai daftar sebagai argumennya dan mengembalikan pelampung.
Mengevaluasi kode Python 3 berikut:
di mana
x
dany
diganti dengan input.sumber
APL (Dyalog Unicode) , 14 byte SBCS
Program lengkap. Anjuran untuk matriks 1-kolom dari dua nomor floating-point IEEE 754 64-bit (binary64) dari stdin. Mencetak satu nomor seperti itu ke stdout.
Cobalah online!
⎕
prompt (angka-angka yang runtuh menjadi non-mengapung dapat dipaksa menjadi mengapung dengan fungsi⊃⊢⎕DR⍨645,⍨⎕DR
)11⎕DR
dikonversi ke 1-bit Binary (1) D ata R epresentation (2-row, 64-matrix matrix)≠⌿
pengurangan XOR vertikal645⎕DR
dikonversi ke float 64-bit (5) D ata R epresentation (nomor tunggal)sumber
VAX BASIC (kemudian VMS BASIC, kemudian Compaq Basic) , 11 byte
Bagi saya agak konyol, jelas, bahasa yang lebih tua akan lebih baik karena mereka tidak terlalu khawatir tentang masalah pengetikan yang kuat.
sumber
Oktaf , 59 byte
Cobalah online!
Typecast adalah cara casting MATLAB / Oktaf tanpa mengubah bit yang mendasarinya. Ini diperlukan karena
bitxor
hanya berfungsi pada bilangan bulat. Tidak tahu mengapa mereka tidak pernah menerapkan angka floating point, meskipun Anda dapat secara eksplisit menentukanAssumedType
argumen ketigabitxor
. Saya kira satu-satunya penggunaan adalah program rekreasi.sumber
exp()
implementasi. Tapi saya menganggap Octave sudah memiliki fungsi / operator untuk copysign dan negasi. Dan mereka tidak peduli tentang optimasi mikro seperti menggunakan AND (dengan mask konstan) kemudian XOR untuk secara kondisional membalik tanda dari satu nilai berdasarkan tanda yang lain. Dalam proyek optimasi nyata dalam asm (sebenarnya C dengan AVX intrinsik) Saya telah menggunakan XOR mengapung kemudian melihat tanda bit untuk menghindari cmp terhadap nol.C # (Visual C # Interactive Compiler) , 92 byte
Cobalah online!
sumber
Perl 5
-p
,3127 byte-4 byte terima kasih kepada Grimy
Cobalah online!
sumber
MATL , 10 byte
Cobalah online!
Memisahkan dengan
Z}
lebih pendek daripada mengambil dua input,4Z%]
sumber
C, 23 byte
Cobalah online!
Ini mungkin agak licik; dibutuhkan pointer ke
float
s sebagai pointer keint
s.Namun, itu berhasil (ini C setelah semua).
Ini mengambil keuntungan dari input yang dapat diterima dengan mengambil pointer ke variabel dan mengubahnya di tempat. Tidak ada nilai (dapat digunakan) yang dikembalikan.
sumber
JavaScript (Node.js) ,
105101 byteVersi Node yang lebih pendek disarankan oleh @Neil
Disimpan 4 byte lebih banyak berkat @ShieruAsakoto
Mengambil input sebagai
(x)(y)
.Cobalah online!
JavaScript (ES6), 115 byte
Mengambil input sebagai array yang terdiri dari 2 float.
Cobalah online!
sumber
Buffer
menyimpan beberapa byte: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)
juga harus bekerja pada iircWolfram Mathematica , 50 byte
Meskipun saya sangat curiga bahwa ini bisa lebih golf, dua argumen tambahan di
RealDigits
fungsi tampaknya diperlukan untuk mendapatkan hasil yang benar.Cobalah online!
sumber
Lua , 73 byte
Cobalah online!
Kode ini mengasumsikan bilangan bulat unsigned 4-byte dan mengapung yang merupakan konfigurasi
tio.run
. Jalankan sebagai program lengkap dengan input sebagai argumen.sumber
Ruby ,
7867 byte-11 byte terima kasih kepada @grawity.
Cobalah online!
Input adalah array dari dua float.
sumber
x.map{|v|[v].pack(?g).unpack(?N)[0]}
⇒x.pack("gg").unpack("NN")
Jawa (JDK) ,
10976 byteCobalah online!
Sudah lama sejak saya bermain golf di Jawa dan saya tidak yakin apakah saya perlu deklarasi pada LHS sebagai bagian dari jumlah byte? Jika menggunakan DoubleBinaryOperator LHS akan lebih pendek, tetapi RHS harus menggunakan Double.doubleToLongBits dan Double.longBitsToDouble, jadi itu sebenarnya lebih lama.
Terima kasih kepada Neil untuk penghematan besar pada jumlah byte!
sumber
Bersih , 36 byte
Cobalah online!
Untungnya jenis
Real
danInt
ukurannya sama pada platform 64-bit ...Sayangnya memerlukan tanda tangan lengkap jika tidak grafik berubah menjadi pretzel dan semuanya segfault.
sumber