Descripción
Dado un número, imprime la cantidad de 1
s que tiene en representación binaria.
Entrada
Un número >= 0
en la base 10 que no excederá el número más alto que su idioma pueda manejar.
Salida
La cantidad de 1
s en representación binaria.
Condición ganadora
El código más corto gana.
No permitido
- Operadores bit a bit. Se permiten otros operadores, como la suma y la multiplicación.
- Funciones de conversión de base incorporadas.
Ejemplos
Input: Ouput:
56432 8
Input: Output:
45781254 11
Input: Output:
0 0
Respuestas:
APL,
912 caracteresEsto supone que el intérprete usa números enteros de 32 bits y que
⎕IO
se establece en 0 (lo que significa que la monádica⍳
comienza con 0, en lugar de 1). Usé la versión de 32 bits de Dyalog APL .Explicación, de derecha a izquierda:
⍳32
genera un vector de los primeros32
enteros (como se explicó anteriormente, porque⎕IO
es 0, este vector comienza con 0).*
Es la función de potencia. En este caso, genera2
el poder de cada elemento del vector suministrado como su argumento correcto.÷
es la función dividida por. Nos da⎕
(entrada del usuario evaluada) dividido por cada elemento del vector a su derecha (cada potencia de dos).⌊
coloca cada elemento del argumento a su derecha.2|
nos da el resto de cada elemento de a su derecha dividido por2
./
reduce (dobla) su argumento derecho usando la función a su izquierda+
,.Ya no son 9 personajes. :(
Versión antigua que rompe las reglas:
fuente
Built-in base conversion functions
impronta?Brainbool , 2
La interpretación más razonable, en mi opinión (y lo que usan la mayoría de las respuestas) del "número más alto que su idioma es capaz de manejar" es "el mayor número que su idioma admite de forma nativa ". Brainbool es un derivado de brainfuck que usa bits en lugar de bytes, y toma entrada y salida en binario (
0
y1
caracteres) en lugar de códigos de caracteres. Por lo tanto1
, el número más grande admitido de forma nativa es , y el más pequeño0
, que tiene pesos de Hamming1
y0
respectivamente.Brainbool fue creado en 2010, según Esolang.
fuente
J, 13 caracteres
(+ el número de dígitos en el número)
Uso: reemplace el
n
en el programa con el número que se probará.Ejemplos:
Probablemente haya una forma de reorganizar esto para que el número se pueda colocar al principio o al final, pero esta es mi primera entrada J y mi cabeza me duele un poco ahora.
Explicación (principalmente para que lo entienda en el futuro)
i.32
- crea una matriz de los números del 1 al 322^
- convierte la lista en las potencias de dos 1 a 4294967296n%
- divide el número de entrada por cada elemento en la lista<.
- redondea todos los resultados de división al siguiente número entero2|
- igual que%2
en la mayoría de los idiomas - devuelve 0 si es par y 1 si es impar+/
- totaliza los elementos en la lista (que ahora son solo 1s o 0s)fuente
Brainfuck, 53 personajes
Faltaba una solución obligatoria de Brainfuck, así que hice esta:
Toma el número de la celda 1 y coloca el resultado en la celda 6.
Versión no registrada y comentada:
fuente
Python 2.6, 41 caracteres
nota: Mi otra respuesta usa lambda y recursión y esta usa un ciclo while. Creo que son lo suficientemente diferentes como para justificar dos respuestas.
fuente
Ruby, 38 caracteres.
Otra solución usando ruby y el mismo enfoque recursivo que Steven.
fuente
GolfScript,
1716 caracteresEditar: la nueva versión guarda 1 carácter utilizando la operación de lista en lugar de doblar (la versión original era
~{.2%\2/.}do]{+}*
, versión de conteo directo:)~0\{.2%@+\2/.}do;
.fuente
C, 45
Nada realmente especial aquí para jugar golf en C: tipo de retorno implícito, tipo entero implícito para parámetros.
fuente
Python 2.6, 45 caracteres
fuente
def
lugar de una lambda.print b(input())
. Es aceptable devolver el valor y tomar "input" como argumentos para las funciones.Perl,
454336 PersonajesGracias a Howard por 45-> 43, y al Usuario 606723 por 43-> 36.
fuente
$n=int($n/2)
2 caracteres más cortos.$n=<>;while($n){$_+=$n%2;$n/=2}print
Esto seguirá en bucle hasta que $ n / 2 finalmente se acerque lo suficiente a 0, pero ¿nos importa? ;)Perl, 30 caracteres
Basado en la solución de PhiNotPi , con algo de golf extra. Ejecutar con
perl -M5.010
para habilitar Perl 5.10say
.fuente
$=
variable especial hace algo especial en su programa, o es simplemente otra variable ordinaria?$=
solo toma valores enteros, por lo que usarlo me ahorra unint
.Lisp común, 12 caracteres
(suponiendo un nombre de variable de 1 carácter, es decir: 11 + longitud de número)
No es una función de conversión de base, por lo que debería funcionar:
Ejemplos:
(Usando GNU CLISP.)
fuente
C,
61 60 5753 caracteresEl cuerpo de la función solo tiene 38 caracteres. Editar : operador bit a bit eliminado Editar : poner
printf
fuera del ciclo como se sugiere en los comentarios Editar : cambiar a declaración K&R; Además, esto ya no es específico de C99fuente
dc - 26 caracteres
Esto es bastante largo, principalmente debido a la falta de construcciones de bucle
dc
.Sigue sumando el módulo 2 del número y dividiendo el número por hasta que llega a cero. Puede manejar enteros arbitrariamente largos.
Ejemplo:
fuente
C, 66 caracteres
Nota: requiere un compilador compatible con gcc o gcc (por ejemplo, ICC, clang).
Para algunas CPU se
__builtin_popcount
compila a una sola instrucción (por ejemplo,POPCNT
en x86).fuente
__builtin_popcount
realidad solo implemente el conteo de1
s en sí mismo? Si es así, aunque no es estrictamente incorrecto de acuerdo con las reglas, sinceramente, no creo que sea una entrada justa.printf
sin incluirlo previamente.C++
JavaScript,
78 7271 caracteresPublicaré mi solución inicial que se me ocurrió antes de publicar la pregunta también. Sin embargo, ya hay una respuesta JavaScript mucho mejor :)
http://jsfiddle.net/Mk8zd/1/
La idea proviene de ciertas "tarjetas de lectura de la mente" que le permiten obtener el número que otra persona tiene en mente, mostrándoles tarjetas y dejándoles decir en qué tarjetas su número es aparente.
Funciona porque cada número es una combinación única de
1
s /0
s en binario. Mi solución verifica en qué "tarjetas" el número es aparente para determinar cuántas1
s tiene. Sin embargo, no es muy eficiente ...Encontré este documento que describe la técnica de lectura de la mente.
fuente
Haskell (60 caracteres)
fuente
PHP, 57
Esto supone que
$n
tiene el valor a probar.PHP, 55 (solución alternativa)
Nuevamente, esto supone que
$n
tiene el valor a ser probado. Esta es una alternativa porque usa el operador o parafloor
la entrada.Ambas soluciones funcionan y no causan avisos.
fuente
Ocaml, 45 caracteres.
Basado en la solución de @Leah Xue. Se pueden eliminar tres espacios y es un poco más corto (~ 3 caracteres) para usar la función en lugar de if-then-else.
fuente
Mathematica 26
fuente
Scala, 86 personajes
Uso:
scala O 56432
fuente
D (70 caracteres)
fuente
R, 53 caracteres
o=function(n){h=n%/%2;n%%2+if(h)o(h)else 0};o(scan())
Ejemplos:
Si ingresar el número no es parte del recuento de caracteres, entonces son 43 caracteres:
o=function(n){h=n%/%2;n%%2+if(h)o(h)else 0}
con casos de prueba
fuente
OCaml, 52 caracteres
fuente
Esquema
Pulí las reglas un poco para agregar al desafío. La función no se preocupa por la base del número porque usa su propia escala binaria. Me inspiró la forma en que funciona la conversión analógica a numérica. Solo uso la recursión simple para esto:
fuente
¿No es leer un número en binario o imprimir el número de binario una "función de conversión de base incorporada", invalidando así cada respuesta anterior que
print
es un número entero? Si permite leer e imprimir un número entero, como lo hacen casi todas las respuestas anteriores, entonces haré reclamos utilizando una función incorporadapopcount
:Haskell, 50
Se
popCount
agregó una rutina alData.Bits
módulo para GHC v7.2.1 / v7.4.1 este verano (ver tickets sobre el primop y el enlace ).No puedo superar lo anterior Python y Perl puntajes con sus
GMPY
oGMP::Mpz
módulos de GMP por desgracia, a pesar de GMP sí ofrece una función popcount también.fuente
JavaScript,
49474542 bytesDemostración: http://jsfiddle.net/hcYdx/4/
Edición 1: eliminar
q
y usar~~
para redondear, guardar 2 caracteres.Edición 2: utilice el
|0
operador de redondeo en lugar de~~
guardar paréntesis (2 caracteres).Editar 3: simplificar
n>0
an
y se combinan conn=n/2|0
hacer que toda condición; ahora han desperdiciado espacio en la declaración :(fuente
|0
operador bit a bit?|
es operador bit a bit ... no está permitido. Hora de hacerMath.round
:-)Java 7, 36 bytes
Porque, por supuesto, esto, de todas las cosas, es algo para lo que Java tiene incorporado ...
fuente
bitCount
funciona bajo el capó.TI-Basic (TI-84 Plus CE), 30 bytes
TI-Basic es un lenguaje tokenizado, todos los tokens pero
remainder(
son de un byte , el resto es dosfuente
PHP, 36 bytes
Asume que
$n
es el número a ser probado, muestra un aviso de PHP$o
y no funciona exactamente cuando$n
es 0 (no muestra nada).PHP, 53 bytes
Acepta la entrada de la línea de comandos, no muestra un aviso PHP y genera correctamente 0.
fuente