Deskripsi tugas
Mengingat integer, menukar nya (2k-1) -th dan 2k -th setidaknya bit signifikan untuk semua bilangan bulat k> 0 . Ini adalah urutan A057300 dalam OEIS.
(Angka ini diasumsikan memiliki angka nol terkemuka “tak terhingga banyaknya”. Dalam praktiknya, ini berarti hanya menambahkan 0 bit ke angka ganjil.)
Ini adalah kode-golf , jadi kode terpendek (dalam byte) menang.
Uji kasus
0 -> 0
1 -> 2
9 -> 6
85 -> 170
220 -> 236
1827 -> 2835
47525 -> 30298
unsigned char array_of_bytes[1024]
untuk bekerja seperti yang Anda harapkan (yaitu menjadi bitfield denganCHAR_BIT
entri 1024 * ). Saya membayangkan sebagian besar jawaban yang mendukung input sewenang-wenang akan berasumsiCHAR_BIT
bahkan, karena menggeser bit antar byte adalah rumit. Jadi Anda benar-benar dapat menempatkan persyaratan untuk mendukungk
hingga ukuran konstan, seperti 256 atau sesuatu yang masuk akal untuk AES, dan bahasa tanpa tipe integer 256bit harus menggunakan loop. Itu mungkin membuat vektor SIMD layak dipertimbangkan untuk jawaban as86 x86: PJawaban:
Jelly ,
1097 byteCobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
Python 2, 26 byte
Trik bit!
Say
n
memiliki bentuk...ghfedcba
dalam biner. Kemudian, kita dapat membaginya menjadi setiap bit sebagaiKemudian, hasil bit-switched
s
dapat dinyatakan sebagais=2*o+e
.Kami lebih suka menghitung hanya satu dari
e
dano
, jadi kami mengekspresikano=n-2*e
dan menggantiJadi, sekarang tetap untuk mengekspresikan
e
dalam haln
. Nomor tersebutM=4**n/3
memiliki bentuk...10101010101
dalam biner, yang berfungsi sebagai topeng untuk digit aneh. Eksponenn
memastikan ituM
cukup lama. Mengambil bitwiseand
darin/2
dan nilai ini memberie
seperti yang diinginkan.Sebagai gantinya, kita dapat mengekspresikan
e
dalam halo
e=(n-o)/2
, yang memberis=(n+o*3)/2
, yang menyimpan byte berkat optimasi dari xsot.sumber
n
. Namun, saya lebih suka kebalikan dari konvensi penamaan bit "odd" vs. "even". LSB adalah bit 0, yang genap (meskipun itu bit pertama). Dalam pemrograman SIMD, di mana shuffles sering memilih elemen dengan indeks, indeks dihitung dari 0, jadi wajar untuk mempertimbangkan elemen rendah sebagai elemen genap. mis.[ 3 2 1 0 ]
lambda n:n+(n&4**n/3)*3>>1
f(x){return x+((x&~0U/3)*3)>>1;}
mengembalikan 1 untuk input 2 .calc
(alias apcalc), bukan sebenarnya C. Saya pikir saya akan baik-baik saja karena saya tidak perlu pemotongan ke 32bit, atau komplemen dua. Saya tidak berpikir ekspresi itu terlihat benar, jadi saya bersedia untuk mempercayai pengujian saya yang salah. Tapi bagaimanapun, saya membutuhkan REPL yang lebih baik untuk mengembangkan bithacks. Ada saran? (idealnya, baris perintah Linux, sukabc -l
ataucalc
, tetapi sebenarnya mengeksposint32_t
/uint32_t
atau sesuatu, bukan ketelitian yang diperluas.)Fungsi C, 38
Sedikit-twiddling:
Ideone.
Atau untuk bersenang-senang:
Fungsi rekursif C, 43
Sesuai formula OEIS ,
a(4n+k) = 4a(n) + a(k), 0 <= k <= 3
atau
Ideone.
sumber
CJam,
161413 byteUji di sini.
Penjelasan
sumber
Pyth, 9 byte
Cobalah di Pyth Compiler .
Bagaimana itu bekerja
sumber
JavaScript (ES6),
3230 byteHanya berfungsi hingga 1073741823 karena keterbatasan bilangan bulat JavaScript.
3836 byte bekerja hingga 4294967295:Sunting: Disimpan 2 byte berkat @ user81655.
51 byte bekerja hingga 4503599627370495:
sumber
n<<1
jadin*2
?n/2
! Saya tidak tahu mengapa saya tidak memikirkan itu sebelumnya.>>>
... apa itu?>>>
tetapi melakukan perubahan yang tidak ditandatangani.>>>0
pada dasarnya mengkonversi ke integer 32-bit unsigned.Fungsi as86 x86: 14 byte kode mesin
versi uint64_t: 24 byte
x86-64 SysV calling convention (
x
inedi
), tetapi kode mesin yang sama ini juga akan berfungsi dalam mode 32bit. (Di manalea
akan memecahkan kode sebagailea eax, [edi + eax*2]
, yang memberikan hasil yang identik ).0x4f - 0x40
= 14 byteIni adalah keluaran kompiler dari penggunaan ide topeng-sekali xnor yang sangat baik sebaliknya. (Dan terminologi yang berlawanan: bit rendah adalah bit 0, yang genap, tidak aneh.)
Saya tidak menemukan perbaikan apa pun yang dilakukan oleh kompiler. Saya mungkin menulisnya sebagai
mov eax, 0x555...
/and eax, edi
, tapi itu panjangnya sama.Fungsi yang sama untuk integer 64bit membutuhkan 24 byte (lihat tautan godbolt). Saya tidak melihat cara yang lebih pendek dari 10-byte
movabs rax, 0x55...
untuk menghasilkan topeng dalam register. (div
Instruksi x86 adalah kikuk, sehingga pembagian yang tidak ditandatangani oleh semua oleh 3 tidak membantu)Saya memang datang dengan loop untuk menghasilkan topeng di rax, tapi 10 byte (panjangnya persis sama dengan
mov imm64
).Jika kita tahu bahwa tidak ada byte yang ada dalam
rax
set bit yang rendah, kita bisa melewatkanxor
, dan ini akan menjadi 8 byte.Versi sebelumnya dari jawaban ini memiliki loop 10 byte menggunakan
loop
insn, tetapi memiliki0xFFFFFFFFFFFFFF08
iterasi run-time terburuk , karena saya hanya mengaturcl
.sumber
Oasis , 17 byte (tidak bersaing)
Cobalah online!
Oasis adalah bahasa yang dirancang oleh Adnan yang memiliki spesialisasi dalam urutan.
Saat ini, bahasa ini dapat melakukan rekursi dan formulir tertutup.
Kami menggunakan rumus ini:
a(4n+k) = 4a(n) + a(k), 0 <= k <= 3
Untuk menentukan kasus dasar sederhana:
3120
pada akhirnya berarti begitua(0)=0, a(1)=2, a(2)=1, a(3)=3
.sumber
MATL , 10 byte
Cobalah online!
Versi yang dimodifikasi untuk menghasilkan ketentuan urutan pertama ( OEIS A057300 ).
Penjelasan
sumber
zsh, 28 byte
Mengambil input sebagai argumen baris perintah, menghasilkan pada STDOUT.
Ini tidak kompatibel dengan Bash karena menggunakan sintaks konversi basis spesifik zsh.
sumber
Retina, 70 byte
Suite uji. (Sedikit dimodifikasi.)
Nah, hanya untuk bersenang-senang: 7 byte
Mengambil basis-4 sebagai input, dan output sebagai basis-4.
Cobalah online!
sumber
05AB1E, 8 byte
Terima kasih kepada @Adnan untuk -5 byte!
Menggunakan pengodean CP-1252.
Cobalah secara Online!
Penjelasan:
sumber
1 2‚2 1‚
dengan12Â
selama 8 byte.4в2‰íJJC
C,
323029 byteAlgoritma disalin dari komentar xsot pada jawaban Python xnor . Alih-alih menutupi kedua cara, tutupi satu cara dan kombinasikan.
Ini mengkompilasi ke asm yang sama dengan versi terakhir yang saya uji , dan itu berfungsi (untuk x hingga
0x3FFFFFFF
, dan untuk x di atas selama bit 30 tidak diatur, lihat di bawah). Dalam kode mesin, panjangnya sama dengan jawaban asm saya yang ada.Versi di atas selalu membersihkan bit tinggi hasilnya . Versi aman terbaik adalah 32 byte:
Versi Python tidak memiliki masalah ini, karena python menggunakan tipe integer presisi sewenang-wenang ketika diperlukan , alih-alih memotong ke batas atas tetap.
sumber
>>
itu adalah prioritas yang sangat rendah. Saya tidak bermain golf cukup sering untuk mengingat persis apa aturannya, karena peringatan kompiler menyarankan parens dalam kasus berbahaya menyelamatkan saya dalam kode nyata. : PJavascript (ES6),
113109 byteDisimpan 4 byte berkat Upgoat
Bagaimana itu bekerja
sumber
+('0b"+binary_string_here)
alih-alih `parseInt (..., 2)J, 20 byte
Pemakaian
Di mana
>>
STDIN dan<<
STDOUT.Tidak disatukan
Tiga garpu.
Sidenote
Dalam juru bahasa resmi,
^:_1
bisa diganti denganinv
, menghemat 1 byte.Namun, tidak ada penerjemah online yang menerapkan ini.
sumber
C #, 44 byte
Berdasarkan implementasi C
int f(int n)=>n>3?4*f(n/4)+f(n%4):n%2*2+n/2;
Coba di sini: C # pad
sumber
INTERCAL , 60 byte
Cobalah online!
Bekerja untuk bilangan bulat 16-bit, dengan I / O dilakukan dalam format paling alami untuk INTERCAL: input adalah serangkaian angka desimal yang dijabarkan dalam salah satu dari beberapa bahasa alami atau bahasa yang dikonstruksi, dan hasilnya dalam "angka Romawi yang dibantai".
Ini adalah salah satu tantangan yang jarang terjadi di mana operator biner INTERCAL benar-benar dapat digunakan sama sekali secara intuitif, karena reposisi bit adalah hal yang sebenarnya. Select (
~
) mengambil bit dari argumen pertama sesuai dengan yang ada di argumen kedua dan membalutnya ke kanan dengan nol, dan bergaul ($
) menyisipkan bit dari argumennya sehingga bit dari argumen pertama lebih signifikan. Jadi solusi langsungnya adalah memilih bit-bit alternating yang kurang signifikan (.1~#21845
), pilih bit-bit alternating yang lebih signifikan ().1~#43690
), dan interleave mereka kembali bersama dalam urutan yang berlawanan. Untungnya untuk jumlah byte, meskipun operator INTERCAL tidak memiliki prioritas yang ditentukan (karena tujuan bahasa adalah untuk tidak memiliki preseden), ternyata C-INTERCAL pada TIO tidak memerlukan banyak pengelompokan untuk ekspresi khusus ini, hanya berharga satu byte sejak'.
bisa disingkat!
.Dengan dukungan untuk bilangan bulat 32-bit:
INTERCAL , 67 byte
Cobalah online!
INTERCAL tidak mengizinkan literal 32-bit, yang sebenarnya membuat ini sedikit lebih mudah dibaca, karena itu berarti konstanta ajaib untuk memilih bit-bit bolak-balik harus dibangun dengan menyatukan dua literal 16-bit secara bersamaan, di mana yang satu nol dan nol semua itu. (Sebenarnya, bahkan jika ada literal 32-bit, ini masih akan lebih pendek.
#0$#65535
Adalah dua byte#1431655765
, dan yang sama berlaku untuk yang lain.) Ini mengkomunikasikan seluruh proses secara tidak wajar baik untuk INTERCAL.Pendekatan alternatif dengan penggunaan operand yang canggung :
INTERCAL , 71 byte
Cobalah online!
Ini tidak jauh dengan memilih sama sekali dengan menyatakan bahwa
:1
yang.2
bercampur dengan.3
, pengaturan:1
untuk input, kemudian keluaran.3
bercampur dengan.2
. Karena:1
kelebihan beban sebagai.2$.3
,DO :1 <- :2
memberikan nilai ke.2
dan.3
sehingga:1
memperoleh nilai:2
, yang menghasilkan.2
mengandung bit bolak-balik yang lebih signifikan dari:2
dan.3
mengandung bit bolak -balik yang kurang signifikan. Ini akan menjadi lebih pendek dari dua solusi 32-bit dengan empat byte jikaPLEASE WRITE IN :1
bisa digantiPLEASE WRITE IN :2 DO :1 <- :2
dengan kelebihan beban:1
, tetapiCALCULATING
ternyata diperlukan untuk menggunakan kelebihan beban. Saya juga merasa mungkin ada cara yang lebih singkat untuk melakukan overload itu sendiri daripada memulai programDO:1<-:1/.2$.3
, tetapi karena ini INTERCAL saya juga merasa tidak mungkin ada.sumber
Mathematica, 44 byte
Pendekatan yang sama seperti jawaban CJam saya: convert to base-4, swap 1s and 2s, convert back. Ini juga menggunakan trik alephalpha untuk menggantikan
FromDigits
denganFold
operasi untuk menghemat satu byte.sumber
Sebenarnya, 16 byte
Cobalah online!
Penjelasan:
sumber
J, 22 byte
Pendekatan alternatif didasarkan pada manipulasi array daripada trik basis 4.
Pemakaian
Penjelasan
sumber
REXX, 88 byte
sumber