hitung yang ada dalam jangkauan

20

Tantangan:

Hitung jumlah yang 1dalam representasi biner dari semua angka antara rentang.


Memasukkan :

Dua bilangan bulat positif non-desimal


Keluaran:

Jumlah semua 1s dalam kisaran antara dua angka.


Contoh:

4 , 7        ---> 8
4  = 100 (adds one)   = 1
5  = 101 (adds two)   = 3
6  = 110 (adds two)   = 5
7  = 111 (adds three) = 8

10 , 20     ---> 27
100 , 200   ---> 419
1 , 3       ---> 4
1 , 2       ---> 2
1000, 2000  ---> 5938

Saya hanya menjelaskan contoh pertama jika tidak akan memakan banyak ruang jika saya mencoba menjelaskan semuanya.


Catatan :

  • Angka dapat dipisahkan lebih dari 1000
  • Semua input akan valid.
  • Output minimum akan menjadi satu.
  • Anda dapat menerima angka sebagai array dari dua elemen.
  • Anda dapat memilih bagaimana nomor-nomor tersebut disusun.

Kriteria menang:

Ini adalah sehingga kode terpendek dalam byte untuk setiap bahasa menang.

Muhammad Salman
sumber
1
OEIS A000788
Leaky Nun
1
Bolehkah kita mengambil input sebagai semacam jenis rentang ( IntRangedi Kotlin, Rangedi Ruby)?
snail_
Fun Fakta: kasus 1000 - 2000menghasilkan 5938, tetapi menurunkan kasus dengan 1000, hasilnya juga tetes dengan 1000: 0-1000 = 4938. Bukti
steenbergh

Jawaban:

9

JavaScript (ES6), 38 byte

Mengambil input dalam sintaks currying (a)(b).

a=>b=>(g=c=>a>b?0:1+g(c^c&-c||++a))(a)

Cobalah online!

Berkomentar

a => b => (         // given the input values a and b
  g = c =>          // g = recursive function taking c = current value
    a > b ?         // if a is greater than b:
      0             //   stop recursion and return 0
    :               // else:
      1 +           //   add 1 to the final result
      g(            //   and do a recursive call to g() with:
        c ^ c & -c  //     the current value with the least significant bit thrown away
        || ++a      //     or the next value in the range if the above result is 0
      )             //   end of recursive call
)(a)                // initial call to g() with c = a
Arnauld
sumber
6

Python 2 , 47 byte

f=lambda x,y:y/x and bin(x).count('1')+f(x+1,y)

Cobalah online!

Dennis
sumber
1
Trik >=
cerdas
5

Java (JDK 10) , 55 byte

a->b->{int c=0;for(;a<=b;)c+=a.bitCount(b--);return c;}

Cobalah online!

Olivier Grégoire
sumber
IntStream.range(a,b+1).map(Integer::bitCount).sum()
saka1029
@ saka1029 Impor wajib. Jadi sebenarnya a->b->java.util.stream.IntStream.range(a,b+1).map(Integer::bitCount).sum(), untuk keseluruhan 74 byte. Bahkan jika impor itu tidak wajib, parameternya adalah, jadi kita harus menulis a->b->IntStream.range(a,b+1).map(Integer::bitCount).sum(), yang dihitung sebagai 57 byte
Olivier Grégoire
Anda juga bisa memiliki a->b->IntStream.range(a,b+1).map(Long::bitCount).sum()peningkatan 1 byte. Marjinal, tapi masih satu.
NotBaal
@NotBaal Seperti disebutkan oleh Olivier dalam komentar di atas, impor adalah wajib, jadi seharusnya a->b->java.util.stream.IntStream.range(a,b+1).map(Long::bitCount).sum()(71 byte).
Kevin Cruijssen
4

05AB1E , 4 byte

ŸbSO

Cobalah online!

Tuan Xcoder
sumber
Tepatnya solusi yang saya dapatkan :). +1.
Magic Gurita Guci
4

MATL , 5 4 byte

&:Bz

Cobalah online!

Terima kasih kepada Luis Mendo karena telah menghemat satu byte!

(implicit input a and b, a<b)
&:                              % two-element input range, construct [a..b]
  B                             % convert to Binary as a logical vector (matrix)
   z                            % number of nonzero entries
(implicit output of the result)

Giuseppe
sumber
4

R , 41 34 byte

function(a,b)sum(intToBits(a:b)>0)

Cobalah online!

Sangat terilhami oleh solusi R lainnya oleh ngm . Ini menggunakan pendekatan yang berbeda setelah konversi ke bit. Terima kasih banyak kepada Giuseppe untuk mengisyaratkan kemungkinan solusi 34 byte.

JayCe
sumber
34 byte adalah mungkin! Saya lupa di mana saya melihat triknya (saya tahu saya tidak menemukan itu) tetapi ada konversi yang lebih rumit ke sumvektor mable - Saya akan memposting jika Anda / ngm tidak dapat menemukannya.
Giuseppe
@Giuseppe Memang!
JayCe
2
Saya turun ke 37 byte menggunakan teknik yang mungkin berguna. Juga menemukan itu sddan varmemaksa apa pun yang mereka bisa gandakan.
ngm
Anda dapat menggunakan pryr::funtuk menyimpan 4 byte: tio.run/##K/qfZvu/…
pajonk
@pajonk poin bagus! Tapi saya mencoba untuk tetap pada paket R dasar daripada R + pryr. Saya akan mencari di meta apa yang dapat dianggap "R murni".
JayCe
3

