Descrição
Dado um número, imprima a quantidade de 1
s que possui na representação binária.
Entrada
Um número >= 0
na base 10 que não excederá o número mais alto que o seu idioma pode manipular.
Resultado
A quantidade de 1
s na representação binária.
Condição vencedora
O código mais curto vence.
Não permitido
- Operadores bit a bit. Outros operadores, como adição e multiplicação, são permitidos.
- Funções de conversão de base incorporadas.
Exemplos
Input: Ouput:
56432 8
Input: Output:
45781254 11
Input: Output:
0 0
Respostas:
APL,
912 caracteresIsso pressupõe que o intérprete use números inteiros de 32 bits e que
⎕IO
seja definido como 0 (o que significa que o monádico⍳
começa com 0, em vez de 1). Eu usei a versão de 32 bits do Dyalog APL .Explicação, da direita para a esquerda:
⍳32
gera um vetor dos primeiros32
números inteiros (como explicado anteriormente, porque⎕IO
é 0, esse vetor começa com 0).*
é a função de poder. Nesse caso, gera2
a potência de cada elemento do vetor fornecido como argumento correto.÷
é a função dividida por. Ele nos fornece⎕
(entrada do usuário avaliada) dividida por cada elemento do vetor à sua direita (cada potência de dois).⌊
coloca cada elemento do argumento à sua direita.2|
nos dá o restante de cada elemento à sua direita dividido por2
./
reduz (dobra) seu argumento correto usando a função à esquerda+
,.Não são mais 9 caracteres. :(
Versão antiga e de quebra de regras:
fonte
Built-in base conversion functions
contraint?Brainbool , 2
A interpretação mais razoável, na minha opinião (e o que a maioria das respostas usa) de "número mais alto que seu idioma é capaz de lidar" é "número maior que seu idioma suporta nativamente ". Brainbool é um derivado cerebral que usa bits em vez de bytes, e recebe entrada e saída em binário (
0
e1
caracteres) em vez de códigos de caracteres. O maior número suportado nativamente é, portanto,1
, , e o menor é0
, que tem pesos de Hamming1
e,0
respectivamente.Brainbool foi criado em 2010, de acordo com Esolang.
fonte
J, 13 caracteres
(+ o número de dígitos no número)
Uso: substitua o
n
no programa pelo número a ser testado.Exemplos:
Provavelmente existe uma maneira de reorganizar isso para que o número possa ser colocado no início ou no fim, mas esta é a minha primeira entrada em J e minha cabeça está doendo um pouco agora.
Explicação (principalmente para que eu entenda no futuro)
i.32
- cria uma matriz dos números de 1 a 322^
- transforma a lista nas potências de dois 1 a 4294967296n%
- divide o número de entrada por cada elemento da lista<.
- arredonda todos os resultados da divisão até o próximo número inteiro2|
- o mesmo que%2
na maioria dos idiomas - retorna 0 se for par e 1 se for ímpar+/
- totaliza os itens da lista (que agora são apenas 1s ou 0s)fonte
Brainfuck, 53 caracteres
Faltava uma solução obrigatória da Brainfuck, então fiz esta:
Pega o número da célula 1 e coloca o resultado na célula 6.
Versão não registrada e comentada:
fonte
Python 2.6, 41 caracteres
Nota: Minha outra resposta usa lambda e recursão e esta usa um loop while. Eu acho que eles são diferentes o suficiente para justificar duas respostas.
fonte
Ruby, 38 caracteres
Outra solução usando ruby e a mesma abordagem recursiva que Steven.
fonte
GolfScript,
1716 caracteresEditar: a nova versão salva 1 caractere usando a operação de lista em vez da dobra (a versão original era
~{.2%\2/.}do]{+}*
, versão de contagem direta:)~0\{.2%@+\2/.}do;
.fonte
C, 45
Nada realmente especial aqui para jogar golfe em C: tipo de retorno implícito, tipo inteiro implícito para parâmetros.
fonte
Python 2.6, 45 caracteres
fonte
def
vez de uma lambda.print b(input())
. É aceitável retornar o valor e receber "input" como argumentos para funções.Perl,
454336 caracteresAgradecimentos a Howard por 45-> 43 e a User606723 por 43-> 36.
fonte
$n=int($n/2)
quais 2 caracteres mais curtos.$n=<>;while($n){$_+=$n%2;$n/=2}print
Isso continuará repetindo até que $ n / 2 finalmente chegue perto de 0, mas nos importamos? ;)Perl, 30 caracteres
Baseado na solução da PhiNotPi , com um pouco de golfe extra. Execute com
perl -M5.010
para ativar osay
recurso Perl 5.10 .fonte
$=
variável especial faz algo especial no seu programa ou é apenas outra variável comum?$=
leva apenas valores inteiros; portanto, usá-lo economiza umint
.Lisp comum, 12 caracteres
(assumindo um nome de variável com 1 caractere - ou seja: 11 + comprimento do número)
Não é uma função de conversão básica, portanto deve funcionar:
Exemplos:
(Usando o GNU CLISP.)
fonte
C,
61 60 5753 caracteresO corpo da função possui apenas 38 caracteres. Edit : operador bit a bit removido Edit : coloque
printf
fora do loop conforme sugerido nos comentários Edit : alterne para a declaração K&R; Além disso, isso não é mais específico ao C99fonte
dc - 26 caracteres
Isso é bastante longo, principalmente devido à falta de construções de loop
dc
.Continua adicionando o módulo 2 do número e dividindo o número até até chegar a zero. Pode lidar com números inteiros arbitrariamente longos.
Exemplo:
fonte
C, 66 caracteres
Nota: requer o gcc ou o compilador compatível com o gcc (por exemplo, ICC, clang).
Para algumas CPUs,
__builtin_popcount
compila com uma única instrução (por exemplo,POPCNT
em x86).fonte
__builtin_popcount
realmente apenas implemente a contagem de1
si? Em caso afirmativo, embora não seja estritamente errado de acordo com as regras, sinceramente não acho que essa seja uma entrada justa.printf
sem inclusão prévia.C++
JavaScript,
78 7271 caracteresVou postar minha solução inicial, que surgiu antes de postar a pergunta também. Já existe uma resposta JavaScript muito melhor :)
http://jsfiddle.net/Mk8zd/1/
A idéia vem de certos "cartões de leitura da mente" que permitem obter o número que alguém mais tem em mente, mostrando-lhes cartões e digam em quais cartões seu número é aparente.
Funciona porque cada número é uma combinação única de
1
s /0
s em binário. Minha solução verifica em quais "cartões" o número é aparente para determinar quantos1
s ele possui. Mas não é muito eficiente ...Encontrei este documento que descreve a técnica de leitura da mente.
fonte
Haskell (60 caracteres)
fonte
PHP, 57
Isso pressupõe que
$n
mantém o valor a ser testado.PHP, 55 (solução alternativa)
Novamente, isso pressupõe que
$n
mantém o valor a ser testado. Essa é uma alternativa porque usa o operador or parafloor
na entrada.Ambas as soluções funcionam e não causam avisos.
fonte
Ocaml, 45 caracteres
Com base na solução de @Leah Xue. Três espaços podem ser removidos e é um pouco mais curto (~ 3 caracteres) para usar a função em vez de se-então-outro.
fonte
Mathematica 26
fonte
Scala, 86 caracteres
Uso:
scala O 56432
fonte
D (70 caracteres)
fonte
R, 53 caracteres
o=function(n){h=n%/%2;n%%2+if(h)o(h)else 0};o(scan())
Exemplos:
Se a inserção do número não fizer parte da contagem de caracteres, serão 43 caracteres:
o=function(n){h=n%/%2;n%%2+if(h)o(h)else 0}
com casos de teste
fonte
OCaml, 52 caracteres
fonte
Esquema
Eu poli as regras um pouco para adicionar ao desafio. A função não se importa com a base do número porque usa sua própria escala binária. Fui inspirado pela maneira como a conversão analógica para numérica funciona. Eu apenas uso recursão simples para isso:
fonte
A leitura de um número no binário ou a impressão do número no binário é uma "função de conversão básica interna", invalidando todas as respostas acima desse
print
número inteiro? Se você permitir ler e imprimir um número inteiro, como quase todas as respostas acima, farei declarações usando uma função internapopcount
:Haskell, 50
Houve uma
popCount
rotina adicionada aoData.Bits
módulo para o GHC v7.2.1 / v7.4.1 neste verão (consulte os tickets sobre o primop e a encadernação ).Não consigo superar as pontuações acima em Python e Perl usando seus módulos
GMPY
ouGMP::Mpz
para o GMP, infelizmente, embora o GMP ofereça uma função de contagem de pop - ups também.fonte
JavaScript,
49474542 bytesDemonstração: http://jsfiddle.net/hcYdx/4/
Editar 1: remova
q
e use~~
para arredondar, salve 2 caracteres.Editar 2: use o
|0
operador de arredondamento em vez de~~
salvar parênteses (2 caracteres).Editar 3: simplificar
n>0
an
e combinam comn=n/2|0
para fazer a condição inteira; agora desperdiçamos espaço de declaração :(fonte
|0
operador não é um bit a bit?|
é operador bit a bit ... não é permitido. Hora de fazerMath.round
:-)Java 7, 36 bytes
Porque é claro que isso, de todas as coisas, é algo que o Java possui para ...
fonte
bitCount
funciona sob o capô.TI-Basic (TI-84 Plus CE), 30 bytes
O TI-Basic é um idioma tokenizado, todos os tokens, mas
remainder(
são de um byte , o restante é doisfonte
PHP, 36 bytes
Assume que
$n
é o número a ser testado, mostra um aviso do PHP$o
e não funciona exatamente quando$n
é 0 (não gera nada).PHP, 53 bytes
Aceita entrada da linha de comando, não mostra um aviso do PHP e sai corretamente para 0.
fonte