Hay formas inteligentes de determinar si un número es una potencia de 2. Eso ya no es un problema interesante, así que determinemos si un entero dado es una potencia entera de -2 . Por ejemplo:
-2 => yes: (-2)¹
-1 => no
0 => no
1 => yes: (-2)⁰
2 => no
3 => no
4 => yes: (-2)²
Reglas
Puede escribir un programa o una función y utilizar cualquiera de los métodos estándar para recibir entradas y proporcionar salidas.
Su entrada es un entero único, y la salida debe ser un valor verdadero si el entero es una potencia entera de -2, y un valor falso de lo contrario. No se permite ninguna otra salida (por ejemplo, mensajes de advertencia).
Se aplican las reglas habituales de desbordamiento de enteros: su solución debe poder funcionar para enteros arbitrariamente grandes en una versión hipotética (o tal vez real) de su idioma en la que todos los enteros están ilimitados de forma predeterminada, pero si su programa falla en la práctica debido a la implementación no admite enteros tan grandes, eso no invalida la solución.
Puede usar cualquier lenguaje de programación , pero tenga en cuenta que estas lagunas están prohibidas de forma predeterminada.
Condición ganadora
Este es un concurso de código de golf : la respuesta que tiene la menor cantidad de bytes (en la codificación elegida) es la ganadora.
fuente
i
tal que(-2)^i = 2
-0.5
deberían ser válidos ya que es 2 ^ (- 1) .i
que no es naturalRespuestas:
Mathematica, 22 bytes
Pruébalo en línea! (Usando Mathics en su lugar, donde esta solución también funciona).
Intenté encontrar una solución con operadores bit a bit por un tiempo, y aunque definitivamente existe, terminé encontrando algo que probablemente sea más simple:
Max[#,-2#]
multiplica la entrada por -2 si es negativa. Multiplicar por otro factor de -2 no cambia si el valor es una potencia de -2 o no. Pero ahora todos los poderes impares de -2 se han convertido en poderes pares de -2 .Log2@...
y verificar si el resultado es un entero (para verificar si es un poder de 2 ). Esto ya ahorra dos bytesLog[4,...]
(otra forma de ver los poderes pares de -2 ).EvenQ
lugar deIntegerQ
.fuente
Log[4,...]
es más largoLog2@...
yIntegerQ
más largo queEvenQ
.Jalea , 5 bytes
Pruébalo en línea!
Cómo funciona
fuente
Python , 46 bytes
-2 bytes gracias a @ovs.
Función con uso:
Pruébalo en línea!
fuente
print g(8)
impresionesFalse
print g(4)
hace lo mismo;
lugar de una nueva línea ... perdón por eso. Arreglado @FelipeNardiBatistaJalea , 6 bytes
Pruébalo en línea!
Esto se basa en cómo Jelly convierte un entero N en cualquier base B arbitraria , al convertir N en una matriz, en la que cada entero es un dígito d de ( N ) B , que puede tener un valor 0≤ V d < B . Aquí, vamos a dígitos 0-índice desde la derecha, por lo que cada dígito añade V d B d para formar N . V d < B ⇔ V d B d < BB d = B d +1 , por lo tanto, cada posibleN tiene sólo una representación única, si ignoramos que conducen 0s en ( N ) B .
Aquí, d = input, B = -2. N = B d = 1 B d = V d B d ⇔1 = V d ⇔ V d = 1 y, dado que no estamos agregando ningún otro múltiplo de potencias de B , cualquier otra V sería 0. En este momento, la matriz debe ser un 1 concatenado con d 0s. Dado que Jelly 1 indexa desde la izquierda, debemos verificar si el primer elemento de la matriz es 1 y todos los demás elementos son 0.
Hmm ... todo bien, ¿verdad? ¿No? ¿Que esta pasando? ¡Oh sí, tengo una mejor idea! Primero, tomemos la suma de todos los enteros en la matriz, tratándola como si fuera una matriz entera y no un número en la base -2. Si es 1, significa que solo hay un 1, y todos los demás enteros son 0. Dado que no puede haber ceros a la izquierda, excepto en el caso de 0 -2(donde la suma sería 0 ≠ 1 de todos modos), el primer entero debe ser distinto de cero. El único entero distinto de cero en la matriz es el 1, por lo que debe ser el primero. Por lo tanto, este es el único caso en que la suma de todos los enteros en la matriz sería 1, porque la suma más pequeña posible de un par de enteros positivos es Σ {1,1} = 2, ya que el entero positivo más pequeño es 1 Todos los enteros en una representación base no son negativos, por lo que la única forma en que la suma es 1 es tener solo un 1, y todos los demás enteros son 0. Por lo tanto, podemos verificar si la suma de todos los enteros en el matriz es 1.
Esto es lo que hace el código:
fuente
Python 2 ,
353432 bytesPruébalo en línea!
fuente
Python 2 ,
9850 bytesPruébalo en línea!
fuente
Excel,
4036 bytesGuardado 4 bytes por CallumDA
Excel ciertamente puede hacerlo, pero corregir errores agrega 11 bytes
La entrada está en la celda
A1
. La salida esTRUE
oFALSE
Si se le permitiera devolver
FALSE
o un#NUM!
error para valores falsos, solo serían 25 bytes:fuente
=IFERROR(-2^IMREAL(IMLOG2(A1)),1)=A1
05AB1E , 8 bytes
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
ÄLY(småO
para 8.Y(sÄLm¢Z
para 8 ... Nevermind, all 8.JavaScript (ES6),
37 2824 bytesGuardado 4 bytes gracias a Arnauld.
fuente
C (gcc) ,
3429 bytesPruébalo en línea!
fuente
MATL ,
98 bytesPruébalo en línea! O verificar todos los casos de prueba .
Cómo funciona
Considere la entrada
-8
como un ejemplofuente
n
, esto crea una matriz de tamañon
como un paso intermedio. Buen trabajo que la eficiencia no es un criterio aquí!Octava , 28 bytes
Esto define una función anónima. El enfoque es similar al de mi respuesta MATL.
Pruébalo en línea!
fuente
PHP, 41 bytes
PHP, 52 bytes
PHP, 64 bytes
Trabajando con una expresión regular
fuente
Python 3, 34 bytes
fuente
JavaScript (ES6), 21 bytes
Una función recursiva que devuelve
0
otrue
.Cómo funciona
Esto no incluye ninguna prueba explícita, como
n
ser impar oabs(n)
ser menor que uno, para detener la recursividad temprano cuando la entrada no es una potencia exacta de -2.Salimos solo cuando
n
es exactamente igual a1
o0
.Sin embargo, esto funciona porque cualquier flotador IEEE-754 eventualmente se redondeará
0
cuando se divida por 2 (o -2) suficientes veces, debido al flujo inferior aritmético .Casos de prueba
Mostrar fragmento de código
fuente
C (gcc) , 33 bytes
Pruébalo en línea!
fuente
Java 7, 55 bytes
Explicación:
Código de prueba:
Pruébalo aquí
Salida:
fuente
boolean c(int n){while(0==n%-2)n/=-2;return 1==n;}
.n=0
en Java, porque0%-2==0
serátrue
y0/-2
sigue0
causando un bucle infinito, por eso agregué lan==0?0>1
parte a mi método recursivo.Haskell,
2423 bytesDefine una función
f
que devuelve1
potencias de -2 y de lo0
contrario.Una versión de golf de mi primera sumisión al otro desafío .
fuente
Javascript (ES7), 45 bytes
fuente
**
es.Perl 6 , 21 bytes
Intentalo
Expandido:
Tenga en cuenta que
0.lsb
devuelve loNil
que produce una advertencia cuando se usa como un número, por lo que//
se usa el operador definido .(Piense
//
como||
con una inclinación diferente)Se invoca implícitamente una llamada a método sin invocante donde se espera un término
$_
. (.lsb
)También funciona con
.msb
.fuente
Prólogo (SWI) , 44 bytes
Intérprete en línea
fuente
Python , 24 bytes
Pruébalo en línea!
El truco de bits
k&k-1==0
comprueba sik
es una potencia de 2 (ok==0
). Verificando estok=n*n
comon*n&n*n-1==0
nos dice siabs(n)
es una potencia de 2.Para ver más a fondo si
n
es una potencia de -2, solo necesitamos verificar eson%3==1
. Esto funciona porque mod 3, el valor -2 es igual a 1, por lo que sus poderes son 1. En contraste, sus negaciones son 2 mod 3, y por supuesto 0 da 0 mod 3.Combinamos los cheques
n*n&n*n-1==0
yn%3==1
en una sola expresión. El primero se puede escribir con<1
for==0
, ya que nunca es negativo. Eln%3==1
es equivalente an%3%2
, dando 0 o 1. Por lo tanto, podemos combinarlos comon*n&n*n-1<n%3%2
.fuente
R, 22 bytes
Toma la entrada de stdin, devuelve
TRUE
o enFALSE
consecuencia.No estoy 100% seguro de que esta sea una respuesta válida, ya que solo funciona para enteros hasta el límite de tamaño de R, y si los enteros fueran ilimitados, no funcionaría. Sin embargo, las reglas establecen:
En una hipotética versión de R que no permiten enteros sin límites, entonces se podría utilizar el siguiente código, para la misma cuenta de bytes:
Por supuesto, en R real, el código anterior simplemente da
Error in 0:Inf : result would be too long a vector
.fuente
bc 88 bytes
Tengo esto en un archivo
neg2.sh
e imprime1
para poderes de-2
y de0
otra maneraSé que es muy largo, pero fue divertido
Prueba
Explicación
El cuerpo principal tiene dos mitades, ambas están tratando de igualar cero para potencias de
-2
.fuente
Julia 0.5 , 20 bytes
Pruébalo en línea!
fuente
Fourier , 53 bytes
Trabajaré en esto más tarde, pero el resumen de esto es:
Donde la salida es
0
para falsey y1
para la verdad .Pruébalo en línea!
fuente
(G*G > X)*X
Casio BASIC , 76 bytes
Tenga en cuenta que 76 bytes es lo que dice en mi calculadora.
Esta es mi primera aventura en Casio BASIC ... Nunca me di cuenta de que podía escribir programas tan decentes en una calculadora: D
fuente
Python 2.7, 40 bytes
Créditos al Sr. Xcoder por el código original de 43 bytes de longitud. Tuve que publicar como respuesta separada ya que no tengo suficiente reputación para comentar.
fuente
int(input())
que hacer esto en Python 3, debería haber agregado lo que habría superado el límite de ladef
función similar. Además, en python 3, debe usarprint()
cuál de los dos desperdiciaría. Es por eso que elegí esa manera, porque en Python 3 se alarga ...Retina , 27 bytes
Pruébalo en línea!
Toma entrada en unario, que es bastante estándar para Retina. Las primeras dos líneas realizan una conversión parcial de unario a binario en base a las dos primeras líneas de código de la entrada del Tutorial (cualquier
1
s extraño hará que la coincidencia falle de todos modos), mientras que la última línea comprueba una potencia de cuatro o una potencia impar negativa de dos.Pruébalo en línea!
Esta vez hago conversión unaria parcial a base cuatro. Los poderes de cuatro terminan como
^1_*$
mientras que los poderes impares negativos de dos terminan como^-11_*$
.Pruébalo en línea!
Esta vez sigo dividiendo entre cuatro tanto como puedo y compruebo por
1
o-11
al final.Pruébalo en línea!
Otra forma de dividir entre cuatro. Y todavía molesto 27 bytes ...
fuente
Esquema, 60 bytes
Solución recursiva.
fuente