Masalah:
Temukan jumlah nol terkemuka di integer bertanda 64-bit
Aturan:
- Input tidak dapat diperlakukan sebagai string; itu bisa apa saja di mana operasi matematika dan bitwise mendorong algoritma
- Output harus divalidasi terhadap representasi bilangan bulat bertanda 64-bit, terlepas dari bahasa
- Aturan golf kode standar berlaku
- Kode terpendek dalam byte menang
Kasus uji:
Tes ini mengasumsikan bilangan bulat bertanda tangan dua pelengkap yang ditandatangani. Jika bahasa / solusi Anda kurang atau menggunakan representasi bilangan bulat bertanda tangan yang berbeda, harap sebutkan dan berikan kasus uji tambahan yang mungkin relevan. Saya telah memasukkan beberapa test case yang menangani presisi ganda, tetapi jangan ragu untuk menyarankan yang lain yang harus didaftar.
input output 64-bit binary representation of input (2's complement)
-1 0 1111111111111111111111111111111111111111111111111111111111111111
-9223372036854775808 0 1000000000000000000000000000000000000000000000000000000000000000
9223372036854775807 1 0111111111111111111111111111111111111111111111111111111111111111
4611686018427387903 2 0011111111111111111111111111111111111111111111111111111111111111
1224979098644774911 3 0001000011111111111111111111111111111111111111111111111111111111
9007199254740992 10 0000000000100000000000000000000000000000000000000000000000000000
4503599627370496 11 0000000000010000000000000000000000000000000000000000000000000000
4503599627370495 12 0000000000001111111111111111111111111111111111111111111111111111
2147483648 32 0000000000000000000000000000000010000000000000000000000000000000
2147483647 33 0000000000000000000000000000000001111111111111111111111111111111
2 62 0000000000000000000000000000000000000000000000000000000000000010
1 63 0000000000000000000000000000000000000000000000000000000000000001
0 64 0000000000000000000000000000000000000000000000000000000000000000
False
bukan0
?Jawaban:
bahasa mesin x86_64 di Linux, 6 byte
Membutuhkan Haswell atau K10 atau prosesor yang lebih tinggi dengan
lzcnt
instruksi.Cobalah online!
sumber
Hexagony ,
7870 byteCobalah online!
Bukankah tantangan ini terlalu sepele untuk bahasa praktis? ;)
panjang sisi 6. Saya tidak bisa memasangnya di sisi panjang 5 segi enam.
Penjelasan
sumber
Python , 31 byte
Cobalah online!
Ekspresi adalah bitwise
&
dari dua bagian:Ini
67-len(bin(-n))
memberikan jawaban yang benar untuk input non-negatif. Dibutuhkan panjang bit, dan kurangi dari 67, yaitu 3 lebih dari 64 untuk mengimbangi-0b
awalan. Negasi adalah trik untuk menyesuaikan untukn==0
menggunakan negasi itu tidak menghasilkan-
tanda di depan.Sebagai
& ~n>>64
gantinya, jawabannya adalah0
negatifn
. Kapann<0
,~n>>64
sama dengan 0 (pada bilangan bulat 64-bit), maka and-ing dengan itu memberi0
. Kapann>=0
,~n>>64
mengevaluasi ke-1
, dan melakukan&-1
tidak berpengaruh.Python 2 , 36 byte
Cobalah online!
Alternatif aritmetika.
sumber
Java 8,
3226 byte.Long::numberOfLeadingZeros
Dibangun FTW.
-6 byte terima kasih kepada Kevin Cruijssen
Cobalah online!
sumber
numberOfLeadingZeros
.. Anda dapat golf itu hingga 28 byte btw:n->n.numberOfLeadingZeros(n)
Long::numberOfLeadingZeros
bahkan lebih pendek (26 byte).C (gcc) , 14 byte
Bekerja dengan baik di tio
C (gcc) ,
3529 byteCobalah online!
Daripada Dennis untuk 6 byte
Bendera kompiler C (gcc) , 29 byte oleh David Foerster
Cobalah online!
sumber
__builtin_clzl
dengan yang saya dapat datang .long
32 bit (termasuk Windows x64), Anda perlu__builtin_clzll
(lama tidak ditandai). godbolt.org/z/MACCKf . (Tidak seperti Intel intrinsik, GNU C builtin didukung terlepas dari operasi yang dapat dilakukan dengan satu instruksi mesin. Pada 32-bit x86, clzll mengkompilasi ke cabang atau cmov untuk melakukanlzcnt(low half)+32
ataulzcnt(high half)
. Ataubsr
jikalzcnt
tidak tersedia.__builtin_clz(l)(l)
perilaku tidak terdefinisi untuk nol: "Jika x adalah 0, hasilnya tidak terdefinisi."Perl 6 ,
35 2826 byte-2 byte terima kasih kepada nwellnhof
Cobalah online!
Blok kode anonim yang mengambil nomor dan mengembalikan nomor. Ini mengubah angka menjadi string biner dan menghitung nol terkemuka. Ini berfungsi untuk angka negatif karena karakter pertama adalah
-
eg-00000101
, jadi tidak ada nol di depan.Penjelasan:
sumber
JavaScript (Node.js) , 25 byte
Mengambil input sebagai literal BigInt.
Cobalah online!
sumber
n=>n<1?0:n.toString(2)-64
melakukan hal yang sama?n=>n<1?0:n.toString(2).length-64
, tapi itu tidak akan berhasil. Ini akan , saya pikir..toString()
pendekatan yang berfungsi, tetapi kita masih membutuhkan BigInt literal sebagai input. Jika tidak, kami hanya memiliki 52 bit mantissa, yang mengarah ke hasil yang tidak valid ketika presisi hilang .Python 3 , 34 byte
Cobalah online!
sumber
J , 18 byte
Cobalah online!
J , 19 byte
Cobalah online!
Penjelasan:
sumber
1#.[:*/\1-_64{.#:
(17) dekat tetapi tidak berfungsi untuk angka negatif :(Perl 6 , 18 byte
-2 byte terima kasih kepada Jo King
Cobalah online!
sumber
Ruby , 22 byte
Cobalah online!
sumber
05AB1E ,
109 byteI / O keduanya bilangan bulat
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber
Haskell , 56 byte
Terima kasih xnor karena menemukan kesalahan!
Mungkin mengalokasikan banyak memori, coba online!
Mungkin Anda ingin mengujinya dengan konstanta yang lebih kecil: Coba 8-bit!
Penjelasan
mapM(pure[0,1])[1..64]
mapM(pure[1,0])[1..64]
sum.fst.span(>0)
sumber
Powershell, 51 byte
Skrip uji:
Keluaran:
sumber
Java 8, 38 byte
Masukkan sebagai
long
(integer 64-bit), output sebagaiint
(integer 32-bit).Port C (gcc) jawaban @ l4m2 .
Cobalah online.
Penjelasan:
EDIT: Dapat 26 byte dengan menggunakan builtin
Long::numberOfLeadingZeros
seperti yang ditampilkan dalam jawaban Java 8 @ lukeg .sumber
APL + WIN, 34 byte
Penjelasan:
sumber
C # (Visual C # Interactive Compiler) , 42 byte
Cobalah online!
C # (Visual C # Interactive Compiler) , 31 byte
Bahkan lebih pendek, didasarkan pada jawaban C (gcc) @ l4m2. Tidak pernah tahu bahwa Anda dapat mendeklarasikan fungsi seperti itu, terima kasih @Dana!
Cobalah online!
sumber
Jelly ,
109 byte-1 berkat trik yang rapi oleh Erik the Outgolfer (is-non-negative sekarang cukup
AƑ
)Tautan monadik yang menerima bilangan bulat (dalam kisaran) yang menghasilkan bilangan bulat.
Cobalah online! Atau lihat test-suite .
10 adalah
ḤBL65_ɓ>-×
Berikut ini adalah solusi 10 byte lain, yang saya suka karena katanya "BOSS" ...
Test-suite di sini
...
BoṠS63r0¤i
,,BoṠS63ŻṚ¤i
atauBoṠS64ḶṚ¤i
juga akan berfungsi.Lain byter 10 (dari Dennis) adalah
æ»64ḶṚ¤Äċ0
(lagiæ»63r0¤Äċ0
danæ»63ŻṚ¤Äċ0
juga akan bekerja)sumber
Ƒ
cepat sama sekali, kerja yang sangat bagus!AƑ
untuk beberapa waktu sekarang. Berhati-hatilah karena itu tidak membuat vektor! ;-) Ini sebenarnya "ratakan dan periksa apakah semua elemen tidak negatif".Perl 5 , 37 byte
Cobalah online!
Atau 46 byte ini jika "pengetatan" tidak diizinkan: sub z
sumber
s/length$&/$+[0]/
(-3 byte);)sub
kata kunci dari jawaban yang berisi fungsi Perl 5.sub
jawaban untuk bahasa lain, perl6, PowerShell dan banyak lagi.sub{}
membuat sub (anonim?), Yang menjelaskan mengapa itu dihilangkan dari jawaban Perl6. Saya setuju dengan @nwellnhof bahwa Anda tidak boleh menghapussub
. (ketika saya masih aktif, seperti setahun yang lalu atau lebih, itu aturannya)$+[0]
.Swift (pada platform 64-bit), 41 byte
Menyatakan penutupan yang disebut
f
menerima dan mengembalikanInt
. Solusi ini hanya bekerja dengan benar platform 64-bit, di manaInt
adalahtypealias
ed untukInt64
. (Pada platform 32-bit,Int64
dapat digunakan secara eksplisit untuk tipe parameter penutupan, menambahkan 2 byte.)Di Swift, bahkan tipe integer dasar adalah objek biasa yang dideklarasikan di pustaka standar. Ini berarti
Int
dapat memiliki metode dan properti, sepertileadingZeroBitCount
(yang diperlukan pada semua jenis yang sesuai denganFixedWidthInteger
protokol perpustakaan standar ).sumber
Haskell , 24 byte
Cobalah online!
Ini pada dasarnya sama dengan solusi Java Kevin Cruijssen, tetapi saya menemukannya secara mandiri.
Argumen tersebut harus memiliki tipe
Int
untuk build 64-bit, atauInt64
untuk apa pun.Penjelasan
Jika argumennya negatif, hasilnya langsung 0. Kalau tidak, kita bergeser ke kiri, mengisinya , sampai kita mencapai angka negatif. Pengisian itu memungkinkan kita menghindari kasus khusus untuk 0.
Hanya untuk referensi, inilah cara yang jelas / efisien:
34 byte
sumber
Bersih , 103 byte
Menggunakan " bawaan " yang sama dengan jawaban ceilingcat.
Cobalah online!
Bersih , 58 byte
Cobalah online!
sumber
Stax , 10 byte
Jalankan dan debug itu
Ini adalah port solusi 05AB1E Kevin.
sumber
Perl 5
-p
, 42 byteCobalah online!
Lebih lama dari solusi berbasis bitstring, tetapi solusi berbasis matematika yang layak.
sumber
int
panggilan yang harus menyelesaikan masalah.APL (NARS), 15 karakter, 30 byte
uji beberapa angka untuk melihat cara menggunakan:
sumber
Karat, 18 byte
Cobalah online!
sumber
K (ngn / k) , 6 byte
Cobalah online!
2\
menyandikan argumen dalam biner#
panjangnya64-
kurangi dari 64sumber
# = length
... tampak berbasis tali2\
memberikan daftar bilangan bulat dan#
menemukan panjangnya. tidak ada ikatan yang terlibat di sini.PHP,
5046 byteJalankan sebagai pipa dengan
-R
atau coba online ,<?=$argn<0?0:0|64-log($argn+1,2);
memiliki masalah pembulatan; jadi saya mengambil jalan panjang.sumber
Bahasa Wolfram (Mathematica) , 41 byte
Formula untuk angka positif adalah adil
63-Floor@Log2@#&
. Aturan penggantian digunakan untuk kasus khusus input nol dan negatif.Input tidak harus berupa integer bertanda 64-bit. Ini secara efektif akan mengambil dasar input untuk mengubahnya menjadi integer. Jika Anda memasukkan angka di luar batas normal untuk integer 64-bit, ia akan memberi tahu angka negatif yang menunjukkan berapa banyak bit yang diperlukan untuk menyimpan integer ini.
Cobalah online!
Solusi @ LegionMammal978 sedikit lebih pendek pada 28 byte. Input harus berupa bilangan bulat. Per dokumentasi: "
BitLength[n]
secara efektif merupakan versi efisienFloor[Log[2,n]]+1
." Secara otomatis menangani kasus nol pelaporan dengan benar0
daripada-∞
.Bahasa Wolfram (Mathematica) , 28 byte
Cobalah online!
sumber
Boole[#>=0](64-BitLength@#)&
sedikit lebih baik pada 28 byte. Ini menggunakan konsep dasar yang sama seperti milik Anda, tetapi berlakuBitLength
danBoole
.bitNumber - math.ceil (math.log (angka) / math.log (2))
mis. 64 bit NUMBER: 9223372036854775807 math.ceil (math.log (9223372036854775807) / math.log (2)) ANS: 63
sumber