Latar Belakang
The Hamming berat dari integer adalah jumlah yang dalam representasi biner. Untuk tantangan ini, bilangan bulat diwakili dengan 32 bit, dan mereka tidak ditandatangani.
Tantangan
Diberikan bilangan bulat antara 0 dan 2 ^ 32-1 (tidak termasuk), menghasilkan bilangan bulat yang berbeda dalam rentang yang sama, dan juga dengan bobot Hamming yang sama.
Contohnya
Input (Decimal) | Input (Binary) | Hamming weight | Possible output (Decimal)
46 | 0b0010 1110 | 4 | 15
12 | 0b0000 1100 | 2 | 3
1 | 0b0000 0001 | 1 | 2
3 | 0b0000 0011 | 2 | 6
2^31 | 0b1000....0 | 1 | 1
2^31+2 | 0b1000...10 | 2 | 3
2^32-5 | 0b1111..011 | 31 | 2^31-1
2^32-2 | 0b1111....0 | 31 | 2^31-1
0 | 0b0000 0000 | 0 | None (This case need not be handled)
2^32-1 | 0b1111....1 | 32 | None (This case need not be handled)
Mencetak gol
Ini adalah kode-golf , sehingga solusi dalam byte paling sedikit di setiap bahasa menang.
2^31+2
, saya akan mengulangi bahwa saya mengatakan angka ganjil . Jawaban tersebut hanya gagal ketika kedua tertinggi dan bit terendah adalah1
.Jawaban:
perakitan x86-64,
54 byteSebuah fungsi menggunakan konvensi pemanggilan C yang bitwise memutar argumennya menjadi 1 bit.
sumber
n << 1 | n >> 31
menjadirol
bukanror
(menyimpan byte).Python, 20 byte
Rotasi bitwise dibiarkan 1 bit.
sumber
MATL , 9 byte
Secara melingkar menggeser representasi biner 32 digit satu langkah ke kanan.
Cobalah online!
sumber
Jelly ,
108 byteTukar bit yang paling tidak signifikan dan tidak disetel.
Cobalah online!
Bagaimana itu bekerja
sumber
JavaScript (ES6),
3531 byteMencari transisi bit pertama (0 → 1 atau 1 → 0) dan membalikkannya.
Demo
Tampilkan cuplikan kode
Rotasi bit, 14 byte
Jauh lebih pendek tapi kurang menyenangkan.
Demo
Tampilkan cuplikan kode
sumber
f(2147483647)
adalah-1073741825
dan(n=>n>>>31|n<<1)(2147483647)
sekarang-2
.k
awalnya diatur keundefined
dan kami mengambil keuntungan dari fakta yang~undefined
sama-1
.Brain-Flak , 78 byte
Cobalah online!
Mengembalikan 2n jika n <2 ^ 31, dan 2n + 1-2 ^ 32 sebaliknya. Sayangnya, karena Brain-Flak tidak memiliki cara cepat untuk menentukan tanda suatu angka, program akan mati pada TIO jika inputnya berbeda dari 2 ^ 31 lebih dari sekitar 500000.
Penjelasan
Pertama, tekan -2 ^ 32 ke stack:
Kemudian, hitung output yang diinginkan:
sumber
dc, 10
Cobalah online .
Ini adalah implementasi aritmatika dari putaran kanan 32bit:
sumber
Java 8,
1171729 byte+12 byte dengan mengubah
int
kelong
, karenaint
ukuran maksimalnya adalah2³¹-1
10089 byte disimpan dengan membuat port jawaban Python @AndersKaseorg yang luar biasa.Coba di sini.
Output:
Jawaban lama (
117118 byte):+1 byte dengan mengubah
int
kelong
, karenaint
ukuran maksimalnya adalah2³¹-1
Coba di sini.
Output:
sumber
Mathematica, 29 bytes
Try it at the Wolfram sandbox
Rotates left arithmetically: first multiply by 2, which possibly shifts the number out of range, then cut off the out-of-range digit with
Mod[...,2^32]
and add it back on the right with+Quotient[...,2^32]
.(Mathematica does have a single builtin that gives the modulus and the quotient in one go, but it's
QuotientRemainder
, which is a bit of a golfing handicap…)sumber
APL, 12 bytes
How?
sumber
05AB1E, 5 bytes
Try it online!
Explanation
Uses the trick to rotate the binary representation left by 1 bit from Anders Kaseorg's python answer.
sumber
R,
4263 bytesShuffles the bits around randomly, but checks to make sure it didn't return the same number by chance.
sumber
Whitespace,
8180 bytes(1 byte saved thanks to @Ørjan Johansen reminding me dup is shorter than push 0)
Try it online!
Basically implements a cyclic right bitshift using integer arithmetic. Pushing a large constant is expensive in Whitespace so we save some bytes by pushing 2^8 and squaring it twice. (Saves 1 byte over (2^16)^2 and 10 bytes over pushing 2^32 directly.)
Explanation
sumber
push 0
with adup
one command earlier.Python 2.7, 89 bytes
Full Program:
Try it online!
Suggestions welcome! :)
sumber
Pari/GP, 15 bytes
Try it online!
sumber
Japt, 5 bytes
Bitwise rotation, like most answers here.
Try it
sumber
Perl 5
-p
, 39 bytesTry it online!
sumber
Python 3, 45 bytes
Try it online!
sumber
C++ (gcc),
4539 bytes-6 bytes thanx to ceilingcat
Try it online!
sumber