contare quelli nel raggio


20

Sfida:

Contare il numero di quelli 1nella rappresentazione binaria di tutti i numeri tra un intervallo.


Input:

Due numeri interi positivi non decimali


Produzione :

La somma di tutte le 1s nell'intervallo tra i due numeri.


Esempio :

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

Ho solo spiegato il primo esempio, altrimenti avrebbe occupato un'enorme quantità di spazio se avessi cercato di spiegare per tutti loro.


Nota :

  • I numeri possono essere separati da oltre 1000
  • Tutti gli input saranno validi.
  • L'output minimo sarà uno.
  • Puoi accettare il numero come un array di due elementi.
  • Puoi scegliere come ordinare i numeri.

Criteri vincenti:

Questo è quindi il codice più breve in byte per ogni lingua vince.



1
Possiamo prendere l'input come una specie di intervallo ( IntRangein Kotlin, Rangein Ruby)?
snail_6

Curiosità: caso 1000 - 2000cede 5938, ma abbassare il caso del 1000, il risultato scende anche dal 1000: 0-1000 = 4938. Prova
steenbergh

Risposte:


9

JavaScript (ES6), 38 byte

Accetta input nella sintassi del curry (a)(b).

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

Provalo online!

Commentate

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


5

Java (JDK 10) , 55 byte

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

Provalo online!


IntStream.range(a,b+1).map(Integer::bitCount).sum()
saka1029,

@ saka1029 Le importazioni sono obbligatorie. Quindi in realtà è a->b->java.util.stream.IntStream.range(a,b+1).map(Integer::bitCount).sum(), per un totale di 74 byte. Anche se l'importazione non era obbligatoria, i parametri sono, quindi dovremmo scrivere a->b->IntStream.range(a,b+1).map(Integer::bitCount).sum(), che conta come 57 byte
Olivier Grégoire,

Potresti anche avere a->b->IntStream.range(a,b+1).map(Long::bitCount).sum()un miglioramento di 1 byte. Marginale, ma ancora uno.
NotBaal,

@NotBaal Come menzionato da Olivier nel commento sopra, le importazioni sono obbligatorie, quindi dovrebbe essere a->b->java.util.stream.IntStream.range(a,b+1).map(Long::bitCount).sum()(71 byte).
Kevin Cruijssen,



4

MATL , 5 4 byte

&:Bz

Provalo online!

Grazie a Luis Mendo per aver salvato un 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)


4

R , 41 34 byte

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

Provalo online!

Fortemente ispirato dall'altra soluzione R di ngm . Questo utilizza un approccio diverso dopo la conversione in bit. Un enorme grazie a Giuseppe per aver suggerito una possibile soluzione di 34 byte.


34 byte è possibile! Dimentico dove ho visto il trucco (so di non sumaverlo inventato ) ma c'è una conversione più complicata in un vettore mable - posterò se tu / ngm non riesci a trovarlo.
Giuseppe,

@Giuseppe Anzi!
JayCe

2
Sono arrivato a 37 byte usando una tecnica che altrimenti potrebbe essere utile. Lo ho anche scoperto sde varcostretto a raddoppiare tutto ciò che possono.
ngm

È possibile utilizzare pryr::fper salvare 4 byte: tio.run/##K/qfZvu/…
pajonk

@pajonk buon punto! Ma sto cercando di attenermi ai pacchetti R di base piuttosto che a R + pryr. Vado a cercare su meta quello che può essere considerato "puro R".
JayCe,

3

Gelatina , 4 byte

rBFS

Provalo online!

Spiegazione

rBFS - Programma completo. Prende i due input dagli argomenti della riga di comando.
r - Range.
 B - Per ciascuno, converti in binario.
  Vendo - Appiattisci e somma.

O_o, è stato veloce?
Muhammad Salman,

@MuhammadSalman Bene, la sfida è anche una specie di banale IMO.
Mr. Xcoder,

Potrebbe essere, ma una risposta un minuto dopo la pubblicazione.
Muhammad Salman,

1
@MuhammadSalman Sì, non è poi così veloce per sfide banali come questa; ne consegue anche la conoscenza di Jelly. Il vero sforzo va ad esempio nella lingua di questo mese, QBasic. ;-)
Erik the Outgolfer,

@EriktheOutgolfer: puoi rispondere in QBasic / BrainF ** k?
Muhammad Salman,





2

Bash + utility comuni, 50

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

Provalo online!

