policz te w zasięgu

20

Wyzwanie:

Policz liczbę jedynek 1w binarnej reprezentacji wszystkich liczb między zakresem.


Wejście :

Dwie nie dziesiętne dodatnie liczby całkowite


Wyjście:

Suma wszystkich 1s w zakresie między dwiema liczbami.


Przykład:

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

Wyjaśniłem tylko pierwszy przykład, inaczej zajęłoby to dużo miejsca, gdybym spróbował wyjaśnić je wszystkie.


Uwaga :

  • Liczby mogą być oddzielone o ponad 1000
  • Wszystkie dane wejściowe będą prawidłowe.
  • Minimalna moc wyjściowa będzie wynosić jeden.
  • Możesz zaakceptować liczbę jako tablicę dwóch elementów.
  • Możesz wybrać sposób uporządkowania liczb.

Kryteria wygranej:

To jest więc wygrywa najkrótszy kod w bajtach dla każdego języka.

Muhammad Salman
źródło
1
OEIS A000788
Leaky Nun
1
Czy możemy przyjąć dane wejściowe jako rodzaj zakresu ( IntRangew Kotlinie, Rangew Rubim)?
snail_
Ciekawostka: case 1000 - 2000daje 5938, ale obniżają sprawy przez 1000, wynik spada również przez 1000: 0-1000 = 4938. Dowód
steenbergh

Odpowiedzi:

9

JavaScript (ES6), 38 bajtów

Pobiera dane wejściowe w składni curry (a)(b).

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

Wypróbuj online!

Skomentował

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
źródło
6

Python 2 , 47 bajtów

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

Wypróbuj online!

Dennis
źródło
1
Sprytna sztuczka, aby uniknąć >=...
Erik the Outgolfer
5

Java (JDK 10) , 55 bajtów

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

Wypróbuj online!

Olivier Grégoire
źródło
IntStream.range(a,b+1).map(Integer::bitCount).sum()
saka1029,
@ saka1029 Import jest obowiązkowy. A więc tak naprawdę a->b->java.util.stream.IntStream.range(a,b+1).map(Integer::bitCount).sum()przez całe 74 bajty. Nawet jeśli import nie był obowiązkowy, parametry są, więc musielibyśmy napisać a->b->IntStream.range(a,b+1).map(Integer::bitCount).sum(), co liczy się jako 57 bajtów
Olivier Grégoire
Możesz także a->b->IntStream.range(a,b+1).map(Long::bitCount).sum()ulepszyć o 1 bajt. Marginalna, ale wciąż jedna.
NotBaal
@NotBaal Jak wspomniał Olivier w powyższym komentarzu, importowanie jest obowiązkowe, więc powinno być a->b->java.util.stream.IntStream.range(a,b+1).map(Long::bitCount).sum()(71 bajtów).
Kevin Cruijssen
4

05AB1E , 4 bajty

ŸbSO

Wypróbuj online!

Pan Xcoder
źródło
Dokładnie takie rozwiązanie mam :). +1.
Magic Octopus Urn
4

MATL , 5 4 bajtów

&:Bz

Wypróbuj online!

Dzięki Luis Mendo za uratowanie bajtu!

(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
źródło
4

R , 41 34 bajtów

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

Wypróbuj online!

Mocno zainspirowany innym rozwiązaniem R. autorstwa ngm . To stosuje inne podejście po konwersji na bity. Ogromne podziękowania dla Giuseppe za wskazanie możliwego rozwiązania 34-bajtowego.

JayCe
źródło
34 bajty jest możliwe! Zapomniałem, gdzie widziałem lewę (wiem, że jej nie wymyśliłem), ale jest trudniejsza konwersja do summable wektora - opublikuję, jeśli ty / ngm nie możesz jej znaleźć.
Giuseppe
@Giuseppe Rzeczywiście!
JayCe
2
Sprowadziłem go do 37 bajtów przy użyciu techniki, która w innym przypadku mogłaby być przydatna. Odkryłem to również sdi varzmuszam, aby podwoić wszystko, co mogą.
ngm
Możesz użyć, pryr::faby zapisać 4 bajty: tio.run/##K/qfZvu/…
pajonk
@pajonk good point! Ale staram się trzymać podstawowych pakietów R zamiast R + pryr. Będę szukać na meta, co można uznać za „czyste R”.
JayCe,
3

Galaretka , 4 bajty

rBFS

Wypróbuj online!

Wyjaśnienie

rBFS - Pełny program. Pobiera dwa dane wejściowe z argumentów wiersza poleceń.
r - Zasięg.
 B - Dla każdego przekonwertuj na binarny.
  FS - Spłaszcz i sumuj.
Pan Xcoder
źródło
O, o, to było szybkie?
Muhammad Salman
@MuhammadSalman Cóż, wyzwanie to także rodzaj trywialnej IMO.
Pan Xcoder,
Może być, ale odpowiedź minutę po opublikowaniu.
Muhammad Salman,
1
@MuhammadSalman Tak, to nie jest tak szybkie w przypadku tak trywialnych wyzwań; Następuje również znajomość galaretki. Prawdziwy wysiłek idzie np. W języku tego miesiąca, QBasic. ;-)
Erik the Outgolfer
@EriktheOutgolfer: Czy możesz odpowiedzieć na to pytanie w QBasic / BrainF ** k?
Muhammad Salman
3

Python 3 , 56 54 52 bajtów

Można to pograć w golfa bardziej imo. -2 bajty dzięki Mr.Xcoder -2 więcej bajtów dzięki MI Wright

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

