Saya suka bermain golf dc
, tapi kadang-kadang saya frustrasi karena dc
tidak memiliki operasi bitwise.
Tantangan
Menyediakan empat fungsi bernama yang menerapkan setara dengan operasi c bitwise &
, |
, ~
dan ^
(bitwise AND, OR, NOT dan XOR). Setiap fungsi akan mengambil dua operan ( ~
hanya satu) yang setidaknya merupakan bilangan bulat 32-bit yang tidak ditandatangani. Setiap fungsi akan mengembalikan bilangan bulat tanpa tanda dengan lebar bit yang sama dengan operan.
Larangan
Anda hanya dapat menggunakan operasi yang didukung oleh dc
. Ini adalah:
+
-
*
/
Penambahan aritmatika, pengurangan, perkalian dan pembagian~
modulo (atau divmod jika bahasa Anda mendukungnya)^
eksponensial|
eksponensial modularv
akar pangkat dua>
>=
==
!=
<=
<
operator kesetaraan / ketidakmerataan standar>>
<<
operator bit shift.dc
tidak memiliki ini, tetapi karena mereka sepele diimplementasikan dalam hal pembagian / perkalian dengan kekuatan 2, maka saya akan mengizinkan ini.
Struktur kontrol di dc
saya dibuat dengan canggung menggunakan makro (rekursif) dan operasi kesetaraan (dalam). Anda dapat menggunakan struktur kontrol bawaan apa saja yang dimiliki bahasa Anda.
Anda juga dapat menggunakan operator logis &&
||
!
, meskipun ini tidak tersedia secara langsung di dc
.
Anda tidak harus menggunakan operator bitwise &
, |
, ~
dan ^
atau fungsi yang sepele menerapkannya.
Selain itu, Anda tidak boleh menggunakan operator atau fungsi konversi-dalam-string-basis-bawaan.
Harap pertimbangkan untuk memberikan program pengujian atau cuplikan kompiler online (tidak termasuk dalam skor golf) untuk membantu memverifikasi jawaban Anda.
sumber
Jawaban:
C, 134
Preprosesor C cukup menyenangkan untuk disalahgunakan. Pada dasarnya makro ini mendefinisikan 3 fungsi,
a
,o
, danx
, untukand
,or
danxor
masing-masing. Satu-satunya perbedaan dalam algoritma untuk operasi ini adalah kriteria untuk mengatur bit dalam hasilnya.not
adalah fungsinyan
.Program penguji (membutuhkan waktu lama, saya tidak menghabiskan waktu untuk mengoptimalkannya sama sekali, tetapi ia menguji setiap test case yang mungkin, selain MAX_INT yang terkait):
sumber
ised 76 byte
ised juga tidak memiliki operasi bitwise - biasanya menjengkelkan, tapi sekarang selamat datang, karena kita benar - benar perlu mengimplementasikannya.
Fungsi akan disimpan dalam slot memori bernomor (tidak ada nama verbose).
Konversi ke dan dari biner:
TIDAK bisa
@1{:$6::{1-$5::x}:}
tetapi jelas lebih mudah untuk mengurangi:ATAU:
DAN:
XOR:
Ini akan membawa kita ke 156 byte (dengan baris baru dan titik koma). Kode uji hanya akan menjadi (BUKAN, ATAU, DAN, XOR berturut-turut, ditemukan dengan nama $ 1, $ 2, $ 3, $ 4):
Tapi tentu saja OR dan NOT adalah yang benar-benar kita butuhkan dan hal-hal yang dapat disederhanakan:
Itu 109 karakter. Saat baris baru dan titik koma dilewati, dan dengan sedikit lebih banyak bermain golf, kami memiliki 76 karakter:
sumber
Nim
(537)(490)Nim Compiler 0.10.2
Saya telah mencari alasan untuk belajar nim jadi di sini kita mulai.
Untuk golf kode, saya telah meningkatkan parameter variabel dan pengembalian implisit. Parameter variabel, per dokumentasi kurang efisien. Secara pribadi, saya menemukan pengembalian implisit lebih sulit untuk dibaca dan mungkin hanya akan menggunakannya dalam prosedur sepele.
Adapun algoritma, mereka cukup sederhana. Untuk semua operasi kecuali TIDAK, kami membandingkan setiap bit dan membandingkannya secara manual dengan tabel kebenaran yang kami harapkan. Atur setiap bit sesuai kebutuhan di dalam variabel output kami. Dalam Nim, hasilnya adalah nilai balik implisit.
Saya tidak yakin apakah kami diizinkan menggunakan built-in OR dan AND untuk menyatakan dua kondisi boolean sehingga prosedur notZero diletakkan di tempatnya.Masih mencari metode yang lebih baik ...
Ini adalah versi non-squished plus harness uji lengkap untuk dijalankan di mesin Anda sendiri.
Jika Anda hanya ingin menjalankan beberapa input, berikut ini adalah test case lite .
sumber
CJam, 71 byte
Penjelasan
Suite uji
Kode ini menguji setiap fungsi saya dan, atau, tidak, dan xor yang 100 kali berfungsi dengan input unsigned 64-bit yang terdistribusi secara merata dan membandingkan hasilnya dengan yang dihasilkan oleh operator bawaan. Karena penggunaan operator eval yang serampangan, itu sangat lambat dan mungkin memakan waktu sekitar satu menit dengan penerjemah online. Tetapi jika semuanya berjalan dengan baik, eksekusi harus berakhir tanpa output, karena setiap perbedaan yang ditemukan dicetak.
sumber
JavaScript
294267Mampu mencukur beberapa byte lagi dengan saran @ AlexA. Dan @ kennytm.
Fungsi:
contoh:
keluaran:
sumber
for
dan menggantifunction B(n,m,t)
denganB=(n,m,t)=>
. Begitu juga untuk fungsi lainnya.4*(1<<30)
untuk 4294967296 dan-1>>>0
untuk 4294967295. ② apakah yangvar
benar - benar diperlukan di sini? ③ Anda bisa menulis(n,m)=>B(n,m,'a')
alih-alih(n,m)=>{return B(n,m,'a')}