La conversione di numeri interi in stringhe binarie è sempre un po 'dolorosa in bash. L'approccio qui è leggermente diverso: converti gli interi in ottali, quindi sostituisci ogni cifra ottale con il numero di 1 binari che contiene. Quindi possiamo semplicemente sommare tutte le cifre convertite


2

APL + WIN, 33 26 byte

Richiede il vettore di numeri interi:

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

Provalo online! Per gentile concessione di Dalog Classic

Spiegazione:

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

2

R , 44 40 37 byte

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

Provalo online!

In precedenza:

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

2

Ottava con toolbox di comunicazione, 21 byte

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

Provalo online!

Il codice dovrebbe essere abbastanza ovvio. Numero di elementi diversi da zero nella rappresentazione binaria di ciascuno dei numeri nell'intervallo.

Ciò sarebbe @(a,b)nnz(dec2bin(a:b)-48)senza la cassetta degli attrezzi di comunicazione.


1

Buccia , 4 byte

Σṁḋ…

Provalo online!

Spiegazione

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


1

PHP, 97 byte

(sicuro che questo può essere abbreviato, ma volevo usare le funzioni)

Provalo online

Codice

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

Spiegazione

<?=
 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

a quanto pare si può solo fare questo
dzaima

Per un secondo ho dimenticato assolutamente che puoi impostare il nome della funzione php direttamente come parametro :-(
Francisco Hahn

$argv[0]è il nome del programma o "-"; Dovresti lavorare con $argv[1]e $argv[2]. E puoi usare joininvece di implode, accorciando questo a 68 byte:<?=substr_count(join(array_map(decbin,range($argv[1],$argv[2]))),1);
Tito

1

PowerShell , 72 byte

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

Provalo online!

Lungo a causa della conversione in binario [convert]::ToString($_,2)e sbarazzarsi degli zeri -replace0. Altrimenti prendiamo semplicemente i numeri di input, creiamo un intervallo $x..$ye per ogni numero nell'intervallo lo convertiamo in binario, rimuoviamo gli zeri, prendiamo i .lengthrelativi (cioè il numero di quelli rimanenti) e lo aggiungiamo al nostro $ooutput.


prova ad usare countinvece length:)
mazzy

1
@mazzy lo countsarà sempre 1perché stiamo contando il valore lengthdi una stringa, non di un array.
AdmBorkBork,

corda! hai ragione. Grazie. -replace0è intelligente.
mazzy,


1

Pip , 10 byte

$+JTB:a\,b

Provalo online!

Spiegazione

            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 +)


1

Carbone , 10 byte

IΣ⭆…·NN⍘ι²

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

     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

1

Brachylog , 8 byte

⟦₂ḃᵐcọht

Provalo online!

Spiegazione

⟦₂         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


1

K (ngn / k) , 19 13 byte

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

Provalo online!

{ }è una funzione con argomenti xey

!1+y è l'elenco 0 1 ... y

x_ rilascia i primi x elementi

2\ codifica ogni int come un elenco di cifre binarie della stessa lunghezza (questo è specifico di ngn / k)

+/ somma

+//somma fino alla convergenza; in questo caso somma della somma di tutti gli elenchi di cifre binarie


1

Perl 6 , 32 30 byte

-1 byte grazie a Brad Gillbert

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

Provalo online!

Spiegazione:

[…](@_)    #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

1
È possibile ridurlo di un byte se si utilizza [...](@_)invece di($^a..$^b)
Brad Gilbert b2gills

1

J , 16, 15 14 byte

1 byte salvato grazie a FrownyFrog!

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

Provalo online!

Spiegazione:

Un verbo diadico, l'argomento sinistro è il limite inferiore mdell'intervallo, quello destro - quello superiore 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

Puoi farlo 14?
FrownyFrog,

@FrownyFrog Ci proverò più tardi oggi (apparentemente è possibile, visto che lo chiedi :))
Galen Ivanov,

@FrownyFrog 15 per ora, sto ancora provando ...
Galen Ivanov il


@FrownyFrog Aah, così facile! Ci stavo pensando }.ma sempre in una forchetta e non in un gancio. Grazie!
Galen Ivanov,

1

QBasic, 95 93 83 82 byte

@DLosc mi ha salvato un po ' un sacco di byte!

Hai salvato un altro byte usando questa tecnica !

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

Lingua del mese FTW!

Spiegazione

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

L'ultimo testcase da 1000 a 2000 funziona davvero, in QBasic 4.5 in esecuzione su Dosbox: Hij doet het!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.