inspirado pela contagem regressiva do infinito
Dado um número inteiro não negativo N
, imprima o número de repetições das seguintes etapas necessárias para atingir 0:
- Converta
N
em binário (4812390 -> 10010010110111001100110
) - Virar cada bit (
10010010110111001100110 -> 01101101001000110011001
) - Cortar zeros à esquerda (
01101101001000110011001 -> 1101101001000110011001
) - Converter de volta para decimal (
1101101001000110011001 -> 3576217
)
Regras
- Entrada e saída podem estar em qualquer formato inequívoco e consistente
- A entrada estará dentro do intervalo inteiro representável nativo do seu idioma (se o seu idioma suportar números inteiros arbitrariamente grandes, não haverá limite)
Casos de teste
0 -> 0
1 -> 1
42 -> 6
97 -> 3
170 -> 8
255 -> 1
682 -> 10
8675309 -> 11
4812390 -> 14
178956970 -> 28
2863311530 -> 32
Essa sequência é A005811 no OEIS.
~(~a) == a
Respostas:
Geléia ,
64 bytesExperimente online! ou verifique todos os casos de teste .
fundo
Seja n um número inteiro não negativo.
Passos 2 e 3 do processo descrito na especificação pode, alternativamente, ser indicado como a remoção de todos os principais 1 's e alternando os restantes bits.
Isso significa que removeremos exatamente um grupo de dígitos binários adjacentes e iguais em cada iteração; portanto, o Comprimento da contagem regressiva binária de n é apenas o número desses grupos na representação binária de n . Para os propósitos deste desafio, pense em 0 como não tendo dígitos.
Para n = 8675309 , o processo parece da seguinte forma em binário.
Em vez de contar esses grupos (o que falharia no caso 0 de extremidade ), fazemos o seguinte.
n e n: 2 têm as seguintes representações binárias.
Observe que a representação binária de n: 2 é simplesmente n , deslocada um bit para a esquerda.
Se XOR n e n: 2 , obteremos 1 (MSB) e 1 adicional para cada par de dígitos adjacentes diferentes. O número de grupos é, portanto, igual ao número de bits definidos em n ⊻ n: 2 .
Como funciona
fonte
Python 2, 30 bytes
Teste em Ideone .
fundo
Seja n um número inteiro não negativo.
Passos 2 e 3 do processo descrito na especificação pode, alternativamente, ser indicado como a remoção de todos os principais 1 's e alternando os restantes bits.
Isso significa que removeremos exatamente um grupo de dígitos binários adjacentes e iguais em cada iteração; portanto, o Comprimento da contagem regressiva binária de n é apenas o número desses grupos na representação binária de n . Para os propósitos deste desafio, pense em 0 como não tendo dígitos.
Para n = 8675309 , o processo parece da seguinte forma em binário.
Em vez de contar esses grupos (o que falharia no caso 0 de extremidade ), fazemos o seguinte.
n e n: 2 têm as seguintes representações binárias.
Observe que a representação binária de n: 2 é simplesmente n , deslocada um bit para a esquerda.
Se XOR n e n: 2 , obteremos 1 (MSB) e 1 adicional para cada par de dígitos adjacentes diferentes. O número de grupos é, portanto, igual ao número de bits definidos em n ⊻ n: 2 .
fonte
Python 2, 29 bytes
Conta o número de alternâncias entre 0 e 1 na expansão binária, contando o 1 inicial como uma alternância. Faz isso verificando se os dois últimos dígitos binários são diferentes e, em seguida, recorrendo ao número com o último dígito removido. Os dois últimos dígitos são diferentes exatamente se
n%4
for 1 ou 2, que pode ser marcado como-n%4/2
.fonte
JavaScript (ES6), 26 bytes
Funciona contando as transições entre 0 e 1. Funciona apenas até 31 bits. 29 bytes para suportar 53 bits:
fonte
Haskell, 34 bytes
fonte
05AB1E ,
75 bytesEconomizou 2 bytes graças a Dennis .
Sem a aresta de 0, isso pode ser de 3 bytes
bÔg
.Experimente online! ou como um conjunto de testes
Explicação
fonte
CJam , 14 bytes
Experimente online!
Basicamente, uma imitação da minha resposta à outra pergunta.
fonte
Java 7,
112 108 100 9073 bytesIdeia básica
fonte
j=j/2
pode ser reduzido paraj/=2
. Além disso, uma ótima resposta!int c(int i){return i>0?((i^(i>>=1))%2+c(i):0;}
( 47 bytes ). Eu ainda deixaria sua resposta atual também, já que é mais original, e as portas de outros usuários são o oposto completo do original. :)J, 14 bytes
Conta o número de execuções nos dígitos binários de n com o caso especial retornando 0 para n = 0.
Uso
Explicação
fonte
CJam ,
1110 bytesObrigado a @Dennis por salvar um byte!
Experimente online!
Explicação
fonte
e&
(AND lógico) salva um byte\g*
.Raquete 349 bytes
Ungolfed:
Teste:
Resultado:
fonte
tl
eib
para nomes de 1 byte.MATL , 7 bytes
Experimente online!
Explicação
fonte
Vim,
6259 bytes-3 bytes graças a DJMcMayhem
Aqui está a saída xxd com os caracteres não imprimíveis intactos:
Experimente online!
Explicação
fonte
:s/^0*
é um byte menor que:s/^0\+
, e enquanto você estiver no registro "eval", você pode fazer apenaspr<S-tab>'%b',<C-r>")
pelo preenchimento automático. (Salva 4 bytes):s/^0*
lo porque ele corresponde a uma linha vazia e preciso que ele falhe para que a linha vazia escape para a macro recursiva.Ruby, 26 bytes
Inspirado pela resposta Python do xnor.
fonte
PHP, 64 bytes
com base na minha solução de contagem regressiva
imprime
1
caracteresk
tempos dos , ondek
é o número de iterações.+4 bytes para saída inteira: (saída vazia para
0
)fonte
JavaScript (ES6), 44
Função recursiva
Limitado ao número inteiro positivo javascript, 31 bits:
Gerenciando número de precisão dupla até 53 bits significativos - 59 bytes:
De outra maneira: usando o incrível algoritmo de @Dennis, função não recursiva gerenciando 53 bits, 43 bytes:
fonte
PHP, 51 bytes
Usa um regex para contar o número de execuções de 1 ou 0. Infelizmente, isso precisa de um caso especial para a entrada
0
que requer 3 bytes adicionais (e fornece um aviso).fonte
o
evitar o aviso. b) Você pode salvar 3 bytes com a-F
bandeira e, em$argn
vez de$argv[1]
. c)/1+|0+/
deve ser suficiente para o regex.Java 7, 71 bytes
int b(Long a){return a==0?0:1+b(~a&-1L>>>64-a.toString(a,2).length());}
Eu sei que isso é derrotado pela solução do Geobits
split
(que será publicada), mas ainda assim foi divertido escreverfonte
Oitava, 47 bytes
De acordo com a entrada da OEIS, o valor que procuramos como solução para este desafio é também igual ao número de
1
s no código Gray para o número inteiro especificado.A Wikipedia me diz que o código Gray pode ser calculado como x ^ (x >> 1), portanto, na função acima, calculo o código Gray como tal, converto-o em uma string binária e conto quantos dígitos dessa string
1
.fonte
Java 7, 64 bytes
Eu sei que isso pode ser derrotado por um porto de uma das melhores respostas, mas eu criei isso no chat e não consigo postá-lo depois que Poke disse algo sobre isso :)
fonte
C, 76 bytes
Funciona para todos os casos de teste (por mais que eu não queira incluir a palavra não assinado ou o último caso de teste) ...
fonte
Bash, 57 bytes
Pacotes: Utilitários Principais, grep, sed, vim (para
xxd
)Suponha que o número seja fornecido em formato binário. Qualquer comprimento é aceitável :)
fonte
Perl 5 , 31 + 1 (
p
) = 32 bytesExperimente online!
Usando o método de @ Dennis.
fonte
Tcl , 119 bytes
Experimente online!
Ainda muito destruída pelo meu gosto
fonte