Eine halbe Exponentialfunktion ist eine, die, wenn sie mit sich selbst zusammengesetzt ist, eine Exponentialfunktion ergibt. Wenn zum Beispiel, f(f(x)) = 2^x
dann f
wäre das eine halbexponentielle Funktion. In dieser Aufgabe berechnen Sie eine bestimmte halbexponentielle Funktion.
Im Einzelnen berechnen Sie die Funktion von den nicht negativen Ganzzahlen zu den nicht negativen Ganzzahlen mit den folgenden Eigenschaften:
Monoton steigend: wenn
x < y
, dannf(x) < f(y)
Mindestens die Hälfte exponentielle: Für alle
x
,f(f(x)) >= 2^x
Lexikographisch am kleinsten: Geben Sie unter allen Funktionen mit den oben genannten Eigenschaften diejenige aus, die minimiert wird
f(0)
, die bei dieser Auswahl minimiertf(1)
wirdf(2)
, und so weiter.
Die Anfangswerte dieser Funktion für Eingaben 0, 1, 2, ...
sind:
[1, 2, 3, 4, 8, 9, 10, 11, 16, 32, 64, 128, 129, 130, 131, 132, 256, 257, ...]
Sie können diese Funktion über eine der folgenden Methoden ausgeben, entweder als Funktion oder als vollständiges Programm:
Nehmen Sie
x
als Eingabe, Ausgabef(x)
.Nehmen Sie
x
als Eingang, Ausgang der erstenx
Wertef
.Endlos alles ausgeben
f
.
Wenn Sie nehmen x
und ausgeben möchten f(x)
, x
muss Null indiziert sein.
Dies ist Code Golf - kürzester Code in Bytes gewinnt. Standardlücken sind wie immer verboten.
Antworten:
JavaScript (ES7),
5148 Byte3 Bytes dank @Arnauld eingespart
Nimmt n auf und gibt das n -te Element in der Sequenz aus.
JavaScript (ES7),
706864 ByteEine rekursive Funktion, die
x
die erstenx
Elemente der Sequenz als Array aufnimmt und zurückgibt .Wie es funktioniert
Das Array a wird einzeln prozedural generiert, bis es die gewünschte Länge erreicht. (Eine Portierung der unendlichen Technik, die in der ausgezeichneten Python-Antwort von xnor verwendet wird, wäre wahrscheinlich kürzer.)
Für jeden Index i (0-indiziert) können wir folgende Beobachtung machen :
Dies ist wahr, weil f (f (j)) mindestens 2 j sein muss und f (f (j)) äquivalent zu a [a [j]] ist , was wiederum äquivalent zu a [i] ist .
Normalerweise ist die richtige Option genau 2 j . Jedoch für den singulären Fall = I 2 , 2 in dem Array existiert bei Index j = 1 , was bedeutet , dass 2 j wäre 2 -but Das heißt, wir hätten 2 sowohl auf a [1] und a [2] . Um dies zu umgehen, nehmen wir das Maximum von 2 j und a [i-1] + 1 (eins mehr als der vorherige Punkt), was 3 für i = 2 ergibt .
Diese Technik kümmert sich auch darum, zu entscheiden, ob j existiert oder nicht - wenn dies nicht der Fall ist, gibt die
.indexOf()
Methode von JS -1 zurück , was dazu führt, dass das Maximum von [i-1] + 1 und 2 -1 = 0,5 angenommen wird . Da alle Elemente in der Sequenz mindestens 1 sind , wird immer das vorherige Element plus eins zurückgegeben.(Ich schreibe diese Erklärung spät in der Nacht, also lass es mich wissen, wenn etwas verwirrend ist oder ich etwas verpasst habe.)
quelle
272
und höher aufgrund von Integer-Überlaufproblemen falsche Antworten geben. Dies ist in Ordnung, da es bis zur Grenze des Datentyps funktioniert.2**
statt1<<
hoffentlich das Problem zu beheben..99
tötet das die Lösung. Aber warum+.99
und nicht nur+.9
? Was ist der Unterschied?Math.log2(...)
und die Decke berechnen musste. Jetzt wird es überhaupt nicht benötigt. Vielen Dank! Ich werde in die2**
Sache schauen - ich habe2**...+.99|0
ursprünglich verwendet, war aber1<<
kürzer, weil ich das nicht brauchte|0
. Jetzt denke ich, dass es keinen Unterschied gibt ...Python 2 , 60 Bytes
Probieren Sie es online!
Druckt für immer.
Python , 61 Bytes
Probieren Sie es online!
Eine Funktion. Ausgänge
True
anstelle von1
.quelle
Perl 5, 53 + 1 (
-p
) = 54 BytesProbieren Sie es online aus
quelle
Bash, 66 Bytes
Probieren Sie es online aus
quelle
Jelly , 14 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Python 2 , 111 Bytes
Probieren Sie es online!
Dies ist eine wesentliche Änderung der Antwort von user202729 . Ich hätte diese Verbesserung als Kommentar gepostet, aber die Antwort wurde gelöscht und daher sind Kommentare deaktiviert.
quelle
x**2
es zu klein ist.x=1000
. Vielleicht möchten Sie es versuchen2**x
- furchtbar groß, aber Codegolf ist Codegolf.2**x
einen viel zu großen Bereich erzeugt, als dass Python fortfahren könnte.Schnell , 137 Bytes
Nimmt die Eingabe als
Int
(Ganzzahl) und druckt als[Int]
(Ganzzahl-Array).Ungolfed-Version
quelle
?
?