Urutan berikutnya adalah urutan apa pun yang dapat Anda peroleh dari yang lain dengan menghapus jumlah karakter apa pun. The subsequences non-kosong yang berbeda dari 100
yang 0
, 1
, 00
, 10
, 100
. The subsequences non-kosong yang berbeda dari 1010
yang 0
, 1
, 00
, 01
, 10
, 11
, 010
, 100
, 101
, 110
, 1010
.
Tulis program atau fungsi yang diberi bilangan bulat positif n mengembalikan jumlah akhiran non-kosong yang berbeda dari ekspansi biner n .
Contoh: karena 4
berada 100
dalam biner, dan kami melihat bahwa ia memiliki lima urutan non-kosong yang berbeda di atas, jadi f(4) = 5
. Mulai dari n = 1 , urutan dimulai:
1, 3, 2, 5, 6, 5, 3, 7, 10, 11, 9, 8, 9, 7, 4, 9, 14, 17, 15, 16, 19, 17, 12
Namun, program Anda harus bekerja untuk n < 250 dalam waktu kurang dari satu detik pada mesin modern apa pun. Beberapa contoh besar:
f(1099511627775) = 40
f(1099511627776) = 81
f(911188917558917) = 728765543
f(109260951837875) = 447464738
f(43765644099) = 5941674
Jawaban:
Python 3 ,
95 byte83 byte[-12 byte terima kasih kepada Mr.XCoder :)]
Cobalah online!
Catatan tentang algoritme. Algoritma menghitung kenaikan dalam urutan unik yang diberikan oleh bit pada posisi yang diberikan t. Peningkatan untuk bit pertama selalu 1. Algoritma kemudian berjalan di atas urutan bit s (t) dan menambahkan kenaikan v [s (t)]. Pada setiap langkah, kenaikan untuk komplemen dari s (t), v [1 - s (t)] diperbarui ke v [1] + v [0]. Angka terakhir adalah jumlah semua kenaikan.
Ini harus dijalankan di O (log2 (n)), di mana n adalah nomor input.
sumber
JavaScript (ES6),
5351 byteUji kasus
Tampilkan cuplikan kode
Diformat dan dikomentari
Versi non-rekursif, 63 byte
Disimpan 3 byte berkat @ThePirateBay
Uji kasus
Tampilkan cuplikan kode
sumber
map
) ke variabel flagl
bukannya array kosong.Python 2 , 56 byte
Cobalah online!
Mengambil metode dari NofP .
59 byte secara berulang:
Cobalah online!
sumber
Jelly , 10 byte
Ini menggunakan peningkatan @ xnor ini di @ algoritma NofP ini .
Cobalah online!
Latar Belakang
Biarkan (a 1 , ..., a n ) menjadi urutan biner terbatas. Untuk setiap bilangan bulat non-negatif k ≤ n , tentukan o k sebagai jumlah urutan unik (a 1 , ..., a k ) yang kosong atau berakhir pada 1 , z k sebagai jumlah urutan unik yang kosong atau diakhiri dengan 0 .
Jelas, o 0 = z 0 = 1 , karena satu-satunya urutan dari urutan kosong adalah urutan kosong.
Untuk setiap indeks k , jumlah total urutan (a 1 , ..., a k ) adalah o k + z k - 1 (mengurangi 1 memperhitungkan fakta bahwa baik o k dan z k menghitung urutan kosong). Oleh karena itu, total jumlah non-kosong adalah o k + z k - 2 . Tantangannya meminta untuk menghitung o n + z n - 2 .
Setiap kali k> 0 , kita bisa menghitung o k dan z k rekursif. Ada dua kasus:
a k = 1
z k = z k-1 , karena (a 1 , ..., a k-1 ) dan (a 1 , ..., a k-1 , 1) memiliki urutan yang sama yang berakhir dengan 0 .
Untuk masing-masing o k - 1 subsequences non-kosong (a 1 , ..., a k ) yang berakhir pada 1 , kita dapat menghapus trailing 1 untuk mendapatkan salah satu o k-1 + z k-1 - 1 urutan (a 1 , ..., a k-1 ) . Sebaliknya, menambahkan sebuah 1 untuk masing-masing yang terakhir o k-1 + z k-1 - 1 urutan hasil di salah satu o k - 1 mantan urutan. Jadi, o k - 1 = ok-1 + zk-1 - 1 dan o k = o k-1 + z k-1 .
a k = 0
Demikian pula dengan kasus sebelumnya, kita memperoleh rumus rekursif o k = o k-1 dan z k = z k-1 + o k-1 .
Bagaimana itu bekerja
sumber
05AB1E , 12 byte
Cobalah online! Penjelasan: Seperti yang ditunjukkan oleh jawaban lain, jumlah urutan untuk string biner
a..y0
yang diakhiri dengan 1 sama dengan angka untuk string binera..y
, sedangkan angka yang diakhiri dengan0
adalah jumlah total urutan untuk biner stringa..y
(yang masing-masing mendapatkan0
akhiran) ditambah satu untuk0
dirinya sendiri. Tidak seperti jawaban lain saya tidak menyertakan urutan kosong karena ini menyimpan byte membangun keadaan awal.sumber
Java 8, 97 byte
Pelabuhan @xnor 's Python 2 answer , yang pada gilirannya merupakan peningkatan dari @NofP 's Python 3 answer .
Coba di sini.
Mungkin itu hal yang baik tag -waktu-terbatas hadir, karena saya awalnya memiliki yang berikut untuk menguatkan semua berikutnya:
Coba di sini.
Yang juga berhasil, tetapi terlalu lama untuk tiga kasus uji terakhir. Belum lagi itu jauh lebih lama (
208204 byte ).sumber
6502 kode mesin (C64), 321 byte
Demo online
Demo online dengan pengecekan kesalahan (346 bytes)
Penggunaan:,
sys49152,[n]
missys49152,911188917558917
.Pembatasan waktu dan kasus uji memerlukan solusi untuk menghitung dalam angka 64bit, jadi waktu untuk membuktikan C64 memenuhi syarat sebagai " mesin modern ";)
Tentu saja, ini membutuhkan sedikit kode, OS tidak menyediakan apa pun untuk bilangan bulat yang lebih luas dari 16bit. Bagian yang lumpuh di sini: ini adalah implementasi lain (sedikit dimodifikasi) dari resp algoritma NofP . Varian yang disempurnakan xnor . Terima kasih atas idenya;)
Penjelasan
Berikut daftar pembongkaran yang relevan dari komentar yang melakukan algoritme:
Sisanya adalah input / output dan mengkonversi antara string dan integer unsigned 64bit (little-endian) menggunakan beberapa algoritma double-dabble. Jika Anda tertarik, inilah keseluruhan sumber rakitan untuk versi dengan pemeriksaan kesalahan - versi "golf" ada di cabang "golf".
sumber