Es gibt clevere Methoden, um zu bestimmen, ob eine Zahl eine Potenz von 2 ist. Das ist kein interessantes Problem mehr. Lassen Sie uns also feststellen, ob eine bestimmte Ganzzahl eine ganzzahlige Potenz von -2 ist . Zum Beispiel:
-2 => yes: (-2)¹
-1 => no
0 => no
1 => yes: (-2)⁰
2 => no
3 => no
4 => yes: (-2)²
Regeln
Sie können ein Programm oder eine Funktion schreiben und eine der Standardmethoden zum Empfangen von Eingaben und zum Bereitstellen von Ausgaben verwenden.
Ihre Eingabe ist eine einzelne Ganzzahl, und die Ausgabe muss ein wahrer Wert sein, wenn die Ganzzahl eine ganzzahlige Potenz von -2 ist, andernfalls ein falscher Wert. Andere Ausgaben (z. B. Warnmeldungen) sind nicht zulässig.
Es gelten die üblichen Überlaufregeln für Ganzzahlen: Ihre Lösung muss in der Lage sein, für beliebig große Ganzzahlen in einer hypothetischen (oder möglicherweise realen) Version Ihrer Sprache zu arbeiten, in der standardmäßig alle Ganzzahlen unbegrenzt sind, Ihr Programm jedoch aufgrund der Implementierung in der Praxis fehlschlägt Ganzzahlen, die so groß sind, werden nicht unterstützt, was die Lösung nicht ungültig macht.
Sie können jede Programmiersprache verwenden , aber beachten Sie, dass diese Lücken standardmäßig verboten sind.
Gewinnbedingung
Dies ist ein Code-Golf- Wettbewerb: Die Antwort mit den wenigsten Bytes (in der von Ihnen gewählten Codierung) ist der Gewinner.
quelle
i
solche Ganzzahl , dass(-2)^i = 2
-0.5
sollten gültig sein, da es 2 ^ (- 1) ist .i
ist nicht natürlichAntworten:
Mathematica, 22 Bytes
Probieren Sie es online! (Verwenden Sie stattdessen Mathematik, wo diese Lösung auch funktioniert.)
Ich habe eine Weile versucht, eine Lösung mit bitweisen Operatoren zu finden, und obwohl es eine gibt, habe ich am Ende etwas gefunden, das wahrscheinlich einfacher ist:
Max[#,-2#]
multipliziert die Eingabe mit -2, wenn sie negativ ist. Das Multiplizieren mit einem anderen Faktor von -2 ändert nichts daran, ob der Wert eine Potenz von -2 ist oder nicht. Aber jetzt sind alle ungeraden Potenzen von -2 in gerade Potenzen von -2 umgewandelt worden .Log2@...
und prüfen, ob das Ergebnis eine ganze Zahl ist (um zu prüfen, ob es sich um eine Potenz von 2 handelt ). Dies spart bereits zwei BytesLog[4,...]
(eine andere Möglichkeit, gerade Potenzen von -2 zu betrachten ).EvenQ
anstelle von verwendenIntegerQ
.quelle
Log[4,...]
ist länger alsLog2@...
undIntegerQ
ist länger alsEvenQ
.Gelee , 5 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Python , 46 Bytes
-2 Bytes dank @ovs.
Funktion mit nutzung:
Probieren Sie es online!
quelle
print g(8)
DruckeFalse
print g(4)
macht das gleiche;
anstelle eines Zeilenumbruchs gesetzt ... Entschuldigung. Behoben @FelipeNardiBatistaGelee , 6 Bytes
Probieren Sie es online!
Dies basiert darauf, wie Jelly eine ganze Zahl N in eine beliebige Basis B konvertiert, indem N in ein Array konvertiert wird , in dem jede ganze Zahl eine Ziffer d von ( N ) B ist , die einen Wert von 0 ≤ V d < B haben kann . Hier werden die Ziffern von rechts mit 0 indiziert, sodass jede Ziffer V d B d zu N addiert . V d < B ⇔ V d B d < BB d = B d + 1 , also alle möglichenN hat nur eine eindeutige Darstellung, wenn wir führende Nullen in ( N ) B ignorieren .
Hier ist d = Eingang, B = -2. N = B d = 1 B d = V d B d ⇔ 1 = V d ⇔ V d = 1, und da wir keine anderen Vielfachen von Potenzen von B addieren , wäre jedes andere V 0. Im Moment Das Array sollte eine 1 sein, die mit d 0s verkettet ist . Da Jelly 1 von links indiziert, sollten wir prüfen, ob das erste Element des Arrays 1 ist und alle anderen Elemente 0 sind.
Hmm ... alles gut, oder? Nein? Was ist los? Oh ja, ich habe eine bessere Idee! Nehmen wir zunächst die Summe aller Ganzzahlen im Array und behandeln sie so, als ob es sich um ein ganzzahliges Array und nicht um eine Zahl zur Basis -2 handelt. Wenn es 1 ist, bedeutet dies, dass es nur eine 1 gibt und alle anderen Ganzzahlen 0. Da es keine führenden Nullen geben kann, außer im Fall von 0-2(wo die Summe ohnehin 0 ≠ 1 wäre), muss die 1. Ganzzahl ungleich Null sein. Die einzige Ganzzahl ungleich Null im Array ist die 1, daher muss es die erste sein. Daher ist dies der einzige Fall, in dem die Summe aller Ganzzahlen im Array 1 ist, da die kleinstmögliche Summe eines Paares positiver Ganzzahlen Σ {1,1} = 2 ist, da die kleinste positive Ganzzahl 1 ist Jede Ganzzahl in einer Basisrepräsentation ist nicht negativ, so dass die Summe nur 1 ist, um nur eine 1 zu haben, und alle anderen Ganzzahlen sind 0. Daher können wir nur überprüfen, ob die Summe aller Ganzzahlen in der Array ist 1.
Der Code bewirkt Folgendes:
quelle
Python 2 ,
353432 BytesProbieren Sie es online!
quelle
Python 2 ,
9850 BytesProbieren Sie es online!
quelle
Excel,
4036 Bytes4 Bytes von CallumDA gespeichert
Excel kann das sicher, aber die Korrektur von Fehlern fügt 11 Bytes hinzu
Die Eingabe erfolgt in Zelle
A1
. Ausgang istTRUE
oderFALSE
Wenn es erlaubt wäre, entweder einen
FALSE
oder einen#NUM!
Fehler für falsche Werte zurückzugeben, wären es nur 25 Bytes:quelle
=IFERROR(-2^IMREAL(IMLOG2(A1)),1)=A1
05AB1E , 8 Bytes
Probieren Sie es online! oder als Testsuite
Erläuterung
quelle
ÄLY(småO
für 8.Y(sÄLm¢Z
für 8 ... Nevermind, alle 8.JavaScript (ES6),
37 2824 Bytes4 Bytes dank Arnauld gespeichert.
quelle
C (GCC) ,
3429 BytesProbieren Sie es online!
quelle
MATL ,
98 BytesProbieren Sie es online! Oder überprüfen Sie alle Testfälle .
Wie es funktioniert
Betrachten Sie die Eingabe
-8
als Beispielquelle
n
ein Array mit der Größen
als Zwischenschritt erstellt. Gute Arbeit, dass Effizienz hier kein Kriterium ist!Oktave , 28 Bytes
Dies definiert eine anonyme Funktion. Der Ansatz ähnelt dem in meiner MATL-Antwort.
Probieren Sie es online!
quelle
PHP, 41 Bytes
PHP, 52 Bytes
PHP, 64 Bytes
Mit einem Regex arbeiten
quelle
Python 3, 34 Bytes
quelle
JavaScript (ES6), 21 Byte
Eine rekursive Funktion, die
0
oder zurückgibttrue
.Wie es funktioniert
Dies beinhaltet keinen expliziten Test - wie
n
ungerade oderabs(n)
weniger als eins -, um die Rekursion vorzeitig zu stoppen, wenn die Eingabe keine exakte Potenz von -2 ist.Wir verlassen nur, wenn
n
entweder1
oder genau gleich ist0
.Dies funktioniert jedoch, da ein IEEE-754-Float
0
aufgrund eines arithmetischen Unterlaufs eventuell auf gerundet wird, wenn er durch 2 (oder -2) mal genug geteilt wird .Testfälle
Code-Snippet anzeigen
quelle
C (gcc) , 33 Bytes
Probieren Sie es online!
quelle
Java 7, 55 Bytes
Erläuterung:
Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
boolean c(int n){while(0==n%-2)n/=-2;return 1==n;}
.n=0
in Java, weil0%-2==0
sein wirdtrue
und0/-2
ist nach wie vor0
, eine Endlosschleife verursacht, weshalb ich den zusätzlichenn==0?0>1
Teil meiner rekursive Methode.Haskell,
2423 BytesDefiniert eine Funktion,
f
die1
für Potenzen von -2 und0
anders zurückgibt .Eine Golfversion meines ersten Beitrags zur anderen Herausforderung .
quelle
Javascript (ES7), 45 Byte
quelle
**
ist.Perl 6 , 21 Bytes
Versuch es
Erweitert:
Beachten Sie, dass
0.lsb
kehrtNil
die eine Warnung erzeugt , wenn es als Nummer verwendet, so dass der definierte oder Betreiber//
verwendet wird.(Stellen Sie sich vor
//
wie||
mit einer anderen Neigung)Ein Methodenaufruf ohne Aufruf, bei dem ein Term erwartet wird, wird implizit aufgerufen
$_
. (.lsb
)Funktioniert auch mit
.msb
.quelle
Prolog (SWI) , 44 Bytes
Online-Dolmetscher
quelle
Python , 24 Bytes
Probieren Sie es online!
Der Bittrick
k&k-1==0
prüft, obk
eine Potenz von 2 (oderk==0
) ist. Wenn Sie dies aufk=n*n
asn*n&n*n-1==0
prüfen, erfahren Sie, obabs(n)
eine Potenz von 2 vorliegt.Um weiter zu sehen, ob
n
eine Potenz von -2 ist, müssen wir nur das überprüfenn%3==1
. Dies funktioniert, weil mod 3, der Wert -2 gleich 1 ist, also sind seine Potenzen 1. Im Gegensatz dazu sind ihre Negationen 2 mod 3 und natürlich ergibt 0 0 mod 3.Wir kombinieren die Prüfungen
n*n&n*n-1==0
undn%3==1
zu einem einzigen Ausdruck. Das erste kann mit<1
for geschrieben werden==0
, da es niemals negativ ist. Dasn%3==1
entsprichtn%3%2
, 0 oder 1 gebend. Also können wir sie als kombinierenn*n&n*n-1<n%3%2
.quelle
R, 22 Bytes
Übernimmt Eingaben von stdin, gibt
TRUE
oderFALSE
entsprechend zurück.Ich bin nicht zu 100% sicher, dass dies eine gültige Antwort ist, da es nur für ganze Zahlen bis zur Größenbeschränkung von R funktioniert und wenn die ganzen Zahlen nicht begrenzt wären, würde es nicht funktionieren. In den Regeln heißt es jedoch:
In einer hypothetischen Version von R , die nicht unbegrenzt ganze Zahlen erlauben, dann könnten wir den folgenden Code für die gleiche Byteanzahl verwenden:
Natürlich gibt der obige Code in real R nur
Error in 0:Inf : result would be too long a vector
.quelle
BC 88 Bytes
Ich habe dies in einer Datei
neg2.sh
und es druckt1
für Befugnisse von-2
und0
andersIch weiß, es ist sehr lang, aber es hat Spaß gemacht
Prüfung
Erläuterung
Der Hauptkörper hat zwei Hälften, beide versuchen für Potenzen von gleich Null zu sein
-2
.quelle
Julia 0,5 , 20 Bytes
Probieren Sie es online!
quelle
Fourier , 53 Bytes
Ich werde später daran arbeiten, Golf zu spielen.
Wo die Ausgabe
0
für Falschgeld und1
für Wahrhaftigkeit ist .Probieren Sie es online!
quelle
(G*G > X)*X
Casio BASIC , 76 Bytes
Beachten Sie, dass auf meinem Taschenrechner 76 Byte stehen.
Dies ist mein erstes Projekt in Casio BASIC ... Ich hätte nie gedacht, dass ich so anständige Programme auf einem Taschenrechner schreiben könnte: D
quelle
Python 2.7, 40 Bytes
Dank an Mr. Xcoder für den ursprünglichen Code mit einer Länge von 43 Bytes. Musste als separate Antwort posten, da ich nicht genug Reputation habe, um Kommentare abzugeben.
quelle
int(input())
die sich über die Grenze gegangen wäre von diedef
ähnliche Funktion. Darüber hinaus müssen Sie in Python 3 verwenden,print()
was 1 Byte verschwendet. Deshalb habe ich diesen Weg gewählt, weil es in Python 3 länger wird ...Retina , 27 Bytes
Probieren Sie es online!
Nimmt Eingaben in Unary auf, was für Retina ziemlich üblich ist. Die ersten beiden Zeilen sind aufgrund der ersten beiden Codezeilen des Lernprogrammeintrags teilweise unärgerlich für die Binärkonvertierung (jedes fremde
1
s führt dazu, dass die Übereinstimmung trotzdem fehlschlägt), während die letzte Zeile nach einer Potenz von vier oder einer negativen ungeraden Potenz sucht von zwei.Probieren Sie es online!
Diesmal bin ich teilweise unärgerlich, um vier Konvertierungen zu stützen.
^1_*$
Potenzen von vier enden als, während negative ungerade Potenzen von zwei als enden^-11_*$
.Probieren Sie es online!
Dieses Mal teile ich einfach so oft ich kann durch vier und überprüfe nach
1
oder-11
am Ende.Probieren Sie es online!
Eine andere Art, durch vier zu teilen. Und immer noch ärgerlich 27 Bytes ...
quelle
Schema, 60 Bytes
Rekursive Lösung.
quelle