Il existe des méthodes astucieuses pour déterminer si un nombre est une puissance de 2. Ce n'est plus un problème intéressant. Déterminons donc si un entier donné est une puissance entière de -2 . Par exemple:
-2 => yes: (-2)¹
-1 => no
0 => no
1 => yes: (-2)⁰
2 => no
3 => no
4 => yes: (-2)²
Règles
Vous pouvez écrire un programme ou une fonction et utiliser l’une des méthodes standard de réception d’entrée et de sortie.
Votre entrée est un entier unique et la sortie doit être une valeur de vérité si l'entier est une puissance entière de -2 et une valeur de faux sinon. Aucune autre sortie (par exemple, des messages d'avertissement) n'est autorisée.
Les règles habituelles de dépassement d'entier s'appliquent: votre solution doit pouvoir fonctionner avec des entiers arbitrairement grands dans une version hypothétique (ou peut-être réelle) de votre langue dans laquelle tous les entiers sont non liés par défaut, mais si votre programme échoue dans la pratique en raison de la mise en œuvre ne prenant pas en charge des entiers aussi gros, cela n'invalide pas la solution.
Vous pouvez utiliser n’importe quel langage de programmation , mais notez que ces échappatoires sont interdites par défaut.
Condition gagnante
Il s’agit d’un concours de code-golf : la réponse qui a le moins d’octets (dans l’encodage choisi) est gagnante.
la source
i
tel que(-2)^i = 2
-0.5
devraient-ils être valides puisqu'il s'agit de 2 ^ (- 1) .i
n'est pas naturelRéponses:
Mathematica, 22 octets
Essayez-le en ligne! (Utilisation des mathématiques à la place, où cette solution fonctionne également.)
J'ai essayé de trouver une solution avec les opérateurs au niveau des bits pendant un certain temps, et bien qu'il en existe une définitivement, j'ai fini par trouver quelque chose qui est probablement plus simple:
Max[#,-2#]
multiplie l'entrée par -2 si elle est négative. Multiplier par un autre facteur de -2 ne change pas si la valeur est une puissance de -2 ou non. Mais maintenant, tous les impairs de -2 ont été transformés en pairs de -2 .Log2@...
et vérifier si le résultat est un entier (pour vérifier s'il s'agit d'une puissance de 2 ). Cela enregistre déjà deux octets de plusLog[4,...]
(une autre façon de regarder des puissances égales de -2 ).EvenQ
place deIntegerQ
.la source
Log[4,...]
est plus long queLog2@...
etIntegerQ
est plus long queEvenQ
.Gelée , 5 octets
Essayez-le en ligne!
Comment ça marche
la source
Python , 46 octets
-2 octets grâce à @ovs.
Fonction à l'usage:
Essayez-le en ligne!
la source
print g(8)
impressionsFalse
print g(4)
fait de même;
au lieu d'une nouvelle ligne ... désolé pour cela. Correction de @FelipeNardiBatistaGelée , 6 octets
Essayez-le en ligne!
Ceci est basé sur la façon dont Jelly convertit un entier N en une base quelconque B , en convertissant N en un tableau, dans lequel chaque entier est un chiffre d de ( N ) B , qui peut avoir une valeur 0≤ V d < B . Ici, nous allons chiffres 0-index de la droite, de sorte que chaque chiffre ajoute V d B d pour former N . V d < B ⇔ V d B d < BB d = B d +1 , donc toutes les possibilités Nn'a qu'une seule représentation unique, si nous négligeons leader dans 0s ( N ) B .
Ici, d = entrée, B = -2. N = B d = 1 B d = V d B d ⇔1 = V d ⇔ V d = 1, et, puisque nous ne sommes pas ajouter d'autres multiples de pouvoirs de B , tous les autres V serait 0. En ce moment, le tableau doit être un 1 concaténé avec d 0s. Depuis Jelly 1-indexes à gauche, nous devrions vérifier si le 1er élément du tableau est 1 et tous les autres éléments sont 0.
Hmm ... tout va bien, non? Non? Que se passe-t-il? Oh oui, j'ai une meilleure idée! Tout d'abord, prenons la somme de tous les entiers du tableau, en le traitant comme s'il s'agissait d'un tableau d'entiers et non d'un nombre en base -2. Si c'est 1, cela signifie qu'il n'y a qu'un seul 1 et que tous les autres entiers sont 0. Puisqu'il ne peut y avoir de zéros en tête, sauf dans le cas de 0 -2(où la somme serait de toute façon 0 ≠ 1), le premier entier doit être différent de zéro. Le seul entier non nul du tableau est le 1, il doit donc être le premier. Par conséquent, il s'agit du seul cas où la somme de tous les entiers du tableau serait 1, car la plus petite somme possible d'une paire d'entiers positifs est Σ {1,1} = 2, car le plus petit entier positif est 1. Chaque entier d'une représentation de base étant non négatif, la seule manière dont la somme est 1 consiste à n'en avoir qu'un seul et tous les autres entiers à 0. Par conséquent, nous pouvons simplement vérifier si la somme de tous les entiers du tableau est 1.
Voici ce que fait le code:
la source
Python 2 ,
353432 octetsEssayez-le en ligne!
la source
Python 2 ,
9850 octetsEssayez-le en ligne!
la source
Excel,
4036 octets4 octets enregistrés par CallumDA
Excel peut certainement le faire, mais la correction des erreurs ajoute 11 octets.
L'entrée est dans la cellule
A1
. La sortie estTRUE
ouFALSE
S'il était autorisé à renvoyer l'une
FALSE
ou l' autre ou une#NUM!
erreur pour les valeurs fausses, il ne s'agirait que de 25 octets:la source
=IFERROR(-2^IMREAL(IMLOG2(A1)),1)=A1
05AB1E , 8 octets
Essayez-le en ligne! ou en tant que suite de tests
Explication
la source
ÄLY(småO
pourY(sÄLm¢Z
8 ... pour 8 ... Nevermind, tous les 8.JavaScript (ES6),
37 2824 octets4 octets sauvés grâce à Arnauld.
la source
C (gcc) ,
3429 octetsEssayez-le en ligne!
la source
MATL ,
98 octetsEssayez-le en ligne! Ou vérifiez tous les cas de test .
Comment ça marche
Considérez l'entrée
-8
comme un exemplela source
n
, this creates an array of sizen
as an intermediate step. Good job that efficiency is not a criterion here!Octave, 28 bytes
This defines an anonymous function. The approach is similar to that in my MATL answer.
Try it online!
la source
PHP, 41 Bytes
PHP, 52 Bytes
PHP, 64 Bytes
Working with a Regex
la source
Python 3, 34 bytes
la source
JavaScript (ES6), 21 bytes
A recursive function that returns
0
ortrue
.How it works
This doesn't include any explicit test -- like
n
being odd orabs(n)
being less than one -- to stop the recursion early when the input is not an exact power of -2.We exit only when
n
is exactly equal to either1
or0
.This does work however because any IEEE-754 float will eventually be rounded to
0
when divided by 2 (or -2) enough times, because of arithmetic underflow.Test cases
Show code snippet
la source
C (gcc), 33 bytes
Try it online!
la source
Java 7, 55 bytes
Explanation:
Test code:
Try it here.
Output:
la source
boolean c(int n){while(0==n%-2)n/=-2;return 1==n;}
.n=0
in Java, because0%-2==0
will betrue
and0/-2
is still0
, causing an infinite loop, which is why I added then==0?0>1
part to my recursive method.Haskell,
2423 bytesDefines a function
f
which returns1
for powers of -2 and0
otherwise.A golfed version of my first submission to the other challenge.
la source
Javascript(ES7), 45 bytes
la source
**
is.Perl 6, 21 bytes
Try it
Expanded:
Note that
0.lsb
returnsNil
which produces a warning when used as a number, so the defined or operator//
is used.(Think of
//
as||
with a different slant)A method call with no invocant where a term is expected is implicitly called on
$_
. (.lsb
)Also works with
.msb
.la source
Prolog (SWI), 44 bytes
Online interpreter
la source
Python, 24 bytes
Try it online!
The bit trick
k&k-1==0
checks whetherk
is a power of 2 (ork==0
). Checking this fork=n*n
asn*n&n*n-1==0
tells us whetherabs(n)
is a power of 2.To further see if
n
is a power of -2, we need only check thatn%3==1
. This works because mod 3, the value -2 is equal to 1, so its powers are 1. In contrast, their negations are 2 mod 3, and of course 0 gives 0 mod 3.We combine the checks
n*n&n*n-1==0
andn%3==1
into a single expression. The first can be written with<1
for==0
, since it's never negative. Then%3==1
is equivalent ton%3%2
, giving 0 or 1. So, we can combine them asn*n&n*n-1<n%3%2
.la source
R, 22 bytes
Takes input from stdin, returns
TRUE
orFALSE
accordingly.I'm not 100% sure that this is a valid answer, as it only works for integers up to R's size limit, and if the integers were unbounded it wouldn't work. However, the rules state:
In a hypothetical version of R which does allow unbounded integers, then we could use the following code, for the same byte count:
Of course, in real R, the above code just gives
Error in 0:Inf : result would be too long a vector
.la source
bc 88 bytes
I have this in a file
neg2.sh
and it prints1
for powers of-2
and0
otherwiseI know it's really long, but it was fun
Test
Explanation
The main body has two halves, both are trying to equal zero for powers of
-2
.la source
Julia 0.5, 20 bytes
Try it online!
la source
Fourier, 53 bytes
I'll work on golfing this later, but the outline of this is:
Where the output is
0
for falsey and1
for truthy.Try it online!
la source
(G*G > X)*X
Casio BASIC, 76 bytes
Note that 76 bytes is what it says on my calculator.
This is my first venture into Casio BASIC... I never realised I could write such decent programs on a calculator :D
la source
Python 2.7, 40 bytes
Credits to Mr. Xcoder for the original code of length 43 bytes. Had to post as a separate answer since I don't have enough reputation to comment.
la source
int(input())
which would have gone over the limit of thedef
-like function. Additionally, In python 3, you must useprint()
which would of wasted 1 byte. That's why I chose that way, because in Python 3 it gets longer...Retina, 27 bytes
Try it online!
Takes input in unary, which is fairly standard for Retina. The first two lines do partial unary to binary conversion based on the first two lines of code from the Tutorial entry (any extraneous
1
s will cause the match to fail anyway), while the last line checks for a power of four or a negative odd power of two.Try it online!
This time I do partial unary to base four conversion. Powers of four end up as
^1_*$
while negative odd powers of two end up as^-11_*$
.Try it online!
This time I just keep dividing by four as much as I can and check for
1
or-11
at the end.Try it online!
Another way of dividing by four. And still annoyingly 27 bytes...
la source
Scheme, 60 bytes
Recursive solution.
la source