Schreiben Sie ein Programm, das überprüft, ob die Ganzzahl eine Potenz von 2 ist.
Beispieleingabe:
8
Beispielausgabe:
Yes
Beispieleingabe:
10
Beispielausgabe:
No
Regeln:
Verwenden Sie nicht
+
,-
Operationen.Verwenden Sie einen Eingabestream, um die Nummer zu ermitteln. Die Eingabe soll zunächst nicht in einer Variablen gespeichert werden.
Der kürzeste Code (in Bytes) gewinnt.
Sie können jede wahrheitsgemäße / falsche Antwort verwenden (z. B. true
/ false
). Sie können davon ausgehen, dass die eingegebene Nummer größer als ist 0
.
code-golf
restricted-source
decision-problem
integer
gthacoder
quelle
quelle
pred
Funktion, wenn in eine ganze Zahl n angewendet wird , kehrt n - 1 sind Funktionen wie diese, die dünne Verkleidung um den verbotenen Betreiber sind auch verboten?)
oder die meisten C-basierten Sprachen--
.Antworten:
GolfScript, 6 Zeichen, keine Dekremente
Hier ist eine Lösung, die die
x & (x-1)
Methode in keiner Form verwendet. Es verwendetx & (x/3)
stattdessen. ;-) Gibt0
false aus,1
wenn true.Erläuterung:
~
Wertet die Eingabezeichenfolge aus, um sie in eine Zahl umzuwandeln..
dupliziert es (für das nachfolgende&
),3/
teilt es durch drei (abschneiden),&
berechnet das bitweise UND des geteilten Wertes mit dem Original, das genau dann Null ist, wenn die Eingabe Null oder eine Zweierpotenz ist (dh wenn höchstens ein Bit gesetzt ist), und!
Negiert dies logisch und ordnet null und alle anderen Werte null zu.Anmerkungen:
Nach den erläuterten Regeln ist Null keine gültige Eingabe , daher ist dieser Code in Ordnung, auch wenn er ausgegeben wird,
1
wenn die Eingabe Null ist.Wenn der GolfScript-Dekrement-Operator
(
zulässig ist, reicht die von aditsu bereitgestellte 5-~.(&!
stellige Lösung aus. Es scheint jedoch gegen den Geist der Regeln zu verstoßen , wenn nicht gegen den Buchstaben.Ich habe mir den
x & (x/3)
Trick vor Jahren auf der Fun With Perl-Mailingliste ausgedacht. (Ich bin mir sicher, dass ich nicht der erste bin, der es entdeckt hat, aber ich habe es selbstständig (neu) erfunden.) Hier ist ein Link zum Originalbeitrag , einschließlich eines Beweises, dass es tatsächlich funktioniert.quelle
7/3 = 2 (0010)
, also7 & 2 = 0111 & 0010 = 0010
was eindeutig das letzte Bit ist nicht 1APL (7)
Ja, das sind 7 Bytes . Nehmen wir für den Moment an, dass ich IBM Codepage 907 anstelle von Unicode verwende und dann jedes Zeichen ein Byte ist :)
dh
0 = mod(log(input(),2),1)
quelle
Indeterminate
wenn ich das versuche.GolfScript, 11 (für 1 (wahr) und 0 (falsch))
Lege die Zahl auf den Stapel und laufe dann.
GolfScript, 22 (für Ja / Nein)
Ich finde es toll, wie das Konvertieren von
1
/0
nachYes
/No
so viel Code benötigt wie die Herausforderung selbst: DWarnung: EXTREM ineffizient;) Bei Zahlen bis 10000 funktioniert es einwandfrei, aber sobald Sie diesen Wert erreicht haben, stellen Sie eine leichte Verzögerung fest.
Erläuterung:
.,
: wirdn
zun 0..n
(.
duplizieren,,
0..n Bereich){2\?}
: hoch 2%
: map "Potenz von 2" über "0..n" so wird esn [1 2 4 8 16 ...]
?0>
: prüft, ob das Array die Zahl enthält (0 ist größer als Index)quelle
.,{2\?}%?0<'YesNo'3/=
:; Ich denke auch, Sie betrügen, indem Sie nach "Die Zahl auf den Stapel legen" fragen. Sie sollten mit a beginnen~
.Mathematica 28
Für ganzzahlige Potenzen von 2 ist der Zähler des Basis-2-Protokolls 1 (was bedeutet, dass das Protokoll ein Einheitenbruch ist).
Hier modifizieren wir die Funktion leicht, um die vermutete Eingabe anzuzeigen. Wir verwenden
#
anstelle vonInput[]
und addieren&
, um eine reine Funktion zu definieren. Es wird dieselbe Antwort zurückgegeben, die zurückgegeben würde, wenn der Benutzer die Nummer in der obigen Funktion eingibt.Mehrere Nummern gleichzeitig testen.
quelle
Perl 6 (17 Zeichen)
Dieses Programm erhält eine Zeile von der STDIN-
get
Funktion, berechnet den Logarithmus mit der Basis 2 (log(2)
) und prüft, ob das Ergebnis durch 1 dividiert wird (%%1
wobei%%
durch den Operator dividiert wird). Nicht so kurz wie die GolfScript-Lösung, aber ich finde das akzeptabel (GolfScript gewinnt sowieso alles), aber viel schneller (auch wenn man bedenkt, dass Perl 6 momentan langsam ist).quelle
+
und-
für diese Herausforderung verboten sind, ist, weil wennx & (x - 1)
gleich ist0
, dannx
ist eine Potenz von 2.x&~(~0*x)
immer noch. Das sind nur 2 Zeichen länger.Oktave (
1523)BEARBEITEN: Aktualisierung aufgrund von Benutzereingabeanforderungen;
Lässt den Benutzer einen Wert eingeben und gibt 1 für wahr, 0 für falsch aus.
Getestet in Octave, sollte auch in Matlab funktionieren.
quelle
R
13,11Basierend auf der Perl-Lösung. Rückgabe
FALSE
oderTRUE
.Der Parameter
i
repräsentiert die Eingangsvariable.Eine alternative Version mit Benutzereingabe:
quelle
GolfScript, 5
Ausgänge 1 für wahr, 0 für falsch. Basierend auf der Idee von user3142747:
Hinweis: Wird
(
dekrementiert, was hoffentlich nicht als-
:) gilt.Wenn dies der Fall ist (und die Kommentare des OP darauf hindeuten, dass dies der Fall sein könnte), beziehen Sie sich stattdessen auf die Lösung von Ilmari Karonen .
Fügen Sie für die J / N-Ausgabe
'NY'1/=
am Ende (7 weitere Bytes) an.quelle
Python, 31
quelle
bin(input()).rfind('1')<3
2==
weil ich dachte, dass es auch für nicht positive Zahlen funktionieren sollte. Das wird von den Regeln ausdrücklich nicht verlangt, also ...print bin(input()).count('1')<2
insgesamt 31 Zeichen posten , aber es ist zu ähnlich wie bei Ihnen.C 48
quelle
*
hat eine höhere Priorität als binär&
, du brauchst keine parens. Und wenn Rückgabewert akzeptiert wird (nur gefragt)exit(x&x*-1)
wäre viel kürzer.-
:x*-1
.-
verboten.Ich habe mich für einen anderen Ansatz entschieden, der auf der Anzahl der Einwohner oder der Seitwärtssumme der Zahl (der Anzahl der 1-Bits) basiert . Die Idee ist, dass alle Potenzen von zwei genau ein
1
Bit haben und keine andere Zahl. Ich habe eine JavaScript-Version hinzugefügt, weil ich sie amüsant fand, obwohl sie mit Sicherheit keinen Golfwettbewerb gewinnen wird.J,
1415 Zeichen (Ausgänge 0 oder 1)JavaScript, 76 Zeichen (gibt true oder false aus)
quelle
Clip ,
987Liest eine Zahl von stdin.
Erläuterung:
Beginnen Sie mit,
Z
=0
,W
=2
undO
= 1. Dies ermöglicht die Platzierung vonW
undO
nebeneinander, während die Verwendung von2
und1
als Zahl 21 ohne Trennzeichen (ein unerwünschtes zusätzliches Zeichen) interpretiert wird. In Clip funktioniert die Modulo-Funktion (%
) mit Nicht-Ganzzahlen. Wenn Sie also herausfinden möchten, ob ein Wertv
eine Ganzzahl ist, überprüfen Sie, obv
Mod 1 = 0 ist. Mit der Clip-Syntax wird dies wie folgt geschrieben=0%v1
. Da Boolesche Werte jedoch als1
(oder als alles andere) gespeichert werden und0
überprüft wird, ob etwas gleich ist,0
wird es nur "nicht". Dafür hat Clip den!
Operator. In meinem Codev
istlnx2
.x
ist eine Eingabe von stdin,n
wandelt einen String in eine Zahl um undlab
ist die Protokollbasisb
vona
. Das Programm übersetzt daher (besser lesbar) nach0 = ((log base 2 of parseInt(readLine)) mod 1)
.Beispiele:
Ausgänge
und
Ausgänge
Edit 1: ersetzt
0
,1
und2
mitZ
,O
undW
.Edit 2: ersetzt
=Z
durch!
.Ebenfalls:
Pyth , 5
Komprimiert die Clip-Version noch weiter, da Pyth Q für bereits ausgewertete Eingaben und eine log2 (a) -Funktion anstelle von nur allgemeinem log (a, b) hat.
quelle
Javascript (37)
Einfaches Skript, das nur wiederholt durch 2 dividiert und den Rest überprüft.
quelle
for
Schleife (auch 37 Zeichen)for(i=prompt();i>1;i/=2){}alert(i==1)
Mathematica (21)
Ohne Eingabe ist es etwas kürzer
quelle
⌊#⌋==#&@Log2@Input[]
Log2@Input[]~Mod~1==0
.JavaScript,
41 bis40 ZeichenSo funktioniert das: Sie nehmen den Logarithmus an der Basis 2 mit
l(prompt()) / l(2)
, und wenn dieses Ergebnis Modulo 1 gleich Null ist, dann ist es eine Potenz von 2.Zum Beispiel: Nachdem Sie den Logarithmus von 8 auf Basis genommen haben
2
, erhalten Sie3
.3 modulo 1
ist gleich 0, dies gibt also true zurück.Nachdem Sie den Logarithmus von 7 auf Basis 2 genommen haben, erhalten Sie
2.807354922057604
.2.807354922057604 modulo 1
ist gleich0.807354922057604
, daher wird false zurückgegeben.quelle
Math.log
wird das schon tun : "Jede der folgenden Math-Objektfunktionen wendet den abstrakten Operator ToNumber auf jedes seiner Argumente an ..."JavaScript, 35
Funktioniert für Bytes.
46-stellige Version , funktioniert für 16-Bit-Nummern.
Der Trick funktioniert in den meisten dynamischen Sprachen.
Erläuterung: Konvertieren Sie die Zahl in Basis 2, interpretieren Sie diese Zeichenfolge als Basis 10, und führen Sie Modulo 9 aus, um die Ziffernsumme zu erhalten, die 1 sein muss.
quelle
0x2ff
, was in Basis 2 ist1111111111
?+1
!alert(!(Number.MAX_VALUE%prompt()))
Perl 5.10+, 13 + 1 = 14 Zeichen
Verwendet die gleiche Methode aus einem alten FWP-Thread wie mein GolfScript-Eintrag . Gibt aus,
1
ob die Eingabe eine Zweierpotenz ist, andernfalls eine Leerzeile.Muss mit ausgeführt werden
perl -nE
; Dern
Aufpreis beträgt 14 Zeichen. Alternativ ist hier eine 18-stellige Version, die Folgendes nicht benötigtn
:quelle
Python 3, 38
Python, 32
Der Code funktioniert jedoch nicht in jeder Version.
Beachten Sie, dass die Lösung auch für 0 funktioniert (print False).
quelle
==
mit&
?Ruby - 17 Zeichen (vierter Versuch)
Mein aktuelles Bestes ist eine Fusion von @steenslag's Antwort mit meiner eigenen. Nachfolgend sind meine bisherigen Versuche aufgeführt.
Ruby - 19 Zeichen (dritter Versuch)
Ruby - 22 Zeichen (zweiter Versuch)
Ruby - 24 Zeichen (erster Versuch)
quelle
K / Kona (
2417)Gibt 1 zurück, wenn wahr, und 0, wenn falsch. Jede Potenz von 2 hat ein einzelnes Bit gleich 1:
(dies gibt alle Potenzen von 2 (von 0 bis 9) in binärer Form aus)
Also fasse ich alle Komponenten des binären Ausdrucks von zusammen
x
und sehe, ob er gleich 1 ist. wenn ja dannx=2^n
, sonst nein.... wusste, ich könnte es kleiner machen
quelle
C # (54 Zeichen)
quelle
Int32
, nichtToInt32
...int
stattInt32
für 2 weniger Zeichen.Rebmu (9 Zeichen)
Prüfung
Rebmu ist ein verengter Dialekt von Rebol. Der Code ist im Wesentlichen:
Alternative
14 Zeichen - Rebmu hat kein bitweises "Mushed" AND ~
In Rebol:
quelle
GTB , 46 Bytes
quelle
Python, 35
Verwendet nicht nur +/- Operationen, sondern auch mathematische Operationen, abgesehen von der Konvertierung in die Binärform.
Andere Sachen (interessant, aber nicht für den Wettbewerb):
Ich habe auch eine reguläre Version (61) :
(Liebe die Idee, aber Import- und Match-Funktion machen es zu lang)
Und schöne, aber langweilige bitweise Operationen Version (31) :
(Ja, es ist kürzer, aber es verwendet ~ -x für die Dekrementierung der Operation)
quelle
Python 2.7 (
30293937)BEARBEITEN: Aktualisierung aufgrund von Benutzereingabeanforderungen;
Brute Force, versuchen Sie zu teilen, bis = 1 (Erfolg) oder <1 (Misserfolg)
quelle
not a%2
kann geschrieben werden alsa%2==0
. Zugegeben, dies wäre in vielen Sprachen länger, aber nicht in Python.a%2<1
.2.
Entfernen, das ein Byte sparen würde!Python (33)
quelle
int(bin(input()*2)[3:])<1
funktioniert auch aus der Python-Shell mit nur 25 Zeichen.Ruby,
33,28, 25quelle
APL (12 für 0/1, 27 für Ja / Nein)
oder, wenn wir Text ausgeben müssen:
Lesen Sie A ein. Bilden Sie einen Vektor 0..A, dann einen Vektor 2 0 ..2 A (ja, das ist weit mehr als nötig), dann einen Vektor, der A mit jedem dieser Vektoren vergleicht (was zu einem Vektor von 0 und höchstens 0 führt) one 1), dann xor that (es gibt keinen xor-Operator in APL, aber ≠, das auf Boolesche Werte angewendet wird, fungiert als eins.) Wir haben jetzt 0 oder 1.
Um JA oder NEIN zu erhalten: Multiplizieren Sie die 0 oder 1 mit 3, entfernen Sie diese Anzahl von Zeichen von 'JA' und nehmen Sie die ersten 3 Zeichen davon.
quelle
C 65 Bytes
quelle
main(k){...
, wobei Sie sich auf die impliziteint
Eingabe verlassen. Es könnte UB sein, aber das ist Code Golf. Natürlich NIEMALS so etwas in der Produktion verwenden.Haskell (
5250)quelle