Tantangan ini sederhana, diberi angka desimal, dikonversi ke biner, dan hitung jumlah sub-string dari angka biner, yang panjangnya lebih pendek dari angka aslinya. Berikut ini sebuah contoh:
Input:
11
Binary:
11 -> 1011
Substrings:
101 = 5
011 = 3
10 = 2
01 = 1
11 = 3
1 = 1
0 = 0
1 = 1
1 = 1
Sum:
5+3+2+1+3+1+0+1+1=17
Output:
17
Program Anda harus mengambil bilangan bulat desimal tunggal sebagai input dan output jumlah dari sub-string biner, seperti yang terlihat di atas. Anda dapat mengasumsikan input akan selalu memiliki lebih dari dua digit dalam representasi binernya dan bahwa input tidak akan menyebabkan kesalahan selama eksekusi program Anda.
Ini adalah kode-golf , kode terpendek dalam byte yang menang!
Kasus uji:
2 => 1
3 => 2
4 => 3
5 => 5
6 => 7
7 => 9
8 => 7
9 => 10
10 => 14
11 => 17
code-golf
base-conversion
binary
subsequence
GamrCorps
sumber
sumber
Jawaban:
Jelly,
107 byteCobalah online!
Bagaimana itu bekerja
sumber
Pyth, 10
Cobalah secara online atau jalankan Test Suite
Penjelasan:
sumber
CJam,
2721 byteShoutout to Dennis karena telah membantu saya menghemat 6 byte!
Hanya berfungsi dengan versi terbaru CJam (tersedia di TIO). Cobalah online !
Versi lama:
Cobalah online .
sumber
Python 3, 111 karakter
EDIT : Penjelasan:
Konversikan string input ke int, lalu int ke string biner dan hapus dua karakter pertamanya, karena
bin
metode mengembalikan string dalam format0b...
Ambil semua substring dari string biner, ubah menjadi desimal menggunakan
int(n, 2)
dan jumlahkan.adalah daftar semua substring. Versi tidak disatukan:
Semoga ini membantu.
sumber
CJam (22 byte)
Ini satu byte lebih panjang dari jawaban CJam terbaik saat ini, tetapi pendekatannya mungkin dapat disesuaikan dengan beberapa bahasa lain yang cukup menguntungkan.
Demo online
Analisis
Misalkan pertanyaannya adalah
tanpa sedikitpun
Maka itu tidak terlalu sulit untuk menunjukkan bahwa bit yang paling signifikan terjadi dengan berat total di
1*(2^B-1)
manaB
jumlah bit; bit kedua paling signifikan terjadi dengan berat total2*(2^(B-1)-1)
; turun ke bit-B paling signifikan, yang terjadi dengan berat totalB*(2^1-1)
.Mempertimbangkan sekarang pengurangan dari jumlah aslinya
x
,, kita berakhir dengan jumlahPembedahan
Konversi ke basis 2 memberikan bagian pertama dari jumlah utama plus
x
; ke base 1 memberikan bagian kedua plusx
; dan untuk basis 0 memberi adilx
, jadi kurangi basis-1 dari basis-2x
s batalkan, dan kurangi basis-0 memberikan hasil yang diinginkan.sumber
JavaScript (ES6), 78 byte
Bagian luar
map
membangun substring terkemuka darin
representasi biner; bagian dalam mengekstraksi substring trailing dari substring terkemuka, sehingga mencakup semua substring yang mungkin, termasuk representasi biner asli.Setiap substring dikonversi dari biner kembali ke desimal dan dikurangkan dari input asli karena ini sedikit lebih pendek daripada menambahkannya bersama-sama dan mengurangi input asli.
sumber
Mathematica,
7370 byteFungsi. Integer-> Integer
sumber
Retina , 64
Cobalah online!
Deskripsi tingkat tinggi tahap demi tahap: konversi desimal ke unary, unary ke binary, dapatkan awalan, dapatkan akhiran awalan, buang angka asli, konversi biner ke unary, kembalikan hitungan. Saya akan menulis deskripsi yang lebih terperinci begitu saya selesai bermain golf, banyak dari tahapan ini tampak mencurigakan ...
sumber
C, 71 byte
Kami mempertahankan akumulator
a
dan maskerm
. Topeng dimulai pada 1 dan mendapat satu sedikit lebih lama setiap kali di sekitar lingkaran luar. Di loop dalam, salinani
input secara berturut-turut digeser ke kanan sampai lebih pendek dari mask, mengakumulasi nilai masking setiap kali.Program uji
Uji keluaran
sumber
C #, 148 byte
Atau, jika saya menambahkan Impor "menggunakan System.Math statis;" lalu 138 dengan
Bahasa OOP seperti C # tidak akan memenangkan perlombaan seperti itu, tetapi saya tetap ingin mencobanya. Berikut ini adalah versi + tester yang lebih dipercantik.
Do-while yang bersarang menambahkan nilai bergeser ke kanan dari iTemp (setelah menugaskannya) selama shift + 1 lebih kecil dari pos. Baris berikutnya menghitung nilai bergeser iPrev berikutnya
x1 dan x2 menghitung mask, x3 menerapkannya dan kemudian menggesernya, karena digit terakhir selalu turun. Untuk 11, tampilannya seperti ini:
sumber
PowerShell v2 +, 138 Bytes
Ooof. Konversi ke / dari biner itu mahal.
Mengambil input
$a
, lalu menggunakan panggilan .NET[convert]::ToString($a,2)
untuk mengubahnya menjadi representasi biner. Dari sana, kita melewati dua loop - yang pertama dihitung mundur dari ujung string ke bawah1
, dan yang kedua dihitung ke atas dari0
. (Yang pertama adalah berapa lama substring untuk menarik keluar, dan yang kedua adalah indeks di mana dalam string untuk memulai substring.) Kami menetapkan helper di$l
sepanjang jalan untuk meneruskannya ke loop dalam.Di dalam lingkaran dalam, kami menggunakan panggilan .NET
[convert]::ToInt32()
lain untuk mengonversi yang sesuai.substring()
dari basis2
menjadi integer. Masing-masing kemudian dibiarkan dalam pipa. Kami merangkum semua itu dengan parens()
dan-join
mereka bersama-sama dengan+
, lalu melemparkannya keiex
(kependekan dariInvoke-Expression
dan sejenisnyaeval
).saya pikir ini secara teknis membutuhkan v2 atau yang lebih baru untuk benar memanggil panggilan NET.
sumber