Eine Cullen-Zahl ist eine beliebige Zahl, die in der mit folgender Formel erzeugten Sequenz enthalten ist:
C (n) = (n * 2 ^ n) +1.
Deine Aufgabe:
Schreiben Sie ein Programm oder eine Funktion, die eine Eingabe empfängt und einen Wahrheits- / Falschwert ausgibt, basierend darauf, ob die Eingabe eine Cullen-Zahl ist.
Eingang:
Eine nicht negative ganze Zahl zwischen 0 und 10 ^ 9 (einschließlich).
Ausgabe:
Ein wahrer / falscher Wert, der angibt, ob die Eingabe eine Cullen-Zahl ist.
Testfälle:
Input: Output:
1 ---> truthy
3 ---> truthy
5 ---> falsy
9 ---> truthy
12 ---> falsy
25 ---> truthy
Wertung:
Das ist Code-Golf , also gewinnt die niedrigste Punktzahl in Bytes.
code-golf
number
decision-problem
Gryphon - Setzen Sie Monica wieder ein
quelle
quelle
n
scheint 0-basiert zu sein.Ḷ
oder eine enthalten sollteR
:-)Antworten:
Pyth,
65 Bytesversuche es online
quelle
x86_64-Maschinencode ( System V ABI ),
2827 Byte-1 Byte danke an @Cody Gray, danke!
Ein Algorithmus mit konstanter Zeit!
Erläuterung:
Sei y eine ganze Zahl und
x=y*2^y + 1
. Protokolle nehmen, haben wiry + log2(y) = log2(x-1)
alsoy=log2(x-1)-log2(y)
. Wenn wir den Wert von y zurücksetzen, erhalten wiry=log2(x-1)-log2(log2(x-1)-log2(y))
. Dadurch noch einmal, so erhalten wir:y=log2(x-1)-log2[log2(x-1)-log2(log2(x-1)-log2(log2(x-1)-log2(y)))]
.Entfernen wir die letzten Begriffe (in der Größenordnung von
log2(log2(log2(log2(x))))
, das sollte sicher sein!) Und gehenx-1≈x
wir davon aus, dass wir erhalten:y≈log2(x)-log2[log2(x)-log2(log2(x))]
Nun
f(n) = floor(log2(n))
kann manuell überprüft werden, oby
genau abgerufen werden kann durch:y=f(x)-f[f(x)-f(f(x))]
für y <26 und somit x x 10 ^ 9 , wie durch die Abfrage (1) angegeben .Der Algorithmus besteht dann einfach darin, y mit gegebenem x zu berechnen und zu überprüfen, ob x == y * 2 ^ y + 1 ist . Der Trick ist, dass
f(n)
einfach alsbsr
Befehl (Bit-Scan-Reverse) implementiert werden kann , der den Index des ersten 1-Bit in n undy*2^y
as zurückgibty << y
.Ausführlicher Code:
(1) Tatsächlich scheint diese Gleichheit für Werte von y bis 50000 zu gelten.
quelle
eax
würde es Ihnen ermöglichen, diemovzbl
Einsparung von 1 Byte zu eliminieren . Sie müssten das XOR vor demcmpl
ausführen, damit die Flags nicht verstopfen, aber das ist völlig in Ordnung, denn nichts danach hängt davon abeax
. Oder Sie könnten einfach entscheiden, dass die Methode nur in den unteren 8 Bits einen Booleschen Wert zurückgibt und alle 3 Bytes spart!Gelee ,
76 BytesProbieren Sie es online!
Übernimmt die Eingabe als Befehlszeilenargument. Wenn eine Cullen-Zahl C ( n ) angegeben wird, wird n +1 ausgegeben (was in Jelly wahr ist, da es sich um eine Ganzzahl ungleich Null handelt. Beachten Sie, dass n ≥ 0 ist, da die Eingabe eine Ganzzahl ist und Cullen-Zahlen mit negativem n niemals Ganzzahlen sind.) . Wenn eine Nicht-Cullen-Zahl angegeben wird, wird 0 zurückgegeben, was in Jelly falsch ist.
Erläuterung
Bilden Sie im Grunde genommen ein Array von Cullen-Zahlen minus eins und suchen Sie dann darin nach der Eingabe minus eins. Wenn die Eingabe eine Cullen-Zahl ist, werden wir sie finden, andernfalls nicht. Beachten Sie, dass das Array unbedingt lang genug ist, um den Eingang zu erreichen, da C ( n ) immer größer als n ist .
quelle
JavaScript (ES6),
37-35Byte2 Bytes gespart dank Neil
Demo
Code-Snippet anzeigen
quelle
x<n?f(n,k+1):x==n
Arbeit?undefined+1===NaN
aber-~undefined===1
. Sie können hier mehr über diese lesen .Haskell, 28 Bytes
Probieren Sie es online!
quelle
Ohm , 8 Bytes
Probieren Sie es online!
quelle
PHP , 43 Bytes
Probieren Sie es online!
quelle
$argn
eine spezielle Variable? Das Ändern auf$a
würde 6 Bytes sparen: tio.run/##K8go@G9jX5BRwKWSaKtkaGaoZP0/…$argn
ist verfügbar, wenn Sie PHP über die Befehlszeile mit der-R
Option05AB1E , 7 Bytes
Probieren Sie es online!
Erläuterung:
quelle
R ,
535146 ByteAnonyme Funktion. Überprüft, ob
x
in der Folge C (n) für n in [0, x] generiert wird.3 Bytes Golf von Giuseppe.
Probieren Sie es online!
quelle
x%in%...
anstelle vonany(x==...)
; Das werden Sie 4 Bytes fallen lassenlapply
einfach den Vektor prüfen" und "verwenden"scan
anstelle von Funktionsargumenten ändere, erhalte ich die Antwort von @giuseppe. Vielen Dank, dass Sie es separat veröffentlicht haben, damit ich sehen kann, was mir fehlt. Ich lerne mehr, indem ich selbst etwas versuche, auch wenn ich normalerweise verliere.C, C ++, Java, C #, D: 70 Byte
Aufgrund der Ähnlichkeiten zwischen all diesen Sprachen funktioniert dieser Code für jede Sprache
quelle
i=30;i--;)if(i<<i==n-1)
anstelle voni=0;i<30;++i)if((1<<i)*i+1==n)
Python, 40 Bytes
Probieren Sie es online!
quelle
Python 2 , 36 Bytes
Probieren Sie es online!
Ausgaben durch Nichtabstürzen / Abstürzen, wie derzeit durch diese Metakonzession zulässig .
Python 2 , 42 Bytes
Probieren Sie es online!
Ausgänge über Exit-Code
quelle
R , 26 Bytes
Probieren Sie es online!
Ein etwas anderer Ansatz als die andere R-Antwort ; liest aus
stdin
und da der Eingang garantiert zwischen 0 und 10 ^ 9 liegt, müssen wir nurn
zwischen 0 und 26 prüfen .quelle
scan()
. Gute Arbeit.APL (Dyalog) , 9 Bytes
Um den Fall von n = 1 abzudecken , benötigt es
⎕IO←0
was auf vielen Systemen Standard ist.Probieren Sie es online!
⊢
[ist] n (das Argument)∊
ein Mitglied von1
eins+
Plus⍳
die i ntegers 0 ... ( n - 1)×
mal2
zwei*
hoch⍳
die i ntegers 0 ... ( n - 1)quelle
⎕IO←0
Nicht-Standard anzurufen , da viele es tatsächlich immer so eingestellt haben, ohne dass jedes Mal eine Angabe erforderlich ist.⎕IO←0
.Python 2 , 32 Bytes
Probieren Sie es online!
Erstellt eine Liste mit Cullen-Zahlen bis zu
10^9
und zählt dann, wie oft die Eingabe darin erscheint. Vielen Dank an Vincent für den Hinweis,n<<n|1
anstatt(n<<n)+1
2 Bytes zu sparen.quelle
n<<n|1
(n<<n
gerade) speichern ;)838860801
. Sie brauchenrange(26)
, weil das Sortiment nicht inklusive ist.D, 65 Bytes
Dies ist ein Port von @ HatsuPointerKuns Algorithmus zu D (das Original war bereits D-Code, aber dies ist mit D-spezifischen Tricks)
Wie? (D spezifische Tricks)
Das Vorlagensystem von D ist kürzer als das von C ++ und kann auf Typen schließen. Außerdem initialisiert D seine Variablen bei der Deklaration auf den Standardwert.
quelle
Mathematica, 30 Bytes
Reine Funktion, die eine nichtnegative Ganzzahl als Eingabe verwendet und
True
oder zurückgibtFalse
. Wenn die Eingaben
, so(r=Range@#-1)
setzt die Variabler
zu sein{0, 1, ..., n-1}
, und dannr2^r+1
berechnet vektoriell die erstenn
Zahlen Cullen.MemberQ[...,#]
prüft dann, obn
es sich um ein Element der Liste handelt.quelle
Mathematica, 32 Bytes
quelle
Excel VBA, 45 Bytes
Anonyme VBE-
[A1]
Direktfensterfunktion, die Eingaben von Zellen und Ausgängen in das VBE-Direktfenster übernimmtMuss in einem sauberen Modul ausgeführt werden oder Werte für i, j müssen zwischen den Durchläufen auf den Standardwert 0 zurückgesetzt werden
Input-Output
I / O wie im VBE-Direktfenster angezeigt
quelle
Swi-Prolog, 69 Bytes
f(X)
ist erfolgreich, wenn ein Wert I gefunden wird, bei dem X = I * 2 ^ I + 1 ist. Der Range-Hinweis verhindert, dass der Stack-Platz knapp wird, aber er reicht für den Bereich von Cullen-Zahlen bis 10 ^ 9 in der Frage-Spezifikation.z.B
quelle
cQuents , 9 Bytes
Probieren Sie es online!
Erläuterung
quelle
TI-BASIC, 17 Bytes
Erläuterung
quelle
QBIC , 24 Bytes
Erläuterung
quelle
k , 19 Bytes
Probieren Sie es online aus. Wahrheit ist ein Array mit einer Zahl:
,3
oder so,0
weiter. Falsey ist ein leeres Array:()
oder!0
abhängig von Ihrem Interpreter.quelle
Java (OpenJDK 8) , 56 Byte
Probieren Sie es online!
quelle
Pari / GP , 25 Bytes
Probieren Sie es online!
quelle