Su desafío, si elige aceptarlo, es, dado un número entero K >= 1
, encontrar números enteros no negativos A
y B
tal que al menos una de las dos condiciones siguientes se cumpla:
K = 2^A + 2^B
K = 2^A - 2^B
Si no existe tal A
y B
, su programa puede comportarse de cualquier manera. (Para aclarar, A
y B
puede ser igual).
Casos de prueba
A menudo hay múltiples soluciones para un número, pero aquí hay algunas:
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
El último caso de prueba 17179867136
, debe ejecutarse en menos de 10 segundos en cualquier máquina relativamente moderna. Este es un código de golf, por lo que gana el programa más corto en bytes. Puede usar un programa completo o una función.
16
, ambos5,4
y3,3
son válidos.A
,B
ser negativo? (por ejemplo,-1, -1
para 1)Respuestas:
Jalea ,
1110 bytesAplicando el truco de bit twiddling de twiddling la respuesta de Python de @xnor
Pruébelo en TryItOnline
Todos los casos de prueba también están en TryItOnline
¿Cómo?
fuente
Python 2, 43 bytes
Di eso
n==2^a ± 2^b
cona>b
. Entonces, el mayor factor de potencia de 2n
es2^b
, y podemos encontrarlo usando el truco de bits2^b = n&-n
. Eso nos permite calcular2^b + n
, que es igual2^a + 2 * 2^b
o igual2^a
. Cualquiera de los dos tiene la misma longitud de bits quea
*. Entonces, sacamos las longitudes de bits den&-n
y(n&-n)+n
, calculadas a partir de las longitudes de sus representaciones binarias. Python 3 es un byte más largo para los padres enfor k in(n,0)]
.* Excepto que
2^a + 2^b
witha==b+1
tiene una longitud de bit más larga, pero está bien porque podemos interpretar eso como2^(a+1)-2^b
.fuente
n=4
o8
o16
por favor.f(2**n)
regresa(n+1,n)
y2**(n+1)-2**n=2**n
no hay problema.bin()
en Python?0b
, de ahí el-3
.JavaScript (ES6), 73 bytes
Para el caso de resta, el primer número es el número de dígitos en la representación binaria y el segundo número es el número de ceros finales. Para el caso de la suma, restamos 1 del primer número. Si la representación binaria es todos los 1 seguidos de algunos 0, entonces se supone el caso de suma, de lo contrario se supone el caso de resta. Puerto de 36 bytes de la versión de @ xnor que solo funciona para B≤30 en JavaScript:
fuente
n=>[n,0].map(k=>((n&-n)+k).toString(2).length-1)
y ambas versiones regresan[34,11]
en el último caso de prueba (estoy usando FF 48).Perl,
524932 bytesSolución anterior (49 bytes)
Incluye +1 para
-p
Dar entrada en STDIN:
pow2.pl
Sin embargo, usar el algoritmo de xnor y agregar un giro da 32 bytes:
Solo el código:
Esto sufre un grave error de redondeo porque
13/9 = 1.444...
está bastante por encima1/log 2 = 1.44269...
(log
también tiene un error de redondeo, pero es mucho más pequeño que podemos resumirlo en el análisis de 13/9). Pero dado que cualquiera2**big - 2** small
se corrige2** big
antes del registro, esto no importa y el cálculo para2**big + 2 * 2**small
se trunca, por lo que también es seguro ... Y en el otro lado del rango2**n+2**(n-1)
no aumenta lo suficiente en el rango[0,64]
(no puedo admite más que el rango entero de todos modos debido al uso de&
) para conducir a un resultado incorrecto (el multiplicador,1.5
sin embargo, estaría demasiado lejos para números grandes).fuente
Brachylog , 23 bytes
Pruébalo en línea!
Esto es mucho más rápido de lo requerido, por ejemplo, esto todavía es inferior a 10 segundos en TIO .
Explicación
Esto es básicamente una transcripción directa de la fórmula sin optimización:
fuente
Python, 69 bytes
Las pruebas están en ideone
Como la entrada no válida puede hacer cualquier cosa, sabemos que si la entrada tiene exactamente 2 bits configurados, es la suma de esas 2 potencias de 2, y de lo contrario (si es válida) se ejecutará una cierta cantidad de bits (incluyendo la posibilidad de solo 1 bit) y será la diferencia entre la siguiente potencia más alta de 2 que el conjunto MSB y LSB.
fuente
JAVA 7,
142,140134 BYTES¡Esta es mi primera publicación en PPCG! Realmente agradecería sus comentarios sobre consejos de golf
Gracias a frozen por guardar 2 bytes
UNGOLF
ideona
fuente
40=2**3+2**5
, por ejemplo. En cuanto a ella, no veo por qué no, tal vez cometió un error de transcripción ...1
lugar de declarar una variable para él?for(int i=-1,j;[...]
Mathematica,
5754 bytes¡Guardado 3 bytes gracias a LegionMammal978!
Realmente imprime los 1 pares apropiados {a, b}.
2Log@#+1
es un límite superior para el más grandea
que puede aparecer al representar la entrada#
(el límite superior ajustado es Log [2 #] / Log [2] = 1.44 ... Log [#] + 1). Se ejecuta casi instantáneamente en la entrada de prueba, y en menos de un cuarto de segundo (en mi computadora nueva pero lista para usar) en entradas de 100 dígitos.1 Dejar que
a
comience con el valor predeterminado de 1 en lugar de 0 ahorra dos bytes; hace que la salida {0,0} se pierda cuando la entrada es 2, pero encuentra la salida {2,1} en ese caso, lo cual es lo suficientemente bueno.fuente
If[Abs[2^a-#]==2^b,Print@{a,b}]
se puede reemplazar conAbs[2^a-#]==2^b&&Print@{a,b}
para guardar 3 bytes.)MATL ,
2322 bytesPruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
Perl 6 , 41 bytes
(Algoritmo copiado descaradamente de la respuesta de Perl 5 )
Explicación:
Uso:
fuente
PHP, 73 bytes
Podría haber copiado la solución Python de Jonathan 2 para 54 bytes (+13 sobrecarga),
pero quería encontrar algo diferente.
guardar en el archivo, luego ejecutar con
php
ophp-cgi
.impresiones
a
yb
separadas por un guión bajo, cualquier cosa sin solución.solución distintiva, 96 bytes
huellas dactilares
a
yb
separadas por un guión bajo; Un único guión bajo para ninguna solución.Incluso le indica la operación para 11 bytes más:
simplemente reemplace el primer guión bajo en el código con
'-+'[!$m[2]]
.fuente
PHP, 117 bytes
Versión extendida 4 Casos
la versión corta une los casos 1 y 3 y marca la diferencia con el caso 3 y en ambas versiones el caso 4 no da salida.
fuente