Aufgabe:
Finden Sie bei einer Ganzzahleingabe heraus, ob es sich um eine Zyklopenzahl handelt oder nicht.
Was ist eine Cyclops-Nummer? Nun, es ist eine Zahl, deren Binärdarstellung nur eine 0
in der Mitte hat!
Testfälle:
Input | Output | Binary | Explanation
--------------------------------------
0 | truthy | 0 | only one zero at "center"
1 | falsy | 1 | contains no zeroes
5 | truthy | 101 | only one zero at center
9 | falsy | 1001 | contains two zeroes (even though both are at the center)
10 | falsy | 1010 | contains two zeroes
27 | truthy | 11011 | only one zero at center
85 | falsy | 1010101 | contains three zeroes
101 | falsy | 1100101 | contains three zeroes
111 | falsy | 1101111 | only one zero, not at center
119 | truthy | 1110111 | only one zero at center
Eingang:
Eine Ganzzahl oder ein äquivalenter Typ. (
int
,long
,decimal
, Etc.)Angenommen, wenn die Auswertung der Eingabe zu einem Ganzzahlüberlauf oder anderen unerwünschten Problemen führt, muss diese Eingabe nicht ausgewertet werden.
Ausgabe:
Wahrheit oder Falschheit.
Die Ausgabe von Wahrheiten / Falschheiten muss den Spezifikationen der verwendeten Sprache für Wahrheiten / Falschheiten entsprechen. (zB C hat
0
so falsch, ungleich Null wie wahr)
Herausforderungsregeln:
Eingaben, die kleiner als 0 sind, werden als falsch angenommen und müssen daher nicht ausgewertet werden.
Wenn die Länge der binären Darstellung der Zahl gerade ist, kann die Zahl keine Cyclops-Zahl sein.
Allgemeine Regeln:
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes !.
Standardlücken sind verboten.
Für Ihre Antwort gelten Standardregeln mit Standard-E / A-Regeln .
Dies ist meine erste Programmier-Rätsel & Code-Golf- Herausforderung, daher wäre jedes Feedback zu meiner Verbesserung sehr dankbar!
Antworten:
Japt, 8 Bytes
Führen Sie es online aus
Erläuterung:
Die Idee ist, die Binärzeichenfolge bei zu teilen
0
, was zwei Elemente ergeben würde, wenn es nur ein Element gibt0
. Dann prüfen wir, ob das erste Element mit dem zweiten übereinstimmt, um sicherzustellen, dass es palindrom ist. Wenn die Binärzeichenfolge mehrere0
s enthält , gibt die Reduzierung ein Array mit mehreren Elementen zurück, und dies würde die==1
Bedingung nicht erfüllen. Wenn die Binärzeichenfolge eine enthält0
, aber nicht palindromisch ist,äè
wird zurückgegeben,0
weil sie Übereinstimmungen mitb
enthält .0
a
quelle
r¶
sollte auch funktionieren.¤
= In Binär umwandeln;q0
= auf 0en aufgeteilt;äè
Ich bin mir nicht ganz sicher..; und das Flag-N
konvertiert Listen inNaN
, verlässt aber0
und1
dasselbe. Für denäè
Teil kann ich sehen, dass119
das[111,111]
nach der Spaltung ist, die sichäè
ändert zu1
; und85
ist[1,1,1,1]
nach der Spaltung, dieäè
ändert sich zu[1,1,1]
. Könnten Sie erklären, wie es.ä("è")
funktioniert?NaN
Falsey in Japt? (dh , wenn Sie eine durchführen , wenn-sonst mit , dass als Bedingung funktioniert die wenn sie ausgeführt werden? „truthy / falsy Ausgang muss die verwendete Sprache Spezifikationen für truthy / falsy erfüllen“) auch2
Erträge ,2
die ich ist Falsey zweifeln (aber vielleicht, wenn Japt ist wie 05AB1E).0
als wahr angesehen wird. Wenn2
sie jedoch2
als wahr zurückkommt, muss diese Übermittlung möglicherweise überarbeitet werden.Python 2 , 30 Bytes
Probieren Sie es online!
Beachten Sie, dass dies
2*n^2*n+3
das bitweise xor von2*n
und ist2*n+3
, da dies die Operator-Priorität von Python ist.quelle
lambda n:(2*n^2*n+3)**2-8*n-9
, mit einem Rückgabewert von0
für Zyklopenzahlen zurückzukehren?TRUE
fürn = -1
>1
.x86-Maschinencode, 17 Byte
Die obigen Bytes definieren eine Funktion, die einen 32-Bit-Integer-Eingabewert akzeptiert (im
EDI
Register für dieses Beispiel nach einer üblichen System V-Aufrufkonvention), aber Sie können praktisch jedes gewünschte Eingaberegister auswählen, ohne die Größe des Ergebnisses zu beeinflussen Code) und gibt ein Ergebnis (imEAX
Register) zurück, das angibt, ob der Eingabewert eine Cyclops-Nummer ist.Die Eingabe wird als vorzeichenlose Ganzzahl angenommen, da nach den Challenge-Regeln negative Werte ignoriert werden können.
Die Entscheidungslogik ist Neils Antwort entlehnt : Da eine Cyclops-Zahl die Form , können wir eine Reihe von Bit-Twiddling-Operationen verwenden, um die zu überprüfen Eingang.n = ( 2k+ 1 ) ( 2k - 1- 1 )
Hinweis: Der Rückgabewert ist wahr / falsch, aber die Semantik ist umgekehrt, so dass die Funktion für eine Cyclops-Nummer falsch zurückgibt. Ich behaupte, dass dies legal ist, da der Maschinencode keine "Spezifikationen für Wahrhaftigkeit / Falschheit" enthält, was die Anforderung in der Frage ist. (Eine alternative Version finden Sie weiter unten.)
In Assembler-Mnemonik ist dies:
Probieren Sie es online!
Wie versprochen, sollten Sie drei weitere Bytes hinzufügen, wenn Sie der Meinung sind, dass es Betrug ist, die Semantik von Wahrhaftigkeit / Falschheit auch in Maschinencode zu invertieren, für insgesamt 21 Bytes :
Die erste Hälfte dieses Codes ist die gleiche wie das Original (weiter unten in der
imul
Anweisung). Daslea
ist fast dasselbe, aber anstatt eine Konstante 2 hinzuzufügen, wird nur eine Konstante 1 hinzugefügt. Dies liegt daran, dass der folgendeinc
Befehl den Wert imEAX
Register um 1 erhöht , um die Flags zu setzen. Wenn das "Null" -Flag gesetzt ist, wird dersetz
BefehlAL
auf 1 gesetzt; AndernfallsAL
wird auf 0 gesetzt. Dies ist die Standardmethode, mit der ein C-Compiler Maschinencode generiert, um a zurückzugebenbool
.Das Ändern der in der
lea
Anweisung hinzugefügten Konstante ändert offensichtlich nicht die Codegröße, und dieinc
Anweisung ist sehr klein (nur 1 Byte), aber diesetz
Anweisung ist ziemlich satte 3 Bytes. Leider fällt mir keine kürzere Schreibweise ein.quelle
Regex (ECMAScript),
6058576058 BytesDie Eingabe ist als Länge einer Zeichenfolge von s unär.n
x
SPOILER-WARNUNG : Für die Quadratwurzel verwendet dieser Regex eine Variante des verallgemeinerten Multiplikationsalgorithmus. Dies ist nicht offensichtlich und kann ein lohnendes Rätsel sein, das Sie selbst lösen können . Weitere Informationen finden Sie in der Erklärung zu dieser Form des Algorithmus unter Suchen einer Rocco-Nummer .
-2 Bytes durch Ermöglichen des Zurückverfolgens bei der Suche nachz -1 Bytes dank Grimy , durch Suchen nach vom kleinsten zum größten anstatt umgekehrt +3 Bytes, um null -2 Bytes zu verarbeiten, indem die Quadratwurzel-Erfassung außerhalb des Lookaheads verschoben wirdz
z
Dies funktioniert durch Finden von , einer perfekten quadratischen Potenz von 2, für die . Nur die größte perfekte quadratische Potenz von 2, die nicht überschreitet, kann dies erfüllen. Aufgrund einer Golfoptimierung versucht der Regex jedoch, alle mit der kleinsten zu beginnen. Da jede einer Zyklopennummer entspricht, kann nur die größte zu einer Übereinstimmung führen.z n = 2 ( n - z) + z√+ 1 n
^(x*)(?!(x(xx)+)\2*$)(x(x*))(?=(?=(\4*)\5+$)\4*$\6)x\1$|^$
Probieren Sie es online!
quelle
^(1*)0\1$
genug?JavaScript (Node.js) , 20 Byte
Probieren Sie es online!
Vielleicht ist das richtig, vielleicht.
Danke Grimy, 1 Byte gespeichert.
JavaScript (Node.js) , 32 Byte
Probieren Sie es online!
JavaScript (Node.js) , 34 Byte
Probieren Sie es online!
quelle
.test
nicht.match
Perl 6 , 23 Bytes
Probieren Sie es online!
Regex-basierte Lösung
quelle
Japt ,
2519109 BytesVielen Dank an @Shaggy für -1 Byte
Probieren Sie es online!
quelle
Mathematica (Wolfram-Sprache),
32-31Bytes1 Byte gespart dank J42161217!
Probieren Sie es online!
Reine Funktion, die eine ganze Zahl als Eingabe nimmt und
True
oder zurückgibtFalse
. Aufgrund der Tatsache , (Spaß zu beweisen!) , Dass eine Reihen
Cyclops ist , wenn und nur wennn
plus der Quadratwurzeln/2
und2
Runden bis auf eine ungerade Potenz von 2 (Ein ersetzen kannFloor
entweder durchCeiling
oderRound
solange man ersetzt auch+2
durch+1
.) GibtTrue
bei der Eingabe zurück0
.quelle
Log2[#+Floor@Sqrt...
√()
anstelle vonSqrt[]
Ruby , 24 Bytes
Probieren Sie es online!
quelle
Japt, 8 Bytes
Vielen Dank an Luis felipe de Jesus Munoz für die Korrektur meiner Einsendung!
Probieren Sie es online!
Alte, auf Regex basierende Lösung, 15 Byte
Gibt 1 für wahr, 0 für falsch zurück.
Probieren Sie es online!
quelle
==
Operators!Gelee ,
87 Bytes-1 danke an Erik the Outgolfer (benutze isPalindrome
ŒḂ
, anstatt⁼Ṛ$
)Ein monadischer Link, der eine ganze Zahl akzeptiert, die
1
(wahr) oder0
(falsch) ergibt.Probieren Sie es online!
Wie?
quelle
Bċ0⁼1ȧŒḂ
ist auch 8 Bytes),⁼Ṛ$
ist die gleiche wieŒḂ
für -1. Außerdem müssen Sie keine negativen Zahlen verarbeiten.ṚƑ
es heutzutage auch an seiner Stelle verwenden, so dass Sie es sich vielleicht so merken möchten (die wichtigstenƑ
s).Haskell , 32 Bytes
Probieren Sie es online!
quelle
Regex (ECMAScript),
5347 Bytes-6 Bytes dank Deadcode und Grimy
Probieren Sie es online!
quelle
^((?=(x(x*?))(\3((x+)(?=\6$))+xx$))(?!\2{6})x\4)*$
Brachylog , 8 Bytes
Dies ist ein Prädikat, das erfolgreich ist, wenn seine Eingabe eine Cyclops-Nummer ist, und fehlschlägt, wenn seine Eingabe keine Cyclops-Nummer ist. Erfolg / Misserfolg ist das grundlegendste Konzept für Wahrhaftigkeit / Falschheit in Brachylog.
Probieren Sie es online! Oder finden Sie alle wahren Ausgaben bis zu 10000 .
Erläuterung
Dies gelingt nur mit einer Cyclops-Nummer, weil:
D↔D
schlägt dies fehl. im Folgenden können wir davon ausgehen, dass es sich um ein Palindrom handelt.×ᵐ≠
aus.×ᵐ≠
scheitern.×ᵐ≠
erfolgreich, und das ganze Prädikat ist erfolgreich.quelle
Ruby ,
2724 BytesIn Binär konvertieren und mit einem regulären Ausdruck prüfen. Gibt zurück,
0
wenn wahr,nil
wenn falsch.-3 Bytes dank GB .
Probieren Sie es online!
Für zwei Bytes mehr gibt es einen direkten Port der Python-Lösung:
quelle
05AB1E , 8 (oder 9) Bytes
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Gibt zurück,
1
wenn es wahr ist;0
oder irgendeine andere positive ganze Zahl1
als Falsey. In 05AB1E ist nur1
wahr und alles andere ist falsch, aber ich bin nicht sicher, ob dies eine zulässige Ausgabe ist oder ob die Ausgabe zwei konsistente und eindeutige Werte haben sollte. Wenn die zweiten, ein hinteresΘ
kann hinzugefügt werden , so dass alle Ausgänge außer1
werden0
:Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Ein arithmetischer Ansatz wäre 10 Bytes:
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
1
als truthy und alle anderen Zahlen als falsy akzeptabel ist für diese Herausforderung, da andere Sprachen (zB C und TI-BASIC) hat ähnliche truthy / falsy Definitionen (0 / Nicht-Null für beide). Solange das, was als wahr oder falsch angesehen wird, mit den Angaben der Sprache übereinstimmt, ist es ein faires Spiel.Excel,
9763 BytesBerechnet 2 Zahlen:
Dann subtrahiere die zweite Zahl von der ersten:
Und vergleichen Sie dieses Ergebnis mit der ursprünglichen Nummer
Alte Methode
Beginnen Sie mit der Log-Basis 2 von A1 und runden Sie sie auf die nächste gerade Zahl ab, dann addieren Sie 1.
Erstellen Sie als Nächstes eine Zeichenfolge mit so vielen
"1"
s und ersetzen Sie das mittlere Zeichen durch a"0"
, um eine Cyclops-Zahl mit einer Binärlänge zu erstellen, die immer ungerade ist und mindestens 1 der Binärlänge von A1 entsprichtVergleichen Sie es dann mit der Binärdarstellung von A1
quelle
R ,
3733 BytesProbieren Sie es online!
R verfügt nicht über eine integrierte Funktion zum Konvertieren in Binärdateien, daher habe ich einfach eine der Formeln von OEIS verwendet, um eine Liste von Begriffen aus der Sequenz zu berechnen.
n<-0:x
generiert eine großzügige Liste von Startwerten.2*4^(n<-0:x^2)-2^n-1)
ist die Formel von OEIS und prüft dann mit%in%
.-2 Bytes, da keine negativen Eingaben verarbeitet werden müssen. -2 Bytes durch die Erinnerung an die ich ändern kann
<-
zu=
.quelle
C (gcc), 26 Bytes
Probieren Sie es online!
Port of Neils Antwort . Verlässt sich auf die implementierungsdefinierte Reihenfolge der Vorgänge.
C ++ (clang), 38 Bytes
Probieren Sie es online!
Kann die Typen in C ++ nicht auslassen, kann die Rückgabe in clang nicht auslassen, sonst identisch.
quelle
return
anstelle des fragilen und plattformabhängigen impliziten Akkumulator-Rückgabewerts ein Exploit verwendet wird.C (GCC) ,
29 2827 Bytes1 Byte dank @ceilingcat gespeichert
Ein Port der 21-Byte-JS-Antwort von @tsh .
Probieren Sie es online!
quelle
J ,
22,19,17,15,14 Bytes-3 Bytes dank BolceBussiere!
-4 Bytes dank ngn!
-1 Byte dank Traws!
J , 14 Bytes
Probieren Sie es online!
quelle
#=1++/
(#=1++/)@(*|.)@#:
1=1#.1-(*|.)@#:
1=1#.(*:|.)@#:
Gelee , 9 Bytes
Probieren Sie es online!
quelle
Attache , 22 Bytes
Probieren Sie es online!
Alternativen
27 Bytes:
{BitXor[2*_,2*_+3]^2=8*_+9}
27 Bytes:
{BitXor@@(2*_+0'3)^2=8*_+9}
27 Bytes:
{Palindromic@_∧1=0~_}@Bin
28 Bytes:
{BitXor[...2*_+0'3]^2=8*_+9}
28 Bytes:
{BitXor[…2*_+0'3]^2=8*_+9}
28 Bytes:
{Same@@Bisect@_∧1=0~_}@Bin
29 Bytes:
{_[#_/2|Floor]=0∧1=0~_}@Bin
30 Bytes:
Same@Bin@{_+2^Floor[Log2@_/2]}
30 Bytes:
{_[#_/2|Floor]=0and 1=0~_}@Bin
quelle
Retina 0.8.2 ,
3837 BytesProbieren Sie es online! Link enthält Testfälle. Bearbeiten: Nach der Klärung hat die vorherige Lösung die Null nicht richtig gehandhabt. Erläuterung:
Konvertiert von dezimal zu unär.
Konvertieren Sie von unär nach binär mit der Methode aus dem Retina-Wiki.
Überprüfen Sie,
1
ob vor und nach0
oder nach einer leeren Zeichenfolge die gleiche Anzahl von s vorhanden ist (so behandelt die obige Konvertierung Null).quelle
Batch,
3937 Bytesquelle
Excel, 101
107Bytes-6 Bytes dank @Chronocidal.
Führt 3 Überprüfungen durch:
0
0
quelle
ISODD(LEN(DEC2BIN(A1)))
aufISEVEN(LOG(A1,2))
Regex (ECMAScript),
65595758 Bytes+1 Byte, um 0 richtig zu behandeln
Probieren Sie es online!
quelle
VBA,
4136 BytesIm Direktfenster mit deaktivierter expliziter Deklaration ausführen. Die Eingabe ist die Zelle
A1
des aktiven Arbeitsblatts. Gibt True / False im unmittelbaren Fenster aus.Verwendet die gleiche Logik wie meine Excel-Antwort , um die Cyclops-Nummer mit der gleichen Anzahl von Bits zu finden (oder 1 Bit kürzer, wenn es eine gerade Zahl gibt!) Und vergleicht diese dann mit der Eingabe.
Speichert einige Bytes bei der Berechnung von Cyclops-Zahlen, indem sie auf die Form reduziert werden
y = 2x^2 - x - 1
(wobeix = n-1
für die n-te Cyclops-Nummer oderx = 2^Int(Log([A1])/Log(4))
um die größte Cyclops-Nummer mit einer geringeren oder gleichen Anzahl von Bits zu finden) und x in einer Variablen gespeichert wird(-5 Bytes dank Taylor Scott !)
quelle
[...]
Notation wie[(Log(A1,4)]
PHP , 74 Bytes
Probieren Sie es online!
Völlig naiver, nicht mathematischer Ansatz, nur Streicher.
Oder 60 Bytes basierend auf dem obigen @ Chronocidal-Algorithmus .
Probieren Sie es online!
quelle
Haskell, 82 Bytes
Und eine Portierung der Python-Lösung von xnor:
Haskell, 47 Bytes
quelle