Tujuan Anda adalah untuk mengimplementasikan operasi perkalian XOR ( carryless ), didefinisikan di bawah ini, sesedikit mungkin byte.
Jika kita menganggap bitor XOR ( ^
) sebagai penambahan biner tanpa membawa
101 5
^ 1001 9
----
1100 12
5^9=12
kita dapat melakukan perkalian XOR @
dengan melakukan perkalian panjang biner tetapi melakukan langkah penambahan tanpa membawa bitor XOR ^
.
1110 14
@ 1101 13
-----
1110
0
1110
^ 1110
------
1000110 70
14@13=70
(Untuk matematikawan, ini adalah perkalian dalam cincin polinomial F_2[x]
, mengidentifikasi polinomial dengan bilangan alami dengan mengevaluasi pada x=2
sebagai polinomial atas Z.)
Perkalian XOR mengubah a@b=b@a
, mengasosiasikan (a@b)@c=a@(b@c)
, dan mendistribusikan melalui bitor XOR a@(b^c)=(a@b)^(a@c)
. Bahkan, itu adalah operasi unik yang cocok dengan perkalian a@b=a*b
kapanpun a
dan b
merupakan kekuatan 2
suka 1,2,4,8...
.
Persyaratan
Ambil dua bilangan bulat non-negatif sebagai input dan output atau cetak produk-XOR mereka. Ini harus berupa angka atau representasi string desimalnya, bukan ekspansi binernya. Bytes paling sedikit menang.
Jangan khawatir tentang bilangan bulat bilangan bulat.
Berikut adalah beberapa kasus uji yang diformat sebagai 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
dari ekstensi CLMUL. Sayangnya saya downvoted untuk pengetahuan saya tentang set instruksi x86 sebelumnya (TerkaitPEXT/PDEP
), jadi saya akan meninggalkan ini sebagai komentar di sini.Jawaban:
kode mesin x86: 7 byte
Hanya dua instruksi.
pclmulqdq
melakukan pengangkatan berat, itu benar-benar menerapkan jenis xor-multiplikasi.ret
untuk membuatnya menjadi fungsi yang bisa dipanggil, mudah-mudahan memenuhi persyaratan "keluaran" hasilnya (dalam nilai pengembalian,xmm0
). Menempatkan argumen integer dalamxmm
args agak tidak biasa, tapi saya harap Anda akan memaafkan saya.sumber
Z80, 11 byte
Kode ini disebut sebagai fungsi.
a
danb
berada dalamD
danE
(urutan tidak masalah) dan jawabannya disimpanA
ketika kode kembali (tidak ada fungsi I / O).Ini menghasilkan hasil yang benar untuk semua input pengujian kecuali
63@63
yang kembali85
karena semua register adalah 8-bit dan 1365 mod 256 = 85 (integer overflow).sumber
C,
4438 byteBerkat nimi, kami sekarang menggunakan rekursi untuk 6 byte lebih sedikit!
Kita mendefinisikan fungsi
f
yang mengambila
,b
.Ini bisa disebut seperti:
Output yang mana:
13 @ 14 = 70
Coba test case online !
sumber
f(a,b)={return(b)?(b&1)*a^f(2*a,b/2):0;}
?(b&1)
denganb%2
untuk menyimpan dua byte lebih lanjut karena%
memiliki tingkat prioritas yang sama dari kiri ke kanan*
.Pyth,
1312 byteDemonstrasi.
Versi lama, 13 byte:
Demonstrasi.
sumber
vz
mengambil dua input integer.CJam,
1413 byteBagaimana itu bekerja :
Pertama-tama kita mendapatkan hasil perkalian panjang dan kemudian bekerja naik mulai dari dua pasangan terbawah.
Cobalah online di sini
sumber
J, 14 byte
Pemakaian:
Penjelasan (kebanyakan membaca dari kanan ke kiri;
u
danv
berdiri untuk fungsi sewenang-wenang):u&.#:
berlakuu
untuk vektor representasi biner dari angka-angka input kemudian putar hasilnya kembali ke integer (u&.v == v_inverse(u(v(input_1), v(input_2)))
)*/
produk (*
) dari input dalam produk Descartes (/
) dari dua vektor binerv(u@)
berlakuu
untukv
(untuk produk Descartes)u/.
berlakuu
untuk setiap anti-diagonal produk Descartes (anti-diagonals mewakili digit 1, 2, ... dalam representasi biner)~:/
mengurangi (/
) anti-diagonal dengan operasi XOR (~:
)Cobalah online di sini.
sumber
Python 2, 35 byte
Sebut seperti
f(13, 14)
. Saya pikir sebagian besar bahasa dengan konstruksi yang sama akan bertemu pada sesuatu seperti ini.sumber
Jawa, 62
Diperluas
sumber
for(;i<32;)
untukwhile(i<32)
? Panjangnya sama, tetapi yang kedua sepertinya cara yang lebih alami untuk menulisnya.i++
itu awalnya difor
loop dan mendapat golf ke posisi sekarang. Karenawhile
tidak ada yang lebih kecil, tidak ada alasan untuk mengubahnya.Haskell, 50 byte
Terjemahan dari jawaban C @ BrainSteel. Contoh penggunaan:
sumber
Perl - 35 Bytes
Menghitung opsi baris perintah sebagai satu. Input diambil dari
STDIN
, dipisahkan ruang.Penggunaan sampel:
sumber
Julia,
353330 byteIni menciptakan fungsi rekursif
f
yang mengambil dua bilangan bulat dan mengembalikan produk XOR dari input.Tidak Disatukan:
Menyimpan beberapa byte dengan dorongan dari Sp3000!
sumber
Python 2,
104917866 byteAmbil bit
b
dalam urutan terbalik, berakhir sebelum Anda menekan'0b'
pada awal string. Lipat gandakan masing-masing dengana
danxor
dengan total, lalu bergeser ke kiria
. Kemudian cetak total.sumber
Pergi, 63 byte
Contoh lengkap:
http://play.golang.org/p/-ngNOnJGyM
sumber
CELAH , 368 Bytes
Tentu, mari kita lakukan itu! (ini hanya golf longgar, intinya lebih ke pindah ke F 2 [x] dan melakukan perhitungan lebih dari upaya untuk menjadi entri yang menang)
Ini kodenya
Berikut adalah kode yang tidak dipisahkan dengan penjelasan:
Oke, jadi pertama-tama, kita buat cincin polinomial univariat di atas bidang F 2 dan sebut saja
R
. Perhatikan bahwaGF(2)
F 2 dalam GAP.Selanjutnya, kita akan menetapkan variabel GAP
x
ke tak tentu cincinR
. Sekarang, setiap kali saya mengatakanx
dalam GAP, sistem akan tahu saya berbicara tentang tak tentu cincinR
.Selanjutnya, kami memiliki dua fungsi, yang merupakan peta terbalik satu sama lain. Peta-peta ini sama-sama masuk, tetapi tidak melestarikan struktur, jadi saya tidak tahu cara yang lebih baik untuk mengimplementasikannya dalam GAP. Hampir pasti ada cara yang lebih baik, jika Anda mengetahuinya, silakan komentar!
Peta pertama,
to_ring
mengambil bilangan bulat dan memetakannya ke elemen cincin yang sesuai. Ia melakukan ini dengan menggunakan konversi ke algoritma biner, di mana setiap1
yang akan muncul dalam biner digantikan oleh dix^n
manan
adalah kekuatan yang tepat yang akan diambil 2 jika angka itu memang biner.Fungsi selanjutnya membalikkan ini.
to_ints
mengambil elemen cincin dan memetakannya ke integer yang sesuai. Saya melakukan ini dengan mendapatkan daftar koefisien polinomial dan untuk setiap koefisien bukan nol, hasilnya meningkat 2 ^ n, dengan cara yang sama kita akan mengkonversi biner ke desimal.Untuk langkah terakhir, kami memanggil fungsi-fungsi ini. Kami mengambil dua input bilangan bulat, mengubahnya menjadi elemen-elemen di dalam cincin
R
, kemudian mengalikan elemen-elemen ini bersama-sama, dan mengirimkan produk kembali ke bilangan bulat.sumber
Ruby,
767573 byteRuby, 60 byte (hanya fungsi, tanpa I / O)
sumber
Mathematica, 40 byte
sumber
f@@{a,b,c,d}
=f[a,b,c,d]
. reference.wolfram.com/language/ref/Apply.htmlDart,
3432 byteImplementasi rekursif langsung ke depan.
sumber
gnuplot, 29 byte
seperti di Dart (lihat di atas)
sumber
GNU Assembler (x86_64 Mac OS X), 97 byte
Ini adalah fungsi yang tepat yang dapat dipanggil dari C:
& dapat diuji dengan program C ini:
Perhatikan bahwa pada Mac OS X, Anda harus menggunakan
clang -x c
untuk mengompilasinya sebagai C & bukan C ++.Untuk linux (jika saya ingat benar), kodenya akan menjadi 95 byte:
Anehnya, versi ini sebenarnya lebih panjang daripada mendefinisikan fungsi dalam inline assembly, tetapi yang satu itu lebih panjang dari solusi C murni yang sudah kita miliki, jadi saya memutuskan untuk mencoba assembly.
sunting
Jika dihitung berdasarkan ukuran rakitan (tidak termasuk label & c.), Maka itu adalah
x86_64 Assembler, 22 byte:
sumber
golflua 68
Apakah pada dasarnya bithifting yang sama dengan jawaban Java Ypnypn , tetapi tampaknya membutuhkan pembagian dengan 2 pada akhirnya untuk bekerja dengan benar. Mengambil nilai sebagai stdin, contoh di bawah ini
sumber
Ceylon, 90 byte
Ini hanya algoritma seperti yang dijelaskan: kalikan
a
dengan2^i
i
bit mana saja yang diaturb
, dan tambahkan semuanya bersama-sama menggunakan xor. Iterate over0:64
karena Integer 64-bit di Ceylon ketika berjalan di JVM (lebih rendah saat berjalan sebagai Javascript, tapi kemudianb.get(i)
hanya mengembalikan false).Diformat:
Brankas alias di sini hanya satu byte.
sumber
(non-bersaing) Jelly, 16 byte
Cobalah online!
sumber