compter ceux à portée


20

Défi :

Comptez le nombre de uns 1dans la représentation binaire de tous les nombres entre une plage.


Contribution :

Deux entiers positifs non décimaux


Production :

La somme de tous les 1s dans la plage entre les deux nombres.


Exemple :

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

Je n'ai expliqué que le premier exemple, sinon cela aurait pris énormément d'espace si j'avais essayé de les expliquer pour chacun d'eux.


Remarque :

  • Les nombres peuvent être séparés de plus de 1000
  • Toutes les entrées seront valides.
  • La sortie minimale sera de un.
  • Vous pouvez accepter le nombre comme un tableau de deux éléments.
  • Vous pouvez choisir la façon dont les numéros sont commandés.

Critères gagnants:

C'est le donc le code le plus court en octets pour chaque langue gagne.



1
Pouvons-nous prendre l'entrée comme une sorte de type de plage ( IntRangedans Kotlin, Rangedans Ruby)?
— snail_

Fait d'amusement: cas 1000 - 2000donne 5938, mais de réduire le cas par 1000, le résultat diminue également de 1000: 0-1000 = 4938. Preuve
— steenbergh

Réponses:


9

JavaScript (ES6), 38 octets

Prend une entrée dans la syntaxe de curry (a)(b).

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

Essayez-le en ligne!

Commenté

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 octets

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

Essayez-le en ligne!


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

@ saka1029 Les importations sont obligatoires. C'est donc en fait a->b->java.util.stream.IntStream.range(a,b+1).map(Integer::bitCount).sum(), pour un total de 74 octets. Même si l'importation n'était pas obligatoire, les paramètres le sont, donc il faudrait écrire a->b->IntStream.range(a,b+1).map(Integer::bitCount).sum(), ce qui compte pour 57 octets
— Olivier Grégoire

Vous pourriez également avoir a->b->IntStream.range(a,b+1).map(Long::bitCount).sum()une amélioration de 1 octet. Marginal, mais toujours un.
— NotBaal

@NotBaal Comme mentionné par Olivier dans le commentaire ci-dessus, les importations sont obligatoires, donc elles devraient l'être a->b->java.util.stream.IntStream.range(a,b+1).map(Long::bitCount).sum()(71 octets).
— Kevin Cruijssen



4

MATL , 5 4 octets

&:Bz

Essayez-le en ligne!

Merci à Luis Mendo d'avoir enregistré un octet!

(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 octets

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

Essayez-le en ligne!

Fortement inspiré de l'autre solution R de ngm . Cela utilise une approche différente après la conversion en bits. Un grand merci à Giuseppe pour avoir fait allusion à une solution possible de 34 octets.


34 octets c'est possible! J'oublie où j'ai vu le truc (je sais que je ne l'ai pas trouvé) mais il y a une conversion plus délicate en un sumvecteur mable - je posterai si vous / ngm ne le trouvez pas.
— Giuseppe

@Giuseppe Effectivement!
— JayCe

2
Je l'ai réduit à 37 octets en utilisant une technique qui pourrait autrement être utile. A également découvert cela sdet varcontraint tout ce qu'ils peuvent doubler.
— ngm

Vous pouvez utiliser pryr::fpour enregistrer 4 octets: tio.run/##K/qfZvu/…
— pajonk

@pajonk bon point! Mais j'essaie de m'en tenir aux packages R de base plutôt qu'à R + pryr. Je vais chercher sur méta ce qui peut être considéré comme du "pur R".
— JayCe

3

Gelée , 4 octets

rBFS

Essayez-le en ligne!

Explication

rBFS - Programme complet. Prend les deux entrées des arguments de la ligne de commande.
r - Gamme.
 B - Pour chacun, convertissez en binaire.
  FS - Aplatir et additionner.

O_o, c'était rapide?
— Muhammad Salman

@MuhammadSalman Eh bien, le défi est aussi une sorte d'OMI triviale.
— M. Xcoder

Peut-être, mais une réponse une minute après la publication.
— Muhammad Salman

1
@ MuhammadSalman Oui, ce n'est pas vraiment aussi rapide pour des défis triviaux comme celui-ci; la connaissance de Jelly s'ensuit également. Le véritable effort va par exemple dans la langue de ce mois-ci, QBasic. ;-)
— Erik the Outgolfer

@EriktheOutgolfer: Pouvez-vous répondre à cela dans QBasic / BrainF ** k?
— Muhammad Salman





2

Bash + utilitaires communs, 50

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