Jelly , 4 byte

rBFS

Cobalah online!

Penjelasan

rBFS - Program lengkap. Mengambil dua input dari argumen baris perintah.
r - Rentang.
 B - Untuk masing-masing, konversikan ke biner.
  FS - Ratakan dan jumlahkan.
Tuan Xcoder
sumber
O_o, itu cepat?
Muhammad Salman
@MuhammadSalman Yah, tantangannya juga agak sepele.
Tn. Xcoder
Mungkin, tetapi jawaban satu menit setelah memposting.
Muhammad Salman
1
@MuhammadSalman Ya, itu tidak terlalu cepat untuk tantangan sepele seperti ini; pengetahuan tentang Jelly juga terjadi. Upaya nyata dilakukan misalnya bahasa bulan ini, QBasic. ;-)
Erik the Outgolfer
@EriktheOutgolfer: Bisakah Anda menjawab ini dalam QBasic / BrainF ** k?
Muhammad Salman
3

Python 3 , 56 54 52 byte

Ini bisa golf lebih imo. -2 Bytes terima kasih kepada Mr.Xcoder -2 More bytes terima kasih kepada MI Wright

lambda a,b:''.join(map(bin,range(a,b+1))).count('1')

Cobalah online!

Cookie Kincir Angin
sumber
2

Bash + utilitas umum, 50

jot -w%o - $@|tr 247356 1132|fold -1|paste -sd+|bc

Cobalah online!

Mengubah bilangan bulat menjadi string biner selalu sedikit menyakitkan di bash. Pendekatan di sini sedikit berbeda - ubah bilangan bulat menjadi oktal, lalu ganti setiap digit oktal dengan jumlah biner 1s yang dikandungnya. Lalu kita bisa menjumlahkan semua digit yang dikonversi

Trauma Digital
sumber
2

APL + WIN, 33 26 byte

Anjuran untuk vektor bilangan bulat:

+/,((↑v)⍴2)⊤(1↓v)+0,⍳-/v←⎕

Cobalah online! Atas perkenan Dalog Classic

Penjelasan:

v←⎕ prompt for input of a vector of two integers max first

(v←1↓v)+0,⍳-/ create a vector of integers from min to max

(↑v)⍴2 set max power of 2 to max 

⊤ convert integers to a matrix of binaries

+/, convert matrix to a vector and sum
Graham
sumber
2

R , 44 40 37 byte

function(a,b)sum(c(0,intToBits(a:b)))

Cobalah online!

Sebelumnya:

function(a,b)sum(strtoi(intToBits(a:b)))
function(a,b)sum(as.integer(intToBits(a:b)))
ngm
sumber
2

Oktaf dengan kotak alat Komunikasi, 21 byte

@(a,b)nnz(de2bi(a:b))

Cobalah online!

Kode harus cukup jelas. Jumlah elemen bukan nol dalam representasi biner dari masing-masing angka dalam kisaran.

Ini akan @(a,b)nnz(dec2bin(a:b)-48)tanpa kotak alat komunikasi.

Stewie Griffin
sumber
1

Sekam , 4 byte

Σṁḋ…

Cobalah online!

Penjelasan

Σṁḋ…
   …     Get the (inclusive) range.
 ṁḋ      Convert each to binary and concatenate.
Σ        Get the sum.

sumber
1

Ruby , 38 byte

->a,b{("%b"*(b-a+1)%[*a..b]).count ?1}

Cobalah online!

GB
sumber
1

PHP, 97 Bytes

(yakin ini bisa dipersingkat, tetapi ingin menggunakan fungsi)

Cobalah online

Kode

<?=substr_count(implode(array_map(function($v){return decbin($v);},
 range($argv[0],$argv[1]))),1);

Penjelasan

<?=
 substr_count(   //Implode the array and count every "1"
  implode(
    array_map(function($v){return decbin($v);}, //Transform every decimal to bin
          range($argv[0],$argv[1])   //generate a range between the arguments
     )
),1);   //count "1"'s
Francisco Hahn
sumber
sepertinya Anda bisa melakukan ini
dzaima
Untuk sesaat saya benar-benar lupa bahwa Anda dapat mengatur nama fungsi php secara langsung sebagai parameter :-(
Francisco Hahn
$argv[0]adalah nama program atau "-"; Anda harus bekerja dengan $argv[1]dan $argv[2]. Dan Anda dapat menggunakan joinalih-alih implode, mempersingkat ini menjadi 68 byte:<?=substr_count(join(array_map(decbin,range($argv[1],$argv[2]))),1);
Titus
1

PowerShell , 72 byte

param($x,$y)$x..$y|%{$o+=([convert]::ToString($_,2)-replace0).length};$o

Cobalah online!

Lama karena konversi ke biner [convert]::ToString($_,2)dan menyingkirkan nol -replace0. Kalau tidak, kita hanya mengambil angka-angka input, membuat rentang $x..$ydan untuk setiap angka dalam rentang mengubahnya menjadi biner, menghapus nol, mengambilnya .length(yaitu, jumlah yang tersisa), dan menambahkannya ke $output kami .

AdmBorkBork
sumber
coba gunakan countsebagai gantinya length:)
mazzy
1
@ Mazzy countakan selalu 1karena kita menghitung lengthstring, bukan array.
AdmBorkBork
tali! kamu benar. Terima kasih. -replace0itu pintar.
mazzy
1

