Seu desafio, caso você aceite aceitá-lo, é que, dado um número inteiro K >= 1
, encontre números inteiros não negativos A
e de B
modo que pelo menos uma das duas condições a seguir seja mantida:
K = 2^A + 2^B
K = 2^A - 2^B
Se não existe tal A
e B
, seu programa pode se comportar de qualquer forma. (Para esclarecer A
e B
pode ser igual.)
Casos de teste
Muitas vezes, existem várias soluções para um número, mas aqui estão algumas:
K => A, B
1 => 1, 0
15 => 4, 0 ; 16 - 1 = 15
16 => 5, 4 ; 32 - 16 = 16; also 3, 3: 8 + 8 = 16
40 => 5, 3 ; 2^5 + 2^3 = 40
264 => 8, 3
17179867136 => 34, 11 ; 17179869184 - 2048 = 17179867136
O último caso de teste 17179867136
, deve ser executado em menos de 10 segundos em qualquer máquina relativamente moderna. Como é um código de golfe, o programa mais curto em bytes vence. Você pode usar um programa completo ou uma função.
16
, ambos5,4
e3,3
são válidos.A
,B
ser negativo? (por exemplo,-1, -1
para 1)Respostas:
Geléia ,
1110 bytesAplicando o truque de twiddling da resposta Python por @xnor
Teste em TryItOnline
Todos os casos de teste também estão em TryItOnline
Quão?
fonte
Python 2, 43 bytes
Diga isso
n==2^a ± 2^b
coma>b
. Então, o maior fator de potência-2 den
é2^b
e podemos encontrá-lo usando o truque de bits2^b = n&-n
. Isso permite calcular2^b + n
, o que é igual2^a + 2 * 2^b
ou justo2^a
. Qualquer um tem o mesmo comprimento de bit quea
*. Então, produzimos os comprimentos de bits den&-n
e(n&-n)+n
calculados a partir dos comprimentos de suas representações binárias. O Python 3 é um byte mais longo para parênteses nofor k in(n,0)]
.* Exceto que
2^a + 2^b
witha==b+1
tem um comprimento de bit mais longo, mas tudo bem, porque podemos interpretar isso como2^(a+1)-2^b
.fonte
n=4
ou8
ou16
por favor.f(2**n)
retorna(n+1,n)
e,2**(n+1)-2**n=2**n
portanto, não há problema.bin()
Python?0b
, daí o-3
.JavaScript (ES6), 73 bytes
Para o caso de subtração, o primeiro número é o número de dígitos na representação binária e o segundo número é o número de zeros à direita. Para o caso de adição, subtraímos 1 do primeiro número. Se a representação binária for todos os 1s seguidos por alguns 0s, o caso de adição será assumido, caso contrário, o caso de subtração será assumido. Porta de 36 bytes da versão do @ xnor que funciona apenas para B≤30 em JavaScript:
fonte
n=>[n,0].map(k=>((n&-n)+k).toString(2).length-1)
E ambas as versões retornam[34,11]
no último caso de teste (estou usando o FF 48).Perl,
524932 bytesSolução antiga (49 bytes)
Inclui +1 para
-p
Dê entrada no STDIN:
pow2.pl
No entanto, o uso do algoritmo do xnor e a adição de um twist fornecem 32 bytes:
Apenas o código:
Isso sofre um erro grave de arredondamento porque
13/9 = 1.444...
está um pouco acima1/log 2 = 1.44269...
(log
ele também tem um erro de arredondamento, mas é muito menor que podemos envolvê-lo na análise de 13/9). Mas como qualquer2**big - 2** small
correção é corrigida2** big
antes do log, isso não é importante e o cálculo para2**big + 2 * 2**small
truncado também é seguro. E no outro lado da faixa2**n+2**(n-1)
não há aumento suficiente na faixa[0,64]
(não posso corretamente de qualquer forma, suporte mais do que o intervalo inteiro devido ao uso de&
) para levar a um resultado errado (1.5
no entanto, o multiplicador seria muito distante para números grandes).fonte
Braquilog , 23 bytes
Experimente online!
Isso é muito mais rápido do que o necessário, por exemplo, ainda é inferior a 10 segundos no TIO .
Explicação
Esta é basicamente uma transcrição direta da fórmula sem otimização:
fonte
Python, 69 bytes
Os testes estão em ideone
Como a entrada não válida pode fazer qualquer coisa, sabemos que se a entrada tiver exatamente 2 bits configurados, será a soma desses 2 poderes de 2 e, caso contrário (se válido), será executado um número de bits (incluindo a possibilidade de apenas 1 bit) e será a diferença entre a próxima potência mais alta de 2 do que o conjunto MSB e LSB.
fonte
JAVA 7,
142,140, 134 BYTESEste é o meu primeiro post no PPCG! Eu realmente gostaria de receber feedback sobre dicas de golfe
Graças a congelado por salvar 2 bytes
UNGOLF
ideona
fonte
40=2**3+2**5
, por exemplo. Olhando para ele, eu não posso ver por que não, talvez eu tenha cometido um erro de transcrição ...1
vez de declarar uma variável para ele?for(int i=-1,j;[...]
Mathematica,
5754 bytesEconomizou 3 bytes graças a LegionMammal978!
Na verdade, imprime todos os 1 pares apropriados {a, b}.
2Log@#+1
é um limite superior para o maiora
que pode aparecer ao representar a entrada#
(o limite superior restrito é Log [2 #] / Log [2] = 1,44 ... Log [#] + 1). É executado quase instantaneamente na entrada de teste e em menos de um quarto de segundo (no meu computador novo, mas pronto para uso) em entradas de 100 dígitos.1 Deixar
a
iniciar no valor padrão de 1 em vez de 0 salva dois bytes; faz com que a saída {0,0} seja perdida quando a entrada é 2, mas localiza a saída {2,1} nesse caso, o que é bom o suficiente.fonte
If[Abs[2^a-#]==2^b,Print@{a,b}]
pode ser substituída comAbs[2^a-#]==2^b&&Print@{a,b}
a economizar 3 bytes.)MATL ,
2322 bytesExperimente online! Ou verifique todos os casos de teste .
Explicação
fonte
Perl 6 , 41 bytes
(Algoritmo copiado descaradamente da resposta Perl 5 )
Explicação:
Uso:
fonte
PHP, 73 bytes
Eu poderia ter copiado a solução Pyhton 2 de Jonathan por 54 bytes (+13 em cima),
mas queria criar algo diferente.
salve no arquivo e execute com
php
ouphp-cgi
.imprime
a
eb
separado por um sublinhado, qualquer coisa sem solução.solução distinta, 96 bytes
imprime
a
eb
separado por um sublinhado; um único sublinhado para nenhuma solução.Ele ainda informa a operação por mais 11 bytes:
basta substituir o primeiro sublinhado no código por
'-+'[!$m[2]]
.fonte
PHP, 117 bytes
Versão estendida 4 Cases
a versão curta une os casos 1 e 3 e faz diferença no caso 3 e, nas duas versões, o caso 4 não fornece saída.
fonte