Escriba algunas declaraciones que contarán el número de unidades en un entero de dieciséis bits sin signo.
Por ejemplo, si la entrada es 1337
, entonces el resultado es 6
porque 1337
como es un número binario de dieciséis bits 0000010100111001
, que contiene seis unos.
Respuestas:
80386 Código máquina, 4 bytes
que toma el número entero
cx
y genera el recuentoax
, y es equivalente a:Y aquí hay una solución de
1110 bytes que no usa POPCNT:que es equivalente a:
fuente
ax
ycx
coneax
y loecx
cambia a 32 bits. El bytecode es el mismo para cualquiera.Python 2, 17 bytes
El
bin
incorporado devuelve el entero convertido a una cadena binaria. Luego contamos los1
dígitos:fuente
J (5 caracteres)
J no tiene tipos explícitos. Esto hace lo correcto para todos los enteros.
+/
la suma@
de#:
la base dos representaciónfuente
C, 21
dijiste "escribe algunas declaraciones" (no "una función"), así que asumí que se proporciona
x
el número y se devuelve el número de 1n
. Si no tengo que inicializarn
puedo guardar 3 bytes.Esta es una adaptación de la famosa expresión
x&x-1
para probar si algo es una potencia de 2 (falso si lo es, verdadero si no lo es).Aquí está en acción sobre el número 1337 de la pregunta. Tenga en cuenta que restar 1 voltea el 1 bit menos significativo y todos los ceros a la derecha.
EDITAR: para completar, aquí está el algoritmo ingenuo, que es un byte más largo (y bastante más lento).
fuente
{}
. Es una tarea tan simple que no debería sorprenderme que alguien ya se le haya ocurrido.for(n=0;x;x/=2)n+=x&1;
Gelatina , no competidora
Esta respuesta no es competitiva, ya que el idioma fue creado después de que se publicó el desafío.
2 bytes:
Jelly es un nuevo lenguaje escrito por @Dennis, con sintaxis tipo J.
Probarlo aquí .
fuente
Pyth, 4 bytes
El programa toma el número cuyo peso de hamming se encuentra en STDIN.
fuente
Julia,
292719 bytesEsto crea una función anónima que acepta un solo argumento,
n
. Para usarlo, asígnelo a algo asíf=n->...
y llámelo comof(1337)
.La
digits()
función, cuando se llama con 2 argumentos, devuelve una matriz de los dígitos de la entrada en la base dada. Entoncesdigits(n, 2)
devuelve los dígitos binarios den
. Tome la suma de la matriz y tendrá el número de unidades en la representación binaria den
.fuente
count_ones
CJam, 6 bytes
Pruébalo en línea aquí
fuente
Joe , 4 bytes
Esta es una función anónima.
Ba
da la representación binaria de un número y lo/+
suma.fuente
R, 24 bytes
scan()
lee la entrada de stdin.intToBits()
toma un número entero y devuelve un vector de tipo queraw
contiene los ceros y unos de la representación binaria de la entrada.intToBits(scan())>0
devuelve un vector lógico donde está cada elementoTRUE
si el elemento del vector binario correspondiente es un 1 (ya que todos los elementos son 0 o 1 y 1> 0), de lo contrarioFALSE
.En R, puede sumar un vector lógico para obtener el número de
TRUE
elementos, por lo que sumar el vector de lógicos como se muestra arriba nos da lo que queremos.Tenga en cuenta que
sum()
no puede manejar laraw
entrada directamente, por lo tanto, la solución usando lógicosfuente
sum(intToBits(scan()))
sería lo mismo?sum()
que no puede tomar la entrada de tiporaw
, que es lo que devuelveintToBits()
.Ruby, 18 bytes
n.to_s(2).count'1'
fuente
n.to_s(2).count ?1
también funciona, pero tiene la misma duraciónAdelante,
4849 bytesSi se necesita una función real, la segunda línea se convierte en
y lo llamas por "1337 c". Las palabras de control relativamente detalladas de Forth hacen que esta sea difícil (en realidad, hacen que muchas de estas sean difíciles).
Editar: mi versión anterior no manejaba los números negativos correctamente.
fuente
Mathematica,
2218 bytesGracias a alephalpha por recordármelo
DigitCount
.fuente
ES6 (
342221 bytes):Esta es una función recursiva simple que se puede acortar un poco más. Simplemente toma un poco y se ejecuta nuevamente:
Pruébelo en http://www.es6fiddle.net/imt5ilve/ (necesita el
var
debido a'use strict';
).¡No puedo creer que haya vencido a Fish!
El viejo:
ES5 (39 bytes):
Ambas funciones se pueden adaptar fácilmente a ES5:
El viejo:
@ user1455003 me dio una idea realmente genial, que 'activó' la más pequeña:
¡Lo adapté a ES6 y lo hice recursivo para acortar mucho!
fuente
> <> (Pez) , 24 bytes + 2 = 26
El programa solo repite el mod 2, resta y divide hasta que el número de entrada se convierte en cero, luego imprime la suma de los mod 2.
Prueba con la
-v
bandera, p. Ej.fuente
-v
versión de la bandera todavía funciona.)PHP (38 bytes):
Esto utiliza el mismo enfoque que mi respuesta ES6
Este es un código completo, solo necesita ponerlo en un archivo y acceder a él a través del navegador, con el parámetro
n=<number>
.PHP <4.2 (32 bytes):
Esto es un poco más corto:
Esto solo funciona de manera confiable en PHP <4.2 porque la directiva
register_globals
se configuróOff
de manera predeterminada desde PHP4.2 hasta PHP5.4 (que se eliminó para entonces).Si creas un
php.ini
archivo conregister_globals=On
, esto funcionará.Para usar el código, acceda al archivo usando un navegador, ya sea con POST o GET.
@ViniciusMonteiro 's sugerencia (38/45 bytes):
Dio 2 sugerencias realmente buenas que tienen un uso muy interesante de la función.
array_sum
:38 bytes:
45 bytes:
Esta es una gran idea y se puede acortar un poco más, para tener 36 bytes de longitud:
fuente
<?=substr_count(decbin(1337),"1");
(34 bytes)<?=substr_count(decbin(1337),1);
. Eso es un total de 32 bytes. Teniendo en cuenta que es un código lo suficientemente diferente, ¿no quieres publicarlo como tu propia respuesta? ¡Lo votaré con toda seguridad!<?=substr_count(decbin($argv[1]),1);
(o$_GET[n]
; 36 bytes)C #, 45 bytes
https://dotnetfiddle.net/kJDgOY
fuente
b-48
es aún más corto, AFAIKJapt, 3 bytes (no competitivo)
Pruébalo aquí
fuente
¢o1 l
también funcionaría. Otro enfoque interesante es-¢¬r-0
;¢¬
se divide en una matriz de dígitos binarios, ser-0
reduce por sustracción, comenzando en 0, y-
niega el resultado, haciéndolo positivo.¢¬x
.cera de abeja ,
3127 bytesRespuesta no competitiva. La cera de abejas es más nueva que este desafío.
Esta solución utiliza la forma en que Brian Kherigan cuenta los bits establecidos del sitio web "Bit Twiddling Hacks".
simplemente se ejecuta a través de un bucle, incrementando el conteo de bits, mientras itera
number=number&(number-1)
hasta quenumber = 0
. La solución solo pasa por el ciclo tan a menudo como hay bits establecidos.Podría ahorrar 4 bytes reorganizando algunas instrucciones. Tanto el código fuente como la explicación se actualizaron:
Explicación:
Clone mi repositorio de GitHub que contiene el intérprete de cera de abejas, especificaciones de lenguaje y ejemplos.
fuente
Java, 17 bytes
Obras para
byte
,short
,char
, yint
. Úselo como lambda.Prueba aquí
Sin usar incorporados:
42 bytes
Prueba aquí
fuente
Clip , 6
2 maneras:
Esta es una traducción directa del requisito: el recuento de unos en la representación de número en base 2.
Otro método, que toma la suma de los dígitos de la representación de base 2.
fuente
Octava, 18
Ejemplo:
fuente
GML (lenguaje Game Maker), 21 bytes
fuente
C # 39 bytes
fuente
Perl, 21
fuente
PowerShell (51 bytes)
Explicación:
[convert]::ToString($s,2)
produce una representación de cadena binaria a partir de$s
.[char[]]
lo convierte en una matriz de caracteres y nos permite enumerar cada carácter.|%{"+$_"}
antepone cada carácter con un signo +,"$()"
implícitamente llama.ToString()
a la expresión secundaria resultante|iex
suma la cadena canalizada (es decir, "+1 +0 +1 +1 +0 +1 +0 +0" = 4)fuente
-join
del operador y una implícita.ToString()
para lograr 45 bytes con[char[]][convert]::ToString($s,2)-join'+'|iex
... O, como un uso diferente enfoque en línea-replace
del operador para lograr con 43 bytes([convert]::ToString($s,2)-replace0).length
Clojure, 42 bytes
Lectura de derecha a izquierda, convertir en una cadena binaria, convertir en una secuencia de caracteres, filtrar
1
sy contar cuántos tiene.EDITADO Con la ayuda de Sieg
fuente
#(count(filter #{\1}(Integer/toString% 2)))
#(count(filter #{\1}(Integer/toString % 2)))
CompilerException java.lang.IllegalArgumentException: No matching method: toString_PERCENT_
Integer/toString
. Sin embargo, funcionó hace un segundo.Haskell 42 caracteres
declara el
f :: Integer -> Integer
uso de la función desde el intérprete interactivo como
f <number>
o agrega la líneamain=print$f <number>
al final del archivo.fuente
rem n 2
s en lugar de crear una lista y utilizando endiv
lugar dequot
:t 0=0
t n=t(div n 2)+rem n 2
-f
ya no .Matlab, 13 bytes
de2bi
crea un vector de ceros y unos que representan el número binario, ysum
solo devuelve la suma de todas las entradas.fuente
𝔼𝕊𝕄𝕚𝕟, 4 caracteres / 11 bytes (no competitivo)
Try it here (Firefox only).
Explicación
Convierte la entrada en binario, se divide a lo largo de los caracteres y obtiene la suma de la matriz resultante.
fuente