Introdução
Esse desafio exige que você defina os zeros à direita de uma representação binária de números inteiros 010101…
, isso é melhor explicado com um exemplo:
Dado o número inteiro 400
, o primeiro passo é convertê-lo em binário:
110010000
Como podemos ver, o quinto bit é o menos significativo 1
; portanto, a partir daí, substituímos os zeros inferiores por 0101
:
110010101
Finalmente, convertemos isso de volta para decimal: 405
Desafio
Dado um retorno / saída inteiro positivo, o valor resultante correspondente do processo acima definido.
Regras
- Essa sequência é definida apenas para números inteiros com pelo menos um
1
bit, portanto a entrada sempre será ≥ 1 - Você pode usar a entrada como uma sequência de caracteres, lista de dígitos (decimal)
- Você não precisa lidar com entradas inválidas
Casos de teste
Aqui estão mais alguns casos de teste com as etapas intermediárias (você não precisa imprimi-las / devolvê-las):
In -> … -> … -> Out
1 -> 1 -> 1 -> 1
2 -> 10 -> 10 -> 2
3 -> 11 -> 11 -> 3
4 -> 100 -> 101 -> 5
24 -> 11000 -> 11010 -> 26
29 -> 11101 -> 11101 -> 29
32 -> 100000 -> 101010 -> 42
192 -> 11000000 -> 11010101 -> 213
400 -> 110010000 -> 110010101 -> 405
298 -> 100101010 -> 100101010 -> 298
n
é a potência máxima de 2 que divide a entrada, a resposta é simplesmente #(input) + ceil((2^n - 2)/3)
Respostas:
Python 3 , 20 bytes
Experimente online!
Explicação
Tome
192
como exemplo. Sua forma binária é11000000
e precisamos convertê-la para11010101
.Observamos que precisamos adicionar
10101
ao número. Esta é uma série geométrica (4^0 + 4^1 + 4^2
), que tem uma forma fechada como(4^3-1)/(4-1)
. É o mesmo que4^3//3
onde//
denota divisão inteira.Se fosse
101010
, ainda seria uma série geométrica (2×4^0 + 2×4^1 + 2×4^2
),2×4^3//3
pelas razões acima.Enfim,
4^3
e2×4^3
seria apenas o bit menos significativo que obtemos porn&-n
:Percebemos que o complemento de
n
é00111111
. Se adicionarmos um, ele se tornará01000000
e só se sobrepõen=11000000
ao dígito menos significativo. Observe que "complementar e adicionar um" é apenas negação.fonte
lambda n:(n&-n)//3+n
funciona também? Passa em todos os casos de teste de amostra , mas, de acordo com minha intuição, não deve ser válido, certo?Gelatina , 5 bytes
Experimente online!
Desta vez, um porto da abordagem de Leaky Nun (pelo menos eu o ajudei a jogar um pouco: P)
Geléia , 7 bytes
Experimente online!
Utiliza a abordagem fantástica de JungHwan Min , com a ajuda indireta de Martin Ender .
fonte
&N:3|
. Parabéns; você venceu o Dennis na geléia! (Mas não completamente fora-golfed.)Wolfram Language (Mathematica) ,
36282624 bytes-8 bytes graças a @MartinEnder e -2 bytes graças a @ Mr.Xcoder
Experimente online!
Precisamos apenas encontrar o número de zeros à direita na entrada e encontrar o número com
0
s e s alternados1
com comprimento um menor que isso e adicioná-lo à entrada.Então,
400 -> 11001000 -> 110010000 + 0000 -> 110010101 + 101 -> 405
A fórmula explícita para o
n
número com1
s e s alternados0
foi dada em A000975 no OEIS. Podemos usar on
número th, já que dois números diferentes não podem ter o mesmo comprimento em binário e ter dígitos alternados.fonte
2^#~IntegerExponent~2
é(BitXor[#,#-1]+1)/2
#+⌊(#~BitAnd~-#)/3⌋&
lugar.J ,
1918 bytesExperimente online!
Explicação Rápida
Esta é uma resposta antiga, mas é muito semelhante à atual, mas conta os zeros à direita de maneira diferente. Veja os comentários para um link explicando como funciona.
Outras respostas:
Resposta anterior (19 bytes).
Mais do que deveria, porque
\
vai da direita para a esquerda.fonte
+(2|-.i.@#.-.)&.#:
#.~
conta o número de verdades finais , então o que precisamos é#.~ -. #:
contar o número de zeros finaisJulia 0,6 , 12 bytes
Experimente online!
fonte
((!n=(n|n))&-n)/3
, ou!n=(((n|n)&(-n))/3)
etc.|
é+
e&
é como*
. Portanto,n|n&-n÷3
é analisado comon | ((n&-n) ÷3)
.JavaScript (ES6),
4039 bytesRecebe a entrada como um número inteiro de 32 bits.
Casos de teste
Mostrar snippet de código
fonte
05AB1E ,
1385 bytesEconomizou 5 bytes graças à fórmula pura do Sr. Xcoder e JungHwan Min
Economizou outros 3 graças ao Sr. Xcoder
Experimente online!
Explicação
fonte
(<bitwise and here>3÷+
deve funcionar para ~ 5 bytes.R ,
7158 bytesgraças ao NofP por -6 bytes
Experimente online!
Assume que a entrada é um número inteiro de 32 bits. R só assinou números inteiros de 32 bits (convertidos para
double
quando um número inteiro excede) de qualquer maneira e nenhuma entrada de 64 bits ou não assinada.fonte
which.max(n):1-1
que!cumsum(n)
para obter uma solução de 65 bytesbrainfuck , 120 bytes
Experimente Online!
Inicia com o valor na célula atual e termina na célula com o valor de saída. Obviamente, não funcionará em números acima de 255, já que esse é o limite de células para um típico ataque cerebral, mas funcionará se você assumir um tamanho infinito de células.
fonte
PowerShell , 168 bytes
Experimente online!
Ai. A conversão de / para fatias binárias e de array não é realmente o ponto forte do PowerShell.
Recebe a entrada
$n
como um número. Nós imediatamenteconvert
que a base binária2
e armazenar isso em$a
. Em seguida, temos uma construção if / else. A cláusula if testa se umregex
Match
contra 1 ou mais0
s no final da string ('0+$'
) temindex
um local maior que0
(isto é, o início da string binária). Se isso acontecer, temos algo para trabalhar,else
apenas fornecemos o número.Dentro do
if
, dividimos osx
primeiros dígitos e os concatenamos+
com os dígitos restantes. No entanto, para os dígitos restantes, passamos por eles e selecionamos um0
ou1
a ser produzido, usando$i++%2
para escolher. Isso nos dá o010101...
padrão em vez de0
s no final. Nós, então-join
,$c
voltamos a formar uma string e a revertemos para umaInt32
base2
.Em qualquer das situações, o número é deixado no pipeline e a saída é implícita.
fonte
APL + WIN, 43 bytes
Solicita entrada de tela
fonte
PowerShell ,
4136 bytesExperimente online! ou Verifique todos os casos de teste
Resposta Python do Porto da Freira Furada .
Economizou 5 bytes graças a Leaky Nun
fonte
PHP , 47 bytes
Experimente online!
Realmente apenas mais uma porta da solução da @Leaky Nun
fonte
Perl 5 , 54 bytes
Experimente online!
fonte
Python 3 , 56 bytes
Experimente online!
Ainda não estou feliz com isso, mas não queria usar a fórmula ... -2 graças a Rod . -1 graças a Jonathan Frech .
fonte
eval(...)
em vez deint(...,2)
poderia salvar um byte.Ruby , 15 bytes
Outro porto da abordagem de Leaky Nun.
Experimente online!
fonte
Ferrugem , 18 bytes
Um porto da abordagem de Leaky Nun
Experimente online!
fonte
AWK , 24 bytes
Um porto da resposta Mathmatica de JungHwan Min
Experimente online!
fonte
JavaScript ES6, 13 bytes
fonte
C, 56 bytes
Experimente online!
C (gcc), 50 bytes
Experimente online!
5148 bytes usando a solução de Arnauld :Obrigado a @ l4m2 por salvar três bytes!
Experimente online!
43 com o gcc:
Experimente online!
fonte
0xAAAAAAAA
=>-1u/3*2
Pari / GP , 19 bytes
Um porto da abordagem de Leaky Nun.
Experimente online!
fonte
Gelatina , 13 bytes
Experimente online!
Explicação
Tome 24 como exemplo de entrada.
fonte