Integer positif dapat diencerkan dengan memasukkan 0
antara dua bit dalam ekspansi binernya. Ini berarti bahwa n
nomor-bit memiliki n-1
pengenceran, yang tidak harus semuanya berbeda.
Misalnya, untuk 12
(atau 1100
dalam biner), pengencerannya
11000 = 24
^
11000 = 24
^
10100 = 20
^
Dalam tantangan ini, kita akan mengambil jumlah semua pengenceran, tidak termasuk nomor aslinya. Untuk 12
, dengan mengambil jumlah 24, 24, 20
hasil 68
, jadi 68
harus menjadi output untuk 12
.
Tantangan
Dengan bilangan bulat positif n > 1
sebagai input, output / kembalikan jumlah yang dilusian seperti dijelaskan di atas.
Contohnya
in out
--- ---
2 4
3 5
7 24
12 68
333 5128
512 9216
Aturan
- Input dan output dapat dianggap sesuai dengan tipe integer asli bahasa Anda.
- Input dan output dapat diberikan dalam format apa pun yang nyaman .
- Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
- Celah standar dilarang.
- Ini adalah kode-golf sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
code-golf
arithmetic
number-theory
binary
AdmBorkBork
sumber
sumber
Jawaban:
Python 2 ,
4339 byteCobalah online!
Bagaimana?
Setiap panggilan fungsi rekursif menghitung pengenceran tunggal. Posisi yang dimasukkan
0
adalahlog2(i)
. Fungsi berulang hinggai
menjadi lebih besar darin
dan penyisipan akan berada di sebelah kiri nomor tersebut. Jikai>n
,n/i
mengevaluasi0
, yang merupakan nilai palsu dalam Python.n*2
menggeser seluruh angka satu digit biner ke kiri,n%i
ataun % 2**(position of insertion)
menghitung nilai bagian yang tidak boleh digeser ke kiri. Nilai ini akan dikurangkan dari angka yang digeser.Contoh (n = 7)
sumber
Jelly , 11 byte
Cobalah online!
Bagaimana itu bekerja
sumber
MATL , 13 byte
Cobalah di MATL Online! Atau verifikasi semua kasus uji .
Penjelasan
Pertimbangkan input
12
sebagai contoh.sumber
C,
5856 byteTerima kasih kepada @Dennis karena telah menghemat dua byte!
Cobalah online!
C (gcc) , 50 byte
Mengembalikan oleh
k=s;
adalah perilaku yang tidak terdefinisi, tetapi bekerja dengan gcc saat optimisasi dinonaktifkan. Juga,n%k+n/k*(k+=k)
memiliki perilaku yang tidak ditentukan , tetapi tampaknya berfungsi baik dengan gcc.Cobalah online!
sumber
s,k;f(n){for(s=0,k=2;k<=n;)s+=n%k+n/k*(k*=2);return s;}
(55 byte)n%k
ataun/k*(k*=2)
.for(s=0,k=2;k<=n;)s+=n%k+n/k*(k*=2);return s;
sepenuhnya baik-baik saja, dann%k
akan selalu dievaluasi sebelumn/k*(k*=2)
dann/k
juga akan dievaluasi sebelumnyak*=2
. Terima kasih untuk penjelasannya. (Saya akan menghapus beberapa komentar saya sekarang untuk mengurangi kekacauan.)Jelly ,
98 byteCobalah online!
Begitu juga sebaliknya
B¹ƤṖ+BḄS
,: dapatkan awalan, jatuhkan yang terakhir, tambahkan ke input, dan jumlah.sumber
J ,
20 1514 byteCobalah online.
15 byte
Cobalah online!
sumber
Japt ,
1211 byteCobalah
Penjelasan
sumber
JavaScript (ES6),
4140 byteDisimpan 1 byte berkat Mr.Xcoder
Uji kasus
Tampilkan cuplikan kode
sumber
Retina ,
535047 byteCobalah online! Tautan termasuk kasus uji. Sunting: Disimpan 3 byte berkat @MartinEnder. Penjelasan:
Konversi dari desimal ke biner, tetapi menggunakan O untuk merepresentasikan 0, karena itu bukan digit, dan _ untuk mewakili 1, karena itu adalah karakter pengulangan default di Retina 1.
Masukkan O di antara setiap pasangan digit, dan kumpulkan hasilnya sebagai daftar.
Konversi dari biner ke unary. (Konversi ini menghasilkan ekstra
O
, tetapi kami tidak peduli.)Jumlahkan dan konversikan ke desimal.
sumber
%
. Jika lebih rumit, Anda akan membutuhkan sesuatu seperti/[O_]+/_
.Pyth , 13 byte
Coba di sini!
Penjelasan
sumber
Jelly , 10 byte
Cobalah online!
Bukan yang terpendek saat ini, tetapi bisa jadi jika ada jalan keluar
Bµ µḄ
...Penjelasan
Pada dasarnya, ini bekerja dengan mengalikan setiap digit biner dengan angka ajaib. Saya tidak bisa menjelaskannya tanpa memvisualisasikannya, jadi inilah angka biner yang akan kami kerjakan:
Seperti yang dijelaskan oleh tantangan, dia menampilkan yang kita inginkan adalah jumlah dari angka-angka biner ini:
Namun, kita tidak benar-benar harus memasukkan angka nol: Atom "tidak biner" Jelly akan menerima nomor selain dari
0
dan1
. Ketika kita membiarkan diri kita untuk menggunakan2
, pola ini menjadi lebih sederhana:Ketika kita meringkas digit di setiap kolom, kita dapatkan
Trik yang digunakan jawaban ini adalah untuk menghasilkan pola ini, dan gandakan setiap digit dengan angka yang sesuai dalam aslinya untuk membatalkan kolom yang diperlukan. 12, misalnya, akan direpresentasikan sebagai
sumber
Java 8, 55 byte
Port of Steadybox menjawab , dan bermain golf 3 byte dalam proses.
Cobalah online.
sumber
Sekam ,
1312 byte-1 byte terima kasih kepada @Mr. Xcoder!
Cobalah online!
Penjelasan
sumber
05AB1E , 14 byte
Cobalah online!
sumber
Pip ,
2118 byteCobalah online!
Penjelasan
Hubungi nomor input kami
a
. Untuk setiap indeks bineri
di mana kita ingin memasukkan nol, kita dapat menghitung bit yang tersisa dari titik penyisipan sebagaia // 2**i
(di mana//
adalah pembagian integer dan**
eksponensial), bit kanan dari titik penyisipan sebagaia % 2**i
, dan oleh karena itu bilangan bulat yang dilusi sebagai2 * (a // 2**i) * 2**i + (a % 2**i)
. Tetapi(a // 2**i) * 2**i
sama dengana - (a % 2**i)
, sehingga kita dapat mengatur ulang ke rumus yang lebih pendek:2 * (a - a % 2**i) + a % 2**i
=2 * a - a % 2**i
.sumber
R ,
14148 byteCobalah online!
Entah saya melakukan sesuatu yang benar-benar salah atau R hanya mengerikan pada manipulasi bit.Pendekatan Porting Luis Mendo mudah, benar, dan golf.Tetapi jika Anda benar-benar hanya ingin muck sekitar dengan operasi bit, MickyT menyarankan byter 105 berikut:
Cobalah online!
sumber
Python 3,
928078 byteCobalah secara Online
Terima kasih kepada Mr.XCoder dan ovs untuk masing-masing -12 byte dan -2 byte.
sumber
Batch,
9277 byteSunting: Beralih ke rumus yang sama dengan yang digunakan orang lain.
sumber
Jelly , 14 byte
Cobalah online!
sumber
Perl 5 , 36 +1 (
-p
) = 37 byteCobalah online!
sumber
Attache , 57 byte
Cobalah online!
Saya pikir saya akan mendekati masalah dari pendekatan manipulasi non-bit, karena pendekatan seperti itu tidak praktis di Attache. Saya harus menyelidiki beberapa bagian dari pendekatan ini sebagai alternatif.
Penjelasan
Ini adalah versi yang diperluas:
Ini hanya mengambil representasi biner dari angka, membaginya pada titik-titik tertentu, memasukkan nol di sana, mengkonversi kembali ke desimal, dan menjumlahkannya bersama-sama.
sumber
J , 33 byte
Kemungkinan besar ada banyak ruang untuk bermain golf lebih lanjut.
Bagaimana?
@#:
dikonversi ke biner dan<@}.\.
- temukan semua cukup, letakkan digit pertama dari masing-masing dan kotak<\
- temukan semua awalan dan kotak mereka(,0;])"0
- untuk setiap awalan, tambahkan 0 lalu tambahkan akhiran pemenggalan yang sesuai;@
meruntuhkan (unbox)1#.[:}:#.@
- Konversi ke desimal, kurung dan jumlahCobalah online!
sumber