Existem maneiras inteligentes de determinar se um número é uma potência de 2. Isso não é mais um problema interessante, então vamos determinar se um número inteiro é uma potência de -2 . Por exemplo:
-2 => yes: (-2)¹
-1 => no
0 => no
1 => yes: (-2)⁰
2 => no
3 => no
4 => yes: (-2)²
Regras
Você pode escrever um programa ou uma função e usar qualquer um dos métodos padrão de recebimento de entrada e saída.
Sua entrada é um único número inteiro e a saída deve ser um valor verdadeiro se o número inteiro for uma potência inteira de -2 e, caso contrário, um valor falso. Nenhuma outra saída (por exemplo, mensagens de aviso) é permitida.
As regras usuais de estouro de números inteiros se aplicam: sua solução deve ser capaz de trabalhar com números inteiros arbitrariamente grandes em uma versão hipotética (ou talvez real) do seu idioma, na qual todos os números inteiros são ilimitados por padrão, mas se o seu programa falhar na prática devido à implementação não suporta números inteiros tão grandes, que não invalida a solução.
Você pode usar qualquer linguagem de programação , mas observe que essas brechas são proibidas por padrão.
Condição vencedora
Este é um concurso de código-golfe : a resposta que tiver menos bytes (na codificação escolhida) é a vencedora.
fonte
i
tal que(-2)^i = 2
-0.5
devem ser válidos, pois são 2 ^ (- 1) .i
não é naturalRespostas:
Mathematica, 22 bytes
Experimente online! (Em vez disso, usando a matemática, onde esta solução também funciona.)
Tentei encontrar uma solução com operadores bit a bit por um tempo e, embora exista definitivamente, acabei encontrando algo que provavelmente é mais simples:
Max[#,-2#]
multiplica a entrada por -2 se for negativo. A multiplicação por outro fator de -2 não muda se o valor é uma potência de -2 ou não. Mas agora todos os poderes ímpares de -2 foram transformados em poderes pares de -2 .Log2@...
e verificar se o resultado é um número inteiro (para verificar se é uma potência de 2 ). Isso já economiza mais dois bytesLog[4,...]
(outra maneira de analisar as potências pares de -2 ).EvenQ
vez deIntegerQ
.fonte
Log[4,...]
é maior queLog2@...
eIntegerQ
é maior queEvenQ
.Gelatina , 5 bytes
Experimente online!
Como funciona
fonte
Python , 46 bytes
-2 bytes graças a @ovs.
Função com uso:
Experimente online!
fonte
print g(8)
gravurasFalse
print g(4)
faz o mesmo;
vez de uma nova linha ... desculpe por isso. Corrigido @FelipeNardiBatistaGelatina , 6 bytes
Experimente online!
Isso se baseia em como o Jelly converte um número inteiro N em qualquer base arbitrária B , fazendo isso convertendo N em uma matriz, na qual cada número inteiro é um dígito d de ( N ) B , que pode ter um valor 0≤ V d < B . Aqui, vamos 0-índice dígitos da direita, de modo que todos os dígitos adiciona V d B d para formar N . V d < B ⇔ V d B d < BB d = B d +1 , portanto, todos os possíveisN tem apenas uma única representação, se ignorarmos 0s principais em ( N ) B .
Aqui, d = entrada, B = -2. N = B d = 1 B d = V d B d ⇔ 1 = V d ⇔ V d = 1 e, como não estamos adicionando outros múltiplos de potências de B , todos os outros V seriam 0. No momento, a matriz deve ser 1 concatenada com d 0s. Como o Jelly 1 indexa da esquerda, devemos verificar se o primeiro elemento do array é 1 e todos os outros elementos são 0.
Hmm ... tudo bem, certo? Não? O que está acontecendo? Ah, sim, tenho uma ideia melhor! Primeiro, vamos pegar a soma de todos os números inteiros na matriz, tratando-a como se fosse uma matriz inteira e não um número na base -2. Se for 1, significa que existe apenas um 1 e todos os outros números inteiros são 0. Como não pode haver zeros à esquerda, exceto no caso de 0 -2(onde a soma seria 0 ≠ 1 de qualquer maneira), o primeiro número inteiro deve ser diferente de zero. O único número inteiro diferente de zero na matriz é o 1, portanto deve ser o primeiro. Portanto, este é o único caso em que a soma de todos os números inteiros na matriz seria 1, porque a menor soma possível de um par de números inteiros positivos é Σ {1,1} = 2, pois o menor número inteiro positivo é 1 Todo número inteiro em uma representação de base é não negativo, portanto, a única maneira de a soma ser 1 é ter apenas 1 e todos os outros números inteiros são 0. Portanto, podemos apenas verificar se a soma de todos os números inteiros na matriz é 1.
Aqui está o que o código faz:
fonte
Python 2 ,
353432 bytesExperimente online!
fonte
Python 2 ,
9850 bytesExperimente online!
fonte
Excel,
4036 bytesSalvo 4 bytes por CallumDA
O Excel certamente pode fazê-lo, mas a correção de erros adiciona 11 bytes
A entrada está na célula
A1
. A saída éTRUE
ouFALSE
Se fosse permitido retornar um
FALSE
ou#NUM!
erro para valores falsos, seriam apenas 25 bytes:fonte
=IFERROR(-2^IMREAL(IMLOG2(A1)),1)=A1
05AB1E , 8 bytes
Experimente online! ou como um conjunto de testes
Explicação
fonte
ÄLY(småO
for 8.Y(sÄLm¢Z
for 8 ... Nevermind, all 8.JavaScript (ES6),
37 2824 bytesEconomizou 4 bytes graças a Arnauld.
fonte
C (gcc) ,
3429 bytesExperimente online!
fonte
MATL ,
98 bytesExperimente online! Ou verifique todos os casos de teste .
Como funciona
Considere a entrada
-8
como um exemplofonte
n
, isso cria uma matriz de tamanhon
como uma etapa intermediária. Bom trabalho que a eficiência não é um critério aqui!Oitava , 28 bytes
Isso define uma função anônima. A abordagem é semelhante à da minha resposta MATL.
Experimente online!
fonte
PHP, 41 bytes
PHP, 52 bytes
PHP, 64 bytes
Trabalhando com um Regex
fonte
Python 3, 34 bytes
fonte
JavaScript (ES6), 21 bytes
Uma função recursiva que retorna
0
outrue
.Como funciona
Isso não inclui nenhum teste explícito - como
n
estranho ouabs(n)
menor que um - para interromper a recursão mais cedo quando a entrada não é uma potência exata de -2.Saímos apenas quando
n
é exatamente igual a um1
ou0
.No entanto, isso funciona porque qualquer flutuador IEEE-754 será arredondado para
0
quando dividido por 2 (ou -2) vezes suficientes, devido ao fluxo aritmético .Casos de teste
Mostrar snippet de código
fonte
C (gcc) , 33 bytes
Experimente online!
fonte
Java 7, 55 bytes
Explicação:
Código do teste:
Experimente aqui.
Saída:
fonte
boolean c(int n){while(0==n%-2)n/=-2;return 1==n;}
.n=0
Java, porque0%-2==0
serátrue
e0/-2
ainda está0
causando um loop infinito, razão pela qual adicionei an==0?0>1
peça ao meu método recursivo.Haskell,
2423 bytesDefine uma função
f
que retorna1
para potências de -2 e0
outras.Uma versão em golfe da minha primeira submissão ao outro desafio .
fonte
Javascript (ES7), 45 bytes
fonte
**
é.Perl 6 , 21 bytes
Tente
Expandido:
Observe que
0.lsb
retornaNil
que produz um aviso quando usado como um número; portanto, o operador ou definido//
é usado.(Pense
//
como||
uma inclinação diferente)Uma chamada de método sem invocador, em que um termo é esperado, é implicitamente chamada
$_
. (.lsb
)Também trabalha com
.msb
.fonte
Prolog (SWI) , 44 bytes
Intérprete online
fonte
Python , 24 bytes
Experimente online!
O truque de bit
k&k-1==0
verifica sek
é uma potência de 2 (ouk==0
). Verificando issok=n*n
comon*n&n*n-1==0
diz-nos seabs(n)
é uma potência de 2.Para ver ainda se
n
é uma potência de -2, precisamos apenas verificar sen%3==1
. Isso funciona porque o mod 3, o valor -2 é igual a 1, então seus poderes são 1. Em contraste, suas negações são 2 mod 3 e, é claro, 0 fornece 0 mod 3.Combinamos as verificações
n*n&n*n-1==0
en%3==1
em uma única expressão. O primeiro pode ser escrito com<1
for==0
, pois nunca é negativo. On%3==1
é equivalente an%3%2
, dando 0 ou 1. Portanto, podemos combiná-los comon*n&n*n-1<n%3%2
.fonte
R, 22 bytes
Recebe entrada de stdin, retorna
TRUE
ou deFALSE
acordo.Não tenho 100% de certeza de que seja uma resposta válida, pois só funciona para números inteiros até o limite de tamanho de R e, se os números inteiros fossem ilimitados, não funcionaria. No entanto, as regras declaram:
Em uma versão hipotética de R que não permitem inteiros sem limites, então poderíamos usar o código a seguir, para o mesmo número de bytes:
Obviamente, no R real, o código acima apenas fornece
Error in 0:Inf : result would be too long a vector
.fonte
bc 88 bytes
Eu tenho isso em um arquivo
neg2.sh
e ele imprime1
para poderes de-2
ou0
nãoEu sei que é muito longo, mas foi divertido
Teste
Explicação
O corpo principal tem duas metades, ambas tentando igual a zero para potências de
-2
.fonte
Julia 0,5 , 20 bytes
Experimente online!
fonte
Fourier , 53 bytes
Vou trabalhar no golfe isso mais tarde, mas o esboço disso é:
Onde a saída é
0
para falsey e1
para verdade .Experimente online!
fonte
(G*G > X)*X
Casio BASIC , 76 bytes
Observe que 76 bytes é o que diz minha calculadora.
Este é o meu primeiro empreendimento no Casio BASIC ... Eu nunca percebi que poderia escrever programas decentes em uma calculadora: D
fonte
Python 2.7, 40 bytes
Créditos ao Sr. Xcoder pelo original código de 43 bytes de comprimento. Tive que postar como uma resposta separada, pois não tenho reputação suficiente para comentar.
fonte
int(input())
que ultrapassaria o limite de adef
função like. Além disso, no python 3, você deve usar oprint()
que desperdiçaria 1 byte. É por isso que eu escolhi essa maneira, porque em Python 3 ele fica mais tempo ...Retina , 27 bytes
Experimente online!
Recebe entrada em unário, o que é bastante padrão para a Retina. As duas primeiras linhas fazem uma conversão parcial unária para binária, com base nas duas primeiras linhas de código da entrada Tutorial (quaisquer
1
s estranhos causarão uma falha na correspondência de qualquer maneira), enquanto a última linha verifica uma potência de quatro ou uma potência ímpar negativa de dois.Experimente online!
Desta vez eu faço unário parcial para basear quatro conversões. Poderes de quatro acabam como
^1_*$
enquanto poderes ímpares negativos de dois acabam como^-11_*$
.Experimente online!
Dessa vez, continuo dividindo por quatro o máximo que posso e verifico
1
ou-11
no final.Experimente online!
Outra maneira de dividir por quatro. E ainda irritantemente 27 bytes ...
fonte
Esquema, 60 bytes
Solução recursiva.
fonte