terinspirasi oleh Count down from infinity
Diberikan bilangan bulat non-negatif N
, hasilkan jumlah pengulangan dari langkah-langkah berikut yang diperlukan untuk mencapai 0:
- Konversi
N
ke biner (4812390 -> 10010010110111001100110
) - Balik setiap bit (
10010010110111001100110 -> 01101101001000110011001
) - Potong nol di depan (
01101101001000110011001 -> 1101101001000110011001
) - Konversi kembali ke desimal (
1101101001000110011001 -> 3576217
)
Aturan
- Input dan output mungkin dalam format yang jelas dan konsisten
- Input akan berada dalam rentang bilangan bulat representatif asli untuk bahasa Anda (jika bahasa Anda mendukung bilangan bulat besar sewenang-wenang, tidak ada batasan)
Uji Kasus
0 -> 0
1 -> 1
42 -> 6
97 -> 3
170 -> 8
255 -> 1
682 -> 10
8675309 -> 11
4812390 -> 14
178956970 -> 28
2863311530 -> 32
Urutan ini adalah A005811 dalam OEIS.
~(~a) == a
Jawaban:
Jelly ,
64 byteCobalah online!atau verifikasi semua kasus uji .
Latar Belakang
Membiarkan n menjadi bilangan bulat non-negatif.
Langkah 2 dan 3 dari proses yang dijelaskan dalam spesifikasi dapat dinyatakan sebagai menghilangkan semua pelopor 1 's dan mengganti bit yang tersisa.
Ini berarti bahwa kami akan menghapus satu kelompok digit biner yang berdekatan dan sama di setiap iterasi, sehingga Panjang Countdown Biner dari n hanyalah jumlah grup ini dalam representasi biner dari n . Untuk keperluan tantangan ini, pikirkan 0 tidak memiliki digit.
Untuk n = 8675309 , prosesnya terlihat sebagai berikut dalam biner.
Alih-alih menghitung kelompok ini (yang akan gagal untuk kasus tepi 0 ), kami melakukan yang berikut.
n dan n: 2 memiliki representasi biner berikut.
Perhatikan bahwa representasi biner n: 2 sederhana n , bergeser sedikit ke kiri.
Jika kita XOR n dan n: 2 , kita akan mendapatkan 1 (MSB), dan 1 tambahan untuk setiap pasangan digit yang berdekatan berbeda. Dengan demikian jumlah grup sama dengan jumlah bit yang diset dalam n ⊻ n: 2 .
Bagaimana itu bekerja
sumber
Python 2, 30 byte
Uji di Ideone .
Latar Belakang
Biarkan n menjadi bilangan bulat non-negatif.
Langkah 2 dan 3 dari proses yang diuraikan dalam spesifikasi dapat dinyatakan sebagai menghapus semua leading 1 's dan mengganti bit yang tersisa.
Ini berarti bahwa kami akan menghapus satu kelompok digit biner yang berdekatan dan sama di setiap iterasi, sehingga Panjang Countdown Biner dari n hanyalah jumlah grup ini dalam representasi biner dari n . Untuk keperluan tantangan ini, anggap 0 tidak memiliki digit.
Untuk n = 8675309 , prosesnya terlihat sebagai berikut dalam biner.
Alih-alih menghitung grup ini (yang akan gagal untuk kasus tepi 0 ), kami melakukan yang berikut.
n dan n: 2 memiliki representasi biner berikut.
Perhatikan bahwa representasi biner n: 2 hanyalah n , bergeser sedikit ke kiri.
Jika kita XOR n dan n: 2 , kita akan mendapatkan 1 (MSB), dan 1 tambahan untuk setiap pasangan digit yang berdekatan berbeda. Dengan demikian jumlah grup sama dengan jumlah bit yang diset dalam n ⊻ n: 2 .
sumber
Python 2, 29 byte
Menghitung jumlah pergantian antara 0 dan 1 dalam ekspansi biner, menghitung per 1 sebagai pergantian. Lakukan dengan memeriksa apakah dua digit biner terakhir berbeda, lalu berulang ke nomor dengan digit terakhir dihapus. Dua digit terakhir berbeda persis jika
n%4
1 atau 2, yang dapat diperiksa sebagai-n%4/2
.sumber
JavaScript (ES6), 26 byte
Bekerja dengan menghitung transisi antara 0 dan 1. Hanya bekerja hingga 31 bit. 29 byte untuk mendukung 53 bit:
sumber
Haskell, 34 byte
sumber
05AB1E ,
75 byteDisimpan 2 byte berkat Dennis .
Tanpa kasus tepi 0 ini bisa 3 byte
bÔg
.Cobalah online! atau sebagai Test suite
Penjelasan
sumber
CJam , 14 byte
Cobalah online!
Pada dasarnya jawaban saya untuk pertanyaan lainnya.
sumber
Java 7,
112 108 100 9073 byteIde dasar
sumber
j=j/2
dapat disingkat menjadij/=2
. Terlepas dari itu, jawaban yang bagus!int c(int i){return i>0?((i^(i>>=1))%2+c(i):0;}
( 47 bytes ). Saya masih akan meninggalkan jawaban Anda saat ini juga, karena ini lebih asli, dan port dari pengguna lain adalah kebalikan dari yang asli. :)J, 14 byte
Menghitung jumlah run dalam digit biner dari n dengan case khusus menghasilkan 0 untuk n = 0.
Pemakaian
Penjelasan
sumber
CJam ,
1110 byteTerima kasih kepada @Dennis karena telah menghemat satu byte!
Cobalah online!
Penjelasan
sumber
e&
(logis DAN) menyimpan byte lebih\g*
.Racket 349 byte
Tidak Disatukan:
Pengujian:
Keluaran:
sumber
tl
danib
ke nama 1-byte.MATL , 7 byte
Cobalah online!
Penjelasan
sumber
Vim,
6259 byte-3 byte terima kasih kepada DJMcMayhem
Ini adalah output xxd dengan karakter yang tidak dapat dicetak utuh:
Cobalah online!
Penjelasan
sumber
:s/^0*
lebih pendek satu byte daripada:s/^0\+
, dan saat Anda berada di register "eval", Anda bisa melakukannyapr<S-tab>'%b',<C-r>")
untuk pelengkapan otomatis. (Menghemat 4 byte):s/^0*
karena cocok dengan garis kosong, dan saya perlu gagal untuk mengosongkan garis kosong untuk melarikan diri dari makro rekursif.Ruby, 26 byte
Terinspirasi oleh jawaban Python xnor.
sumber
PHP, 64 byte
berdasarkan solusi hitung mundur saya
mencetak waktu
1
karakterk
, di manak
jumlah iterasi.+4 byte untuk output integer: (output kosong untuk
0
)sumber
JavaScript (ES6), 44
Fungsi rekursif
Terbatas untuk javascript positive integer, 31 bit:
Mengelola angka presisi ganda hingga 53 bit signifikan - 59 byte:
Dengan cara lain: menggunakan algoritma luar biasa oleh @ Dennis, fungsi non rekursif mengelola hingga 53 bit, 43 byte:
sumber
PHP, 51 byte
Menggunakan regex untuk menghitung jumlah proses 1 atau 0. Sayangnya ini membutuhkan kasus khusus untuk input
0
yang memerlukan 3 byte tambahan (dan memberikan pemberitahuan).sumber
o
untuk menghindari pemberitahuan. b) Anda dapat menyimpan 3 byte dengan-F
flag dan$argn
bukannya$argv[1]
. c)/1+|0+/
harus cukup untuk regex.Java 7, 71 byte
int b(Long a){return a==0?0:1+b(~a&-1L>>>64-a.toString(a,2).length());}
Saya tahu ini dikalahkan oleh solusi Geobits
split
(yang nantinya akan diposting) tapi ini masih menyenangkan untuk ditulissumber
Oktaf, 47 byte
Menurut entri OEIS, nilai yang kami cari sebagai solusi untuk tantangan ini juga sama dengan jumlah
1
s dalam kode Gray untuk bilangan bulat yang diberikan.Wikipedia memberi tahu saya kode Gray dapat dihitung sebagai x ^ (x >> 1), jadi pada fungsi di atas saya menghitung kode Gray seperti itu, mengubahnya menjadi string biner, dan menghitung berapa digit dari string itu
1
.sumber
Java 7, 64 byte
Saya tahu ini bisa dikalahkan oleh port dari salah satu jawaban yang lebih baik, tetapi saya datang dengan itu dalam obrolan, dan saya tidak bisa mempostingnya setelah Poke mengatakan sesuatu tentang hal itu :)
sumber
C, 76 Bytes
Berfungsi untuk semua kasus uji (sebanyak yang saya tidak ingin memasukkan kata uji kasus unsigned atau terakhir) ...
sumber
Bash, 57 byte
Paket: Core Utililities, grep, sed, vim (untuk
xxd
)Asumsikan angka diberikan dalam format biner. Panjangnya bisa diterima :)
sumber
Perl 5 , 31 + 1 (
p
) = 32 byteCobalah online!
Menggunakan metode @ Dennis.
sumber
Tcl , 119 byte
Cobalah online!
Masih sangat ungolfed untuk seleraku
sumber