Wypróbuj online!

Ciasteczka Wiatrak
źródło
2

Bash + wspólne narzędzia, 50

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

Wypróbuj online!

Przekształcanie liczb całkowitych na ciągi binarne zawsze jest trochę uciążliwe. Podejście tutaj jest nieco inne - zamień liczby całkowite na ósemkowe, a następnie zamień każdą cyfrę ósemkową na liczbę zawartych w niej liczb binarnych. Następnie możemy po prostu zsumować wszystkie przekonwertowane cyfry

Cyfrowa trauma
źródło
2

APL + WIN, 33 26 bajtów

Monity o wektor liczb całkowitych:

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

Wypróbuj online! Dzięki uprzejmości Dalog Classic

Wyjaśnienie:

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
źródło
2

R , 44 40 37 bajtów

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

Wypróbuj online!

Poprzednio:

function(a,b)sum(strtoi(intToBits(a:b)))
function(a,b)sum(as.integer(intToBits(a:b)))
ngm
źródło
2

Oktawa z przybornikiem komunikacji, 21 bajtów

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

Wypróbuj online!

Kod powinien być dość oczywisty. Liczba niezerowych elementów w reprezentacji binarnej każdej liczby w zakresie.

Byłoby to @(a,b)nnz(dec2bin(a:b)-48)bez zestawu narzędzi komunikacji.

Stewie Griffin
źródło
1

Łuska , 4 bajty

Σṁḋ…

Wypróbuj online!

Wyjaśnienie

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

źródło
1

PHP, 97 bajtów

(na pewno można to skrócić, ale chciałem użyć funkcji)

Wypróbuj online

Kod

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

Wyjaśnienie

<?=
 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
źródło
wydaje się, można po prostu zrobić to
dzaima
Przez sekundę absolutnie zapomniałem, że możesz ustawić nazwę funkcji php bezpośrednio jako parametr :-(
Francisco Hahn
$argv[0]to nazwa programu lub „-”; Powinieneś pracować z $argv[1]i $argv[2]. I możesz użyć joinzamiast implode, skracając to do 68 bajtów:<?=substr_count(join(array_map(decbin,range($argv[1],$argv[2]))),1);
Tytus
1

PowerShell , 72 bajty

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

Wypróbuj online!

Długi z powodu konwersji na binarną [convert]::ToString($_,2)i pozbycia się zer -replace0. W przeciwnym razie po prostu bierzemy liczby wejściowe, tworzymy zakres $x..$yi dla każdej liczby w zakresie konwertujemy ją na binarną, usuwamy zera, bierzemy .lengthje (tj. Liczbę pozostałych) i dodajemy do naszego $onarzędzia.

AdmBorkBork
źródło
spróbuj użyć countzamiast tego length:)
mazzy
1
@mazzy countzawsze będzie, 1ponieważ liczymy lengthciąg, a nie tablicę.
AdmBorkBork
strunowy! masz rację. dzięki. -replace0jest bystry.
mazzy
1

Pip , 10 bajtów

$+JTB:a\,b

Wypróbuj online!

Wyjaśnienie

            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
źródło
1

Węgiel drzewny , 10 bajtów

IΣ⭆…·NN⍘ι²

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

     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
źródło
1

Brachylog , 8 bajtów

⟦₂ḃᵐcọht

Wypróbuj online!

Wyjaśnienie

⟦₂         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
Fatalizować
źródło
1

K (ngn / k) , 19 13 bajtów

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

Wypróbuj online!

{ }jest funkcją z argumentami xiy

!1+y jest lista 0 1 ... y

x_ upuszcza pierwsze x elementów

2\ koduje każdą liczbę całkowitą jako listę cyfr binarnych o tej samej długości (jest to specyficzne dla ngn / k)

+/ suma

+//suma do konwergencji; w tym przypadku suma sumy wszystkich list cyfr binarnych

ngn
źródło
1

Perl 6 , 32 30 bajtów

-1 bajty dzięki Bradowi Gillbertowi

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

Wypróbuj online!

Wyjaśnienie:

[…](@_)    #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
źródło
1
Możesz go zmniejszyć o jeden bajt, jeśli użyjesz [...](@_)zamiast($^a..$^b)
Brad Gilbert b2gills
1

J , 16, 15 14 bajtów

1 bajt zapisany dzięki FrownyFrog!

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

Wypróbuj online!

Wyjaśnienie:

Czasownik dynamiczny, lewy argument jest dolną granicą mzakresu, prawy - górną 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 Iwanow
źródło
Czy potrafisz zrobić 14?
FrownyFrog
@FrownyFrog Spróbuję dzisiaj później (najwyraźniej jest to możliwe, ponieważ pytasz :))
Galen Ivanov
@FrownyFrog 15 na razie wciąż próbuję ...
Galen Iwanow
1
14
FrownyFrog,
@FrownyFrog Aah, takie proste! Myślałem o tym, }.ale zawsze w widelcu, a nie w haczyku. Dzięki!
Galen Iwanow
1

QBasic, 95 93 83 82 bajtów

@DLosc mnie trochę ocaliło dużo bajtów!

Za pomocą tej techniki zapisano kolejny bajt !

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

Język miesiąca FTW!

Wyjaśnienie

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

Ostatnia skrzynka testowa od 1000 do 2000 faktycznie działa, w QBasic 4.5 działającym na Dosbox: Hij doet het!

Steenbergh
źródło