Écrivez une ou plusieurs instructions qui compteront le nombre d'un dans un entier de seize bits non signé.
Par exemple, si l'entrée est 1337
, alors le résultat est 6
dû 1337
au fait qu'un nombre binaire de seize bits est 0000010100111001
, qui en contient six.
Réponses:
80386 Code machine, 4 octets
qui prend l'entier
cx
et sort le nombreax
, et est équivalent à:Et voici une solution de
1110 octets n'utilisant pas POPCNT:ce qui équivaut à:
la source
ax
etcx
aveceax
et leecx
change en 32 bits. Le bytecode est le même pour les deux.Python 2, 17 octets
La fonction
bin
intégrée renvoie l'entier converti en chaîne binaire. On compte ensuite les1
chiffres:la source
J (5 caractères)
J n'a pas de types explicites. Cela fait la bonne chose pour tous les entiers.
+/
la somme@
de#:
la représentation de base deuxla source
C, 21
vous avez dit "écrire quelques instructions" (pas "une fonction") donc j'ai supposé que le nombre était fourni
x
et que le nombre de 1 était retournén
. Si je n'ai pas à l'initialiser,n
je peux économiser 3 octets.Il s'agit d'une adaptation de la célèbre expression
x&x-1
pour tester si quelque chose a une puissance de 2 (faux si c'est le cas, vrai si ce n'est pas le cas.)Le voici en action sur le numéro 1337 de la question. Notez que la soustraction de 1 inverse le bit le moins significatif et tous les zéros vers la droite.
EDIT: pour être complet, voici l'algorithme naïf, qui est un octet de plus (et un peu plus lent.)
la source
{}
. C'est une tâche tellement simple que je ne serais pas surpris que quelqu'un l'ait déjà imaginé.for(n=0;x;x/=2)n+=x&1;
Gelée , non compétitive
Cette réponse n'est pas concurrente, car la langue a été créée après la publication du défi.
2 octets:
Jelly est un nouveau langage écrit par @Dennis, avec une syntaxe de type J.
Essayez-le ici .
la source
Pyth, 4 octets
Le programme prend le numéro dont le poids de hamming se trouve sur STDIN.
la source
Julia,
292719 octetsCela crée une fonction anonyme qui accepte un seul argument,
n
. Pour l'utiliser, affectez-le à quelque chose commef=n->...
et appelez-le commef(1337)
.La
digits()
fonction, lorsqu'elle est appelée avec 2 arguments, retourne un tableau des chiffres de l'entrée dans la base donnée. Renvoie doncdigits(n, 2)
les chiffres binaires den
. Prenez la somme du tableau et vous avez le nombre de ceux dans la représentation binaire den
.la source
count_ones
CJam, 6 octets
Essayez-le en ligne ici
la source
Joe , 4 octets
Il s'agit d'une fonction anonyme.
Ba
donne la représentation binaire d'un nombre et la/+
somme.la source
R, 24 octets
scan()
lit l'entrée de stdin.intToBits()
prend un entier et retourne un vecteur de typeraw
contenant les zéros et ceux de la représentation binaire de l'entrée.intToBits(scan())>0
renvoie un vecteur logique où chaque élément estTRUE
si l'élément vectoriel binaire correspondant est un 1 (puisque tous les éléments sont 0 ou 1 et 1> 0), sinonFALSE
.Dans R, vous pouvez additionner un vecteur logique pour obtenir le nombre d'
TRUE
éléments, donc la somme du vecteur de logique comme ci-dessus nous donne ce que nous voulons.Notez que
sum()
ne peut pas gérer l'raw
entrée directement, d'où la solution de contournement à l'aide de logiques.la source
sum(intToBits(scan()))
pareil?sum()
ne peut pas prendre d'entrée de typeraw
, ce qui est ce qui est retournéintToBits()
.Rubis, 18 octets
n.to_s(2).count'1'
la source
n.to_s(2).count ?1
fonctionne également, mais est de la même longueurForth,
4849 octetsSi une fonction réelle est nécessaire, la deuxième ligne devient
et vous l'appelez par "1337 c". Les mots de contrôle relativement verbeux de Forth rendent cela difficile (en fait, ils en rendent beaucoup).
Modifier: ma version précédente ne gérait pas correctement les nombres négatifs.
la source
Mathematica,
2218 octetsMerci à alephalpha de me l'avoir rappelé
DigitCount
.la source
ES6 (
342221 octets):Il s'agit d'une simple fonction récursive qui peut être raccourcie un peu plus. Cela prend simplement un peu et s'exécute à nouveau:
Essayez-le sur http://www.es6fiddle.net/imt5ilve/ (vous en avez besoin à
var
cause de'use strict';
).Je ne peux pas croire que j'ai battu des poissons !!!
Le vieux:
ES5 (39 octets):
Les deux fonctions peuvent être facilement adaptées à ES5:
Le vieux:
@ user1455003 m'a donné une très bonne idée, qui a "déclenché" la plus petite:
Je l'ai adapté à ES6 et l'ai rendu récursif pour raccourcir beaucoup!
la source
> <> (Poisson) , 24 octets + 2 = 26
Le programme ne fait que répéter le mod 2, soustrait et divise jusqu'à ce que le nombre d'entrée devienne zéro, puis imprime la somme des mod 2.
Test avec le
-v
drapeau, par exemplela source
-v
version drapeau fonctionne toujours.)PHP (38 octets):
Cela utilise la même approche que ma réponse ES6
Il s'agit d'un code complet, il vous suffit de le mettre dans un fichier et d'y accéder via le navigateur, avec le paramètre
n=<number>
.PHP <4,2 (32 octets):
C'est un peu plus court:
Cela ne fonctionne que de manière fiable sur PHP <4.2 car la directive a
register_globals
été définieOff
par défaut de PHP4.2 à PHP5.4 (qui a été supprimée d'ici là).Si vous créez un
php.ini
fichier avecregister_globals=On
, cela fonctionnera.Pour utiliser le code, accédez au fichier à l'aide d'un navigateur, avec POST ou GET.
Suggestion de @ViniciusMonteiro (38/45 octets):
Il a donné 2 très bonnes suggestions qui ont une utilisation très intéressante de la fonction
array_sum
:38 octets:
45 octets:
C'est une très bonne idée et peut être raccourcie un peu plus, pour une longueur de 36 octets:
la source
<?=substr_count(decbin(1337),"1");
(34 octets)<?=substr_count(decbin(1337),1);
. C'est un total de 32 octets. Étant donné qu'il s'agit d'un code suffisamment différent, ne voulez-vous pas le publier comme votre propre réponse? Je vais sûrement le voter!<?=substr_count(decbin($argv[1]),1);
(ou$_GET[n]
; 36 octets)C #, 45 octets
https://dotnetfiddle.net/kJDgOY
la source
b-48
est encore plus court, AFAIKJapt, 3 octets (non compétitif)
Essayez-le ici.
la source
¢o1 l
fonctionnerait aussi. Une autre approche intéressante est-¢¬r-0
;¢¬
se divise en tableau de chiffres binaires,r-0
réduit par soustraction, en commençant à 0 et-
annule le résultat, le rendant positif.¢¬x
.cire d'abeille ,
3127 octetsRéponse non concurrente. La cire d'abeille est plus récente que ce défi.
Cette solution utilise la façon de Brian Kherigan de compter les bits définis sur le site Web «Bit Twiddling Hacks».
il passe simplement par une boucle, incrémentant le nombre de bits, tout en itérant
number=number&(number-1)
jusqu'ànumber = 0
. La solution ne passe par la boucle que si des bits sont définis.Je pourrais raser 4 octets en réorganisant quelques instructions. Le code source et l'explication ont été mis à jour:
Explication:
Clonez mon référentiel GitHub contenant l'interpréteur de cire d'abeille, les spécifications de langue et des exemples.
la source
Java, 17 octets
Travaux pour
byte
,short
,char
etint
. Utiliser comme lambda.Testez ici
Sans utiliser les intégrés:
42 octets
Testez ici
la source
Clip , 6
2 façons:
Il s'agit d'une traduction simple de l'exigence: le nombre de ceux dans la représentation de base-2 du nombre.
Une autre méthode, qui prend la somme des chiffres de la représentation en base 2.
la source
Octave, 18
Exemple:
la source
GML (Game Maker Language), 21 octets
la source
C # 39 octets
la source
Perl, 21
la source
PowerShell (51 octets)
Explication:
[convert]::ToString($s,2)
produit une représentation de chaîne binaire à partir de$s
.[char[]]
le jette comme un tableau de caractères et nous permet d'énumérer chaque caractère.|%{"+$_"}
ajoute à chaque caractère un signe +"$()"
appelle implicitement.ToString()
la sous-expression résultante|iex
additionne la chaîne canalisée (c.-à-d. "+1 +0 +1 +1 +0 +1 +0 +0" = 4)la source
-join
opérateur en ligne et un implicite.ToString()
pour atteindre 45 octets avec[char[]][convert]::ToString($s,2)-join'+'|iex
... OU, comme une approche différente, utilisez l'-replace
opérateur en ligne pour atteindre 43 octets avec([convert]::ToString($s,2)-replace0).length
Clojure, 42 octets
Lire de droite à gauche, convertir en une chaîne binaire, convertir en une séquence de caractères, filtrer sur
1
s et compter combien vous en avez.MODIFIÉ Avec l'aide de Sieg
la source
#(count(filter #{\1}(Integer/toString% 2)))
#(count(filter #{\1}(Integer/toString % 2)))
CompilerException java.lang.IllegalArgumentException: No matching method: toString_PERCENT_
Integer/toString
. Cela a fonctionné il y a une seconde cependant.Haskell 42 caractères
déclare l'
f :: Integer -> Integer
utilisation de la fonction à partir de l'interpréteur interactif
f <number>
ou ajoute la lignemain=print$f <number>
à la fin du fichier.la source
rem n 2
s au lieu d'en construire une liste et en utilisant à ladiv
place dequot
:t 0=0
t n=t(div n 2)+rem n 2
-f
plus.Matlab, 13 octets
de2bi
crée un vecteur de zéros et de uns représentant le nombre binaire, etsum
renvoie simplement la somme de toutes les entrées.la source
𝔼𝕊𝕄𝕚𝕟, 4 caractères / 11 octets (non concurrentiel)
Try it here (Firefox only).
Explication
Convertit l'entrée en binaire, se divise le long des caractères et obtient la somme du tableau résultant.
la source