Tantangan
Diberikan bilangan bulat dalam format komplemen 32-bit dua , kembalikan indeks digit nol paling signifikan kedua di representasi biner, di mana indeks 0
mewakili bit paling signifikan, dan indeks 31
mewakili bit paling signifikan.
Jika tidak ada nol kedua, Anda dapat mengembalikan 0, angka negatif, nilai palsu, atau melaporkan kesalahan dengan cara yang masuk akal dalam bahasa Anda.
Anda dapat menggunakan pengindeksan 1 jika Anda mau, tetapi kasus uji di bawah ini akan menggunakan pengindeksan 0.
Anda dapat menggunakan bilangan bulat yang tidak ditandatangani jika Anda menginginkannya; jika Anda melakukannya, maka Anda harus menangani bilangan bulat dalam jangkauan [0, 2^32)
. Jika Anda menggunakan bilangan bulat yang ditandatangani, Anda harus menangani bilangan bulat di dalam rentang [-2^31, 2^31)
. Kasing uji di sini akan menggunakan bilangan bulat yang ditandatangani, tetapi perhatikan bahwa -x
(ditandatangani) adalah 2^32 - x
(tidak ditandatangani).
Uji Kasus
0 (0b00) -> 1 1 (0b001) -> 2 10 (0b1010) -> 2 11 (0b01011) -> 4 12 (0b1100) -> 1 23 (0b010111) -> 5 -1 (0b11..11) -> Tidak ada -2 (0b11..10) -> Tidak Ada -4 (0b11..00) -> 1 -5 (0b11..1011) -> Tidak ada -9 (0b11..10111) -> Tidak ada 2 ^ 31-2 (0b0111..1110) -> 31
Mencetak gol
Ini kode-golf , jadi jawaban tersingkat di setiap bahasa menang!
[0, 2^32)
.0b...
sebagai input?2^32-1
karena saya tidak seharusnya kembali33
.Jawaban:
Python 2 , 45 byte
Cobalah online!
Menggunakan pengindeksan 0, angka yang tidak ditandatangani, dan melempar kesalahan tanpa nol detik.
Cukup buat daftar indeks bit yang tidak disetel, dari terendah ke tertinggi, dan mengembalikan entri kedua.
sumber
JavaScript (ES6), 34 byte
Mengembalikan indeks berbasis 0, atau
-1
jika tidak ada nol kedua ditemukan.Uji kasus
Tampilkan cuplikan kode
Ekspresi alternatif
Versi rekursif, 42 byte
Mengembalikan indeks berbasis 0, atau
false
jika tidak ada nol kedua ditemukan.Bagaimana?
Uji kasus
Tampilkan cuplikan kode
Versi alternatif disarankan oleh Neil, 41 byte
Mengembalikan indeks berbasis 0, atau melempar kesalahan rekursi terlalu banyak jika tidak ada nol kedua ditemukan.
sumber
f=(n,c=1)=>n%2?1+f(~-n/2,c):c&&1+f(n/2,0)
Jelly , 7 byte
Cobalah online!
Ini menghasilkan sesuatu yang tidak dalam kisaran [1,31] jika tidak ada nol kedua. Ini termasuk
32
33
dan(-inf+nanj)
. Saya kira itu masuk akal.Itu menghitung
log(((x|(x+1))+1)&~x)/log(2)
.sumber
-inf+nanj
Saya tidak berpikir itu bisa ada(-inf+nanj)
untuk input2147483647
yang memiliki representasi biner dari 31 1s, maka tidak ada nol kedua dalam notasi 32-bit yang ditandatangani (inilah sebabnya mengapa jauh lebih pendek daripada jawaban saya dan jawaban Erik).(-inf+nanj)
?Java, ...
194 191186 Bytes-159 Bytes untuk menggunakan nama variabel yang lebih kecil dan menghapus spasi
-25 Bytes, setelah mengambil variabel lebih pendek dan berkat tips @KevinCruijssen
-18 Bytes, lebih banyak spasi putih, nama fungsi
-3 Bytes, terima kasih kepada @KevinCruijssen, perpendek jika kondisi
-5 Bytes , Terima kasih kepada @Arnold Palmer, @KevinCruijssen, shortening loop
Tidak disatukan
sumber
static
bisa dihilangkan;if(n<0||n>o){return 0;}
bisaif(n<0|n>o)return 0;
(|
bukan||
dan tidak ada tanda kurung);bs
,,bsa
dll. semuanya dapat berupa karakter tunggal (tidak pernah menggunakan nama variabel / metode multi-byte dalam kode-golf); Anda dapat menggabungkanint
s, seperti ini:int o=2^32-2,c=0,i=x.length,l=i-1;
. Dan ada beberapa hal lagi untuk golf. Tips untuk bermain golf di Jawa dan Tips untuk bermain golf dalam semua bahasa mungkin menarik untuk dibaca. Sekali lagi selamat datang, dan nikmati masa tinggal Anda! :)if(c[i]=='0'){j++;}
masih bisa di-golfif(c[i]==48)j++;
-3 bytes :) EDIT: Atau lebih baik lagi:while(j<2&&i>0){i--;if(c[i]=='0'){j++;}}
bisafor(;j<2&i>0;j+=c[i--]==48?1:0);
untuk -8 bytes.for(;j<2&i>0;j+=c[--i]==48?1:0);
itu harus bekerja. Kesalahan berasal darii
panjangnya string, jadi awalnya Anda mencoba mengindeks melewati batas-batas array. Jika Anda melakukan pra-pengurangan (seperti yang ditunjukkan dalam cuplikan yang diperbarui), maka pertama kali Anda menggunakannya akan mengaksesc[c.length-1]
seperti dalam kode asli Anda.Java (OpenJDK 8) ,
4438 byteCobalah online!
Mengembalikan 0 jika tidak ada bit nol kedua ada.
sumber
Kode mesin IA-32,
1413 byteHexdump:
Daftar pembongkaran:
Menerima input
ecx
; output dalamal
. Mengembalikan 0 pada kesalahan.Pertama-tama, itu membalikkan input, sehingga dapat menggunakan instruksi pemindaian bit untuk mencari bit yang ditetapkan. Ia mencari bit set paling tidak signifikan, me-reset, mencari bit set paling tidak signifikan lagi, dan mengembalikan hasilnya.
Jika instruksi pemindaian bit tidak menemukan bit yang diset, dokumentasi Intel mengatakan bahwa output tidak terdefinisi. Namun, dalam praktiknya semua prosesor membiarkan register tujuan tidak berubah dalam kasus ini (seperti dicatat oleh Cody Grey, dokumentasi AMD menggambarkan perilaku ini sebagai wajib).
Jadi, ada beberapa kasus berikut:
not
dan tetap 0btr
dan tetap 0 setelahbsf
bsf
sumber
SALC
+DEC
adalah sangat pintar, Anda dapat mencukur habis byte dengan hanya menggunakan apa yang ada diECX
pada keduaBSF
instruksi. Satu-satunya hal yang membutuhkan adalah 1-byteXCHG
untuk mendapatkan hasilnyaEAX
sehingga dapat dikembalikan. Dengan kata lain,not ecx; bsf eax, ecx; btr ecx, eax; bsf ecx, ecx; xchg eax, ecx; ret
ECX
sebagai register input, kami perlu memberi tahu GCC untuk menggunakan konvensi panggilan cepat.Dyalog APL, 20 byte
Menggunakan pengindeksan 1, melempar
INDEX ERROR
jika tidak ada nol detik.Bagaimana?
⍵⊤⍨
- disandikan⍵
sebagai32⍴2
- string biner dengan panjang 32⌽
- balik~
- negate (0 → 1, 1 → 0)(⍳32)/⍨
- kompres dengan kisaran 1-32 (meninggalkan indeks nol)2⊃
- pilih elemen keduasumber
⍸
)Jelly , 13 byte
Cobalah online!
Menggunakan pengindeksan 1, mendapat bilangan bulat yang tidak ditandatangani sebagai input. Pengembalian
0
karena tidak ditemukan.sumber
33
untuk input4294967295
(2^32-1
, setara 32-bit unsigned of-1
)Jelly , 12 byte
Tautan monadik, mengambil bilangan bulat, menggunakan opsi yang tidak ditandatangani dan mengembalikan hasil 1-diindeks (mengembalikan 0 bila tidak ada).
Cobalah online!
atau
Coba itu
Bagaimana?
1.
2.
sumber
kode mesin x86_64,
3432 byteTidak yakin apakah ini pendekatan yang tepat, cukup banyak byte (ternyata tidak ):
Cobalah online!
Terima kasih @CodyGray untuk
-2
byte.sumber
BSF
,BSR
,POPCNT
,BT
, dll Anatolyg telah mengajukan solusi sepanjang jalur tersebut . Saya belum memutuskan apakah itu bisa dikalahkan. :-por ecx, -1
,. Itu 3 byte, 1 byte lebih pendek dari XOR + NEG. Ini bukan trik yang bagus ketika tidak bermain golf karena memperkenalkan ketergantungan baca yang salah pada register tujuan, tetapi di sana Anda hanya menggunakanmov ecx, -1
dan menghabiskan 5 byte.8 , 149 byte
Kode yang dikomentari
Penggunaan dan output
sumber
R , 66 byte
membaca dari stdin; kembali
0
tanpa nol detik dan tempat sebaliknya.Cobalah online!
sumber