Essayez-le en ligne!

La conversion d'entiers en chaînes binaires est toujours un peu pénible en bash. L'approche ici est légèrement différente - convertissez les entiers en octaux, puis remplacez chaque chiffre octal par le nombre de 1 binaires qu'il contient. Ensuite, nous pouvons simplement additionner tous les chiffres convertis


2

APL + WIN, 33 26 octets

Demande le vecteur d'entiers:

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

Essayez-le en ligne! Gracieuseté de Dalog Classic

Explication:

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 octets

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

Essayez-le en ligne!

Précédemment:

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

2

Octave avec boîte à outils de communication, 21 octets

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

Essayez-le en ligne!

Le code devrait être assez évident. Nombre d'éléments non nuls dans la représentation binaire de chacun des nombres de la plage.

Ce serait @(a,b)nnz(dec2bin(a:b)-48)sans la boîte à outils de communication.


1

Husk , 4 octets

Σṁḋ…

Essayez-le en ligne!

Explication

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


1

PHP, 97 octets

(bien sûr, cela peut être raccourci, mais je voulais utiliser les fonctions)

Essayez-le en ligne

Code

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

Explication

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

il semble que vous pouvez juste faire ce
— dzaima

Pendant une seconde, j'ai absolument oublié que vous pouvez définir le nom de la fonction php directement en tant que paramètre :-(
— Francisco Hahn

$argv[0]est le nom du programme ou "-"; Vous devriez travailler avec$argv[1] et $argv[2]. Et vous pouvez utiliser à la joinplace de implode, raccourcir cela à 68 octets:<?=substr_count(join(array_map(decbin,range($argv[1],$argv[2]))),1);
— Titus

1

PowerShell , 72 octets

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

Essayez-le en ligne!

Long à cause de la conversion en binaire [convert]::ToString($_,2)et de l'élimination des zéros -replace0. Sinon, nous prenons simplement les numéros d'entrée, faisons une plage $x..$yet pour chaque numéro de la plage, convertissons-le en binaire, supprimons les zéros, prenez-les .length(c'est-à-dire le nombre de ceux qui restent) et ajoutez-le à notre $osortie.


essayez d'utiliser à la countplace length:)
— mazzy

1
@mazzy countsera toujours 1parce que nous comptons la lengthchaîne, pas un tableau.
— AdmBorkBork

chaîne! tu as raison. Merci. -replace0est intelligent.
— mazzy


1

Pip , 10 octets

$+JTB:a\,b

Essayez-le en ligne!

Explication

            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

Fusain , 10 octets

IΣ⭆…·NN⍘ι²

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

     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 octets

⟦₂ḃᵐcọht

Essayez-le en ligne!

Explication

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

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

Essayez-le en ligne!

{ }est une fonction avec des arguments xety

!1+y est la liste 0 1 ... y

x_ supprime les x premiers éléments

2\ code chaque int comme une liste de chiffres binaires de même longueur (ceci est spécifique à ngn / k)

+/ somme

+//somme jusqu'à convergence; dans ce cas, somme de la somme de toutes les listes de chiffres binaires


1

Perl 6 , 32 30 octets

-1 octets grâce à Brad Gillbert

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

Essayez-le en ligne!

Explication:

[…](@_)    #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
Vous pouvez le réduire d'un octet si vous utilisez [...](@_)au lieu de($^a..$^b)
— Brad Gilbert b2gills

1

J , 16, 15 14 octets

1 octet économisé grâce à FrownyFrog!

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

Essayez-le en ligne!

Explication:

Un verbe dyadique, l'argument de gauche est la borne inférieure mde la plage, la droite - la supérieure 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

Pouvez-vous faire 14?
— FrownyFrog

@FrownyFrog J'essaierai plus tard dans la journée (apparemment c'est possible, puisque vous demandez :))
— Galen Ivanov

@FrownyFrog 15 pour l'instant, j'essaie toujours ...
— Galen Ivanov


@FrownyFrog Aah, si facile! Je pensais à }.mais toujours dans une fourchette et non dans un crochet. Merci!
— Galen Ivanov

1

QBasic, 95 93 83 82 octets

@DLosc m'a sauvé un certain lot un des octets!

Enregistré un autre octet en utilisant cette technique !

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

Langue du mois FTW!

Explication

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

Le dernier testcase de 1000 à 2000 fonctionne réellement, dans QBasic 4.5 fonctionnant sur Dosbox: Hij doet het!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.