Pip , 10 byte

$+JTB:a\,b

Cobalah online!

Penjelasan

            a and b are command-line args (implicit)
      a\,b  Inclusive range from a to b
   TB:      Convert to binary (: forces TB's precedence down)
  J         Join into a single string of 1's and 0's
$+          Sum (fold on +)
DLosc
sumber
1

Arang , 10 byte

IΣ⭆…·NN⍘ι²

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

     NN     Input numbers
   …·       Inclusive range
  ⭆         Map over range and join
        ι   Current value
         ²  Literal 2
       ⍘    Convert to base as string
 Σ          Sum of digits
I           Cast to string
            Implicitly print
Neil
sumber
1

Brachylog , 8 byte

⟦₂ḃᵐcọht

Cobalah online!

Penjelasan

⟦₂         Ascending range between the two elements in the input
  ḃᵐ       Map to base 2
    c      Concatenate
     ọ     Occurrences of each element
      h    Head: take the list [1, <number of occurrences of 1>]
       t   Tail: the number of occurrences of 1
Fatalisasi
sumber
1

K (ngn / k) , 19 13 byte

{+//2\x_!1+y}

Cobalah online!

{ }adalah fungsi dengan argumen xdany

!1+y adalah daftar 0 1 ... y

x_ menjatuhkan elemen x pertama

2\ mengkodekan setiap int sebagai daftar digit biner dengan panjang yang sama (ini khusus untuk ngn / k)

+/ jumlah

+//jumlah hingga konvergensi; dalam hal ini jumlah dari jumlah semua daftar digit biner

ngn
sumber
1

Perl 6 , 32 30 byte

-1 byte, terima kasih kepada Brad Gillbert

{[…](@_)>>.base(2).comb.sum}

Cobalah online!

Penjelasan:

[…](@_)    #Range of parameter 1 to parameter 2
       >>    #Map each number to
                      .sum  #The sum of
                 .comb      #The string of
         .base(2)    #The binary form of the number
Jo King
sumber
1
Anda dapat menguranginya dengan satu byte jika Anda menggunakannya [...](@_)sebagai ganti($^a..$^b)
Brad Gilbert b2gills
1

J , 16, 15 14 byte

1 byte disimpan berkat FrownyFrog!

+/@,@#:@}.i.,]

Cobalah online!

Penjelasan:

Kata kerja diad, argumen kiri adalah batas bawah mkisaran, yang kanan - atas n.

            ,    append                      
             ]   n to the
          i.     list 0..n-1
         }.      drop m elements from the beginning of that list 
      #:@        and convert each element to binary 
    ,@           and flatten the table
 +/@             and find the sum
Galen Ivanov
sumber
Bisakah Anda membuatnya 14?
FrownyFrog
@FrownyFrog Saya akan coba hari ini (tampaknya itu mungkin, karena Anda bertanya :))
Galen Ivanov
@FrownyFrog 15 untuk saat ini, saya masih mencoba ...
Galen Ivanov
1
14
FrownyFrog
@FrownyFrog Aah, sangat mudah! Saya berpikir tentang }.tetapi selalu di persimpangan dan tidak di kail. Terima kasih!
Galen Ivanov
1

QBasic, 95 93 83 82 byte

@ Docosc menyelamatkan saya beberapa banyak byte!

Disimpan byte lain menggunakan teknik ini !

INPUT a,b
FOR i=a TO b
k=i
FOR j=i TO 0STEP-1
x=k>=2^j
s=s-x
k=k+x*2^j
NEXT j,i
?s

Bahasa Bulan Ini FTW!

Penjelasan

INPUT a,b           Ask user for lower and upper bound
FOR i=a TO b        Loop through that range
k=i                 we need a copy of i to not break the FOR loop
FOR j=i TO 0STEP-1  We're gonna loop through exponents of 2 from high to low.
                    Setting the first test up for 4 to 2^4 (etc) we know we're overshooting, but that 's OK
x=k>=2^j            Test if the current power of 2 is equal to or smaller than k 
                    (yields 0 for false and -1 for true)
s=s-x               If k is bigger than 2^j, we found a 1, so add 1 to our running total s
                    (or sub -1 from the total s...)
k=k+x*2^j           Lower k by that factor of 2 if the test is true, else by 0
NEXT                Test the next exponent of 2
NEXT                process the next number in range
?s                  print the total

Testcase terakhir dari 1000 hingga 2000 benar-benar berfungsi, di QBasic 4.5 berjalan di Dosbox: Het doet het!

steenbergh
sumber