Escreva algumas instruções que contarão o número de unidades em um número inteiro de dezesseis bits não assinado.
Por exemplo, se a entrada for 1337
, então o resultado é 6
devido 1337
como um número binário de dezesseis bit é 0000010100111001
, que contém seis queridos.
Respostas:
80386 Código da máquina, 4 bytes
que recebe o número inteiro
cx
e gera a contagemax
e é equivalente a:E aqui está uma solução de
1110 bytes que não usa POPCNT:que é equivalente a:
fonte
ax
ecx
comeax
eecx
muda-a para 32 bits. O bytecode é o mesmo para ambos.Python 2, 17 bytes
O
bin
interno retorna o número inteiro convertido em uma seqüência de caracteres binária. Contamos então os1
dígitos:fonte
J (5 caracteres)
J não tem tipos explícitos. Isso faz a coisa certa para todos os números inteiros.
+/
a soma@
do#:
a representação de base doisfonte
C, 21
você disse "escreva algumas instruções" (não "uma função"), portanto, assumi que o número é fornecido
x
e o número de 1 é retornadon
. Se não precisar inicializarn
, posso salvar 3 bytes.Esta é uma adaptação da famosa expressão
x&x-1
para testar se algo é uma potência de 2 (falso se for, verdadeiro se não for).Aqui está em ação o número 1337 da pergunta. Observe que subtrair 1 vira o 1 bit menos significativo e todos os zeros para a direita.
EDIT: para completar, aqui está o algoritmo ingênuo, que é um byte mais longo (e um pouco mais lento).
fonte
{}
. É uma tarefa tão simples que não deveria me surpreender que alguém já a tenha apresentado.for(n=0;x;x/=2)n+=x&1;
Gelatina , não concorrente
Essa resposta não é competitiva, pois o idioma foi criado após o lançamento do desafio.
2 bytes:
Jelly é uma nova linguagem escrita por @Dennis, com sintaxe semelhante a J.
Experimente aqui .
fonte
Pitão, 4 bytes
O programa leva o número cujo peso do hamming pode ser encontrado no STDIN.
fonte
Julia,
292719 bytesIsso cria uma função anônima que aceita um único argumento
n
,. Para usá-lo, atribua-o a algo comof=n->...
e chame-o comof(1337)
.A
digits()
função, quando chamada com 2 argumentos, retorna uma matriz dos dígitos da entrada na base fornecida. Então,digits(n, 2)
retorna os dígitos binários den
. Pegue a soma da matriz e você terá o número de unidades na representação binária den
.fonte
count_ones
CJam, 6 bytes
Experimente online aqui
fonte
Joe , 4 bytes
Esta é uma função anônima.
Ba
fornece a representação binária de um número e o/+
soma.fonte
R, 24 bytes
scan()
lê a entrada de stdin.intToBits()
pega um número inteiro e retorna um vetor do tipo queraw
contém os zeros e os da representação binária da entrada.intToBits(scan())>0
retorna um vetor lógico onde cada elemento estáTRUE
se o elemento do vetor binário correspondente for 1 (já que todos os elementos são 0 ou 1 e 1> 0), caso contrárioFALSE
.Em R, você pode somar um vetor lógico para obter o número de
TRUE
elementos, portanto, somar o vetor de lógicos como acima nos dá o que queremos.Observe que
sum()
não é possível manipular araw
entrada diretamente, portanto, a solução alternativa usando lógicas.fonte
sum(intToBits(scan()))
seria o mesmo?sum()
que não pode receber entrada do tiporaw
, que é o que é retornadointToBits()
.Ruby, 18 bytes
n.to_s(2).count'1'
fonte
n.to_s(2).count ?1
também funciona, mas é o mesmo comprimentoQuarto,
4849 bytesSe uma função real for necessária, a segunda linha se tornará
e você chama "1337 c". As palavras de controle relativamente detalhadas da Forth fazem com que seja difícil (na verdade, elas tornam muito difícil).
Editar: minha versão anterior não lidava com números negativos corretamente.
fonte
Mathematica,
2218 bytesObrigado a alephalpha por me lembrar
DigitCount
.fonte
ES6 (
342221 bytes):Esta é uma função recursiva simples que pode ser reduzida um pouco mais. Simplesmente demora um pouco e roda novamente:
Experimente em http://www.es6fiddle.net/imt5ilve/ (você precisa do
var
motivo'use strict';
).Não acredito que derrotei o peixe !!!
O antigo:
ES5 (39 bytes):
Ambas as funções podem ser facilmente adaptadas ao ES5:
Antigo:
O @ user1455003 me deu uma ótima idéia, que 'desencadeou' a menor:
Eu o adaptei ao ES6 e o tornei recursivo para diminuir muito!
fonte
> <> (Peixe) , 24 bytes + 2 = 26
O programa apenas repete o mod 2, subtrai e divide até que o número de entrada se torne zero e depois imprime a soma do mod 2s.
Teste com a
-v
bandeira, por exemplofonte
-v
versão bandeira ainda funciona.)PHP (38 bytes):
Isso usa a mesma abordagem da minha resposta ES6
Este é um código completo, você só precisa colocá-lo em um arquivo e acessá-lo sobre o navegador, com o parâmetro
n=<number>
.PHP <4.2 (32 bytes):
Isso é um pouco mais curto:
Isso só funciona de maneira confiável no PHP <4.2, porque a diretiva
register_globals
foi definidaOff
por padrão do PHP4.2 até o PHP5.4 (que foi removido até então).Se você criar um
php.ini
arquivo comregister_globals=On
, isso funcionará.Para usar o código, acesse o arquivo usando um navegador, com POST ou GET.
Sugestão de @ViniciusMonteiro (38/45 bytes):
Ele deu duas sugestões muito boas que têm um uso muito interessante da função
array_sum
:38 bytes:
45 bytes:
Essa é realmente uma ótima idéia e pode ser reduzida um pouco mais, para ter 36 bytes de comprimento:
fonte
<?=substr_count(decbin(1337),"1");
(34 bytes)<?=substr_count(decbin(1337),1);
. Isso é um total de 32 bytes. Considerando que é um código suficientemente diferente, você não deseja publicá-lo como sua própria resposta? Eu certamente vou votar!<?=substr_count(decbin($argv[1]),1);
(ou$_GET[n]
; 36 bytes)C #, 45 bytes
https://dotnetfiddle.net/kJDgOY
fonte
b-48
é ainda mais curto, AFAIKJapt, 3 bytes (não competitivo)
Experimente aqui.
fonte
¢o1 l
também funcionaria. Outra abordagem interessante é-¢¬r-0
;¢¬
divide em uma matriz de dígitos binários,r-0
reduz por subtração, começando em 0 e-
nega o resultado, tornando-o positivo.¢¬x
.cera de abelha ,
3127 bytesResposta não concorrente. A cera de abelha é mais nova que esse desafio.
Esta solução usa a maneira de Brian Kherigan de contar bits definidos no site “Bit Twiddling Hacks”.
apenas percorre um loop, incrementando a contagem de bits, enquanto percorre
number=number&(number-1)
aténumber = 0
. A solução só passa pelo loop sempre que houver bits definidos.Eu poderia raspar 4 bytes reorganizando algumas instruções. O código-fonte e a explicação foram atualizados:
Explicação:
Clone meu repositório GitHub que contém o intérprete de cera de abelha, especificações de linguagem e exemplos.
fonte
Java, 17 bytes
Trabalha para
byte
,short
,char
eint
. Use como um lambda.Teste aqui
Sem usar built-ins:
42 bytes
Teste aqui
fonte
Clipe , 6
2 maneiras:
Esta é uma tradução direta do requisito: a contagem de unidades na representação base-2 do número.
Outro método, que leva a soma dos dígitos da representação base-2.
fonte
Oitava, 18
Exemplo:
fonte
GML (linguagem do criador de jogos), 21 bytes
fonte
Bytes em C # 39
fonte
Perl, 21
fonte
PowerShell (51 bytes)
Explicação:
[convert]::ToString($s,2)
produz uma representação de sequência binária de$s
.[char[]]
lança como uma matriz de caracteres e nos permite enumerar cada caracter.|%{"+$_"}
precede cada caractere com um sinal + que"$()"
implica implicitamente.ToString()
na subexpressão resultante,|iex
somando a cadeia de caracteres canalizada (por exemplo, "+1 +0 +1 +1 +0 +1 +0 +0" = 4)fonte
-join
do operador e um implícito.ToString()
para alcançar 45 bytes com[char[]][convert]::ToString($s,2)-join'+'|iex
... OU, como o uso abordagem em linha diferente-replace
operadora a atingir 43 bytes com([convert]::ToString($s,2)-replace0).length
Clojure, 42 bytes
Lendo da direita para a esquerda, converta em uma seqüência de caracteres binária, converta em uma sequência de caracteres, filtre em se
1
conte quantos você possui.EDITADO Com a ajuda de Sieg
fonte
#(count(filter #{\1}(Integer/toString% 2)))
#(count(filter #{\1}(Integer/toString % 2)))
CompilerException java.lang.IllegalArgumentException: No matching method: toString_PERCENT_
Integer/toString
. Funcionou um segundo atrás, no entanto.Haskell 42 chars
declara o
f :: Integer -> Integer
uso da função do intérprete interativo como
f <number>
ou adiciona a linhamain=print$f <number>
ao final do arquivo.fonte
rem n 2
s em vez de criar uma lista deles e usando emdiv
vez dequot
:t 0=0
t n=t(div n 2)+rem n 2
- nãof
mais.Matlab, 13 bytes
de2bi
cria um vetor de zeros e uns que representam o número binário esum
apenas retorna a soma de todas as entradas.fonte
4, 4 caracteres / 11 bytes (não competitivo)
Try it here (Firefox only).
Explicação
Converte a entrada em binário, divide-se ao longo de caracteres e obtém a soma da matriz resultante.
fonte