Dies sollte eine einfache Herausforderung sein.
Bei einer gegebenen Zahl n >= 0
wird der Superlogarithmus (oder der Logarithmus *, der Log-Stern oder der iterierte Logarithmus , die äquivalent sind, da er n
für diese Herausforderung niemals negativ ist) von ausgegeben n
.
Dies ist eine der beiden Umkehrfunktionen zur Tetration . Die andere ist die Superwurzel , die sich in einer verwandten Frage befindet .
Beispiele
Input Output
0 0
1 0
2 1
3 2
4 2
...
15 2
16 3
...
3814279 3
3814280 4
Regeln
- Sie müssen keine Dezimalstellen unterstützen, auch wenn Sie dies möchten.
- Sie müssen die Eingabe von mindestens unterstützen
3814280 = ceiling(e^e^e)
. - Sie können die Werte wie nicht hart codieren
3814280
. (Ihr Programm muss theoretisch höhere Zahlen unterstützen.) Ich möchte, dass ein Algorithmus implementiert wird. - Kürzester Code gewinnt.
code-golf
math
code-golf
array-manipulation
sorting
code-golf
math
arithmetic
matrix
code-golf
string
kolmogorov-complexity
code-golf
string
code-golf
math
sequence
arithmetic
recursion
code-golf
math
ascii-art
sequence
code-golf
math
array-manipulation
code-golf
code-golf
kolmogorov-complexity
code-golf
string
code-golf
string
decision-problem
code-golf
array-manipulation
tips
javascript
json
code-golf
math
string
number
number-theory
code-golf
math
sequence
fibonacci
number
arithmetic
fastest-code
integer
code-golf
math
sequence
code-golf
string
file-system
tips
golfscript
code-golf
string
code-golf
string
natural-language
code-golf
string
file-system
code-golf
math
array-manipulation
code-challenge
image-processing
compression
code-golf
math
number
sequence
code-golf
math
combinatorics
regular-expression
code-golf
sequence
pi
code-golf
ascii-art
code-golf
string
array-manipulation
sorting
code-golf
string
graph-theory
code-golf
string
code-golf
string
ascii-art
code-challenge
compression
code-golf
code-golf
math
sequence
number-theory
code-golf
maze
graph-theory
code-golf
math
sequence
mbomb007
quelle
quelle
Antworten:
Gelee , 8 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Hintergrund
Wir beginnen damit, nacheinander natürliche Logarithmen der Eingabe und der nachfolgenden Ergebnisse zu verwenden, bis sich das Ergebnis nicht mehr ändert. Dies funktioniert, weil die Ausdehnung des natürlichen Logarithmus auf die komplexe Ebene einen festen Punkt hat . wenn z = e - W (-1) ≤ 0,318 + 1,337i - wobei W die Lambert - W - Funktion bezeichnet - haben wir log (z) = z .
Für die Eingabe n wenden wir nach der Berechnung von [n, log (n), log (log (n)), ..., z] zunächst die Deckenfunktion auf jedes der Ergebnisse an. Jellys Implementierung (
Ċ
) berechnet stattdessen den Imaginärteil der komplexen Zahl † , was uns jedoch sowieso nicht interessiert.Sobald der k - te Anwendung der log einen Wert kleiner als oder gleich ergibt 1 ,
Ċ
kehrt 1 zum ersten Mal. Der auf 0 basierende Index dieser ersten 1 ist das gewünschte Ergebnis.Die unkomplizierte Implementierung (1-basierten Index berechnen, dekrementieren) schlägt fehl, da der Kantenfall 0 keine 1 in der Liste der Logarithmen enthält. Tatsächlich ist für den Eingang 0 die Reihenfolge der Logarithmen
Dies liegt daran, dass der Logarithmus von Jelly (
Æl
) überladen ist. es versucht zuerstmath.log
(realer Logarithmus), danncmath.log
(komplexer Logarithmus) und gibt schließlich "auf" und kehrt zurückNone
. GlücklicherweiseĊ
ist es ähnlich überladen und gibt einfach das Argument zurück, wenn es nicht aufrunden oder einen imaginären Teil übernehmen kann.Ebenso wird Eingang 1 zurückgegeben
Dies kann bei anderen Ansätzen zu Problemen führen
Ċ
.Eine Möglichkeit, dieses Problem zu beheben, besteht darin
Ḋ
, das Array von Logarithmen zuzuweisen (aus der Warteschlange zu entfernen; erstes Element zu entfernen). Diese KartenDaher hat keine der Listen jetzt eine 1 . Auf diese Weise, den Index der ersten Auffinden 1 zurückkehren wird 0 (nicht gefunden), die die gewünschte Ausgabe für die Eingänge 0 und 1 .
Wie es funktioniert
† Dies ist eines der wenigen Atome in Jelly, die auf nicht offensichtliche Weise überladen sind.
quelle
Gelee , 9 Bytes
Probieren Sie es online!
Testsuite. (Leicht verändert.)
Erläuterung
quelle
C 38 Bytes
Ziemlich selbsterklärend.
Probiere es auf ideone aus.
quelle
Javascript,
452726 BytesHier ist die Testsuite (3. Version)
Vielen Dank an @LeakyNun für das Speichern von 1 Byte mit der bedingten und anschließenden Konvertierung der Funktion in Lambda.
quelle
false
anstelle von 0 zurückgeben (da es in einem ganzzahligen Ausdruck automatisch in 0 konvertiert wird). In diesem Fall können Sie die fallen lassen|0
.Mathematica, 21 Bytes
Rekursive anonyme Funktion. Nimmt eine Ganzzahl als Eingabe und gibt ihren Superlogarithmus als Ausgabe zurück. Verwendet einfach die angegebene Definition.
quelle
Dyalog APL , 13 Bytes
Direkte Übersetzung von OP:
TryAPL online!
quelle
Pyth, 10 Bytes
Testsuite.
Dies definiert eine Funktion.
quelle
tl.u?>N1.l
Haskell, 23 Bytes
Anwendungsbeispiel:
l 3814280
->4
.quelle
Python 3, 45 Bytes
Für
x <= 1
kehrt dies zurückFalse
(was== 0
in Python ist).quelle
False
kann für verwendet werden0
.and
eher als verwendestif else
). Grats.05AB1E,
1613 BytesErläuterung
Probieren Sie es online aus
quelle
MATL ,
1512 BytesProbieren Sie es online! Oder überprüfen Sie alle Testfälle (leicht modifizierte Version, um mehrere Eingaben zu verarbeiten).
Wie es funktioniert
Wenden Sie beginnend mit 0 die iterierte Exponentiation an, bis die Eingabe überschritten wird. Die Ausgabe ist die Anzahl der Iterationen minus 1.
quelle
J ,
21,19,1816 Bytes2 Byte für Leaky Nun, 1 Byte für Galen Ivanov und 2 Byte für FrownyFrog gespeichert!
Probieren Sie es online!
Testfälle
quelle
2#@}.^.^:(0<])^:a:
(Ich fing an, das, was sich herausstellte, als Trottel dieses Problems zu betrachten.)2#@}.(0>.^.)^:a:
scheint zu funktionieren.Julia, 17 Bytes
Probieren Sie es online!
quelle
MATLAB / Octave, 44 Bytes
function a=g(n);a=0;if n>1;a=1+g(log(n));end
Es wurde versucht, alles als eine anonyme Funktion auszuführen, aber ich habe vergessen, dass MATLAB / Octave weiterhin Ausdrücke auswertet, auch wenn sie mit einem booleschen Wert false (Null) multipliziert werden:
f=@(n)(n>1)*(1+f(log(n)))
quelle
R,
3837 BytesVielen Dank an user5957401 für das zusätzliche Byte!
Testfälle:
quelle
if(x>1)1+f(log(x))else 0
ist ein Byte kürzer.R , 34 Bytes
Probieren Sie es online!
Ein nicht rekursiver Ansatz ist möglich: 36 Bytes und nimmt die Eingabe von stdin entgegen.
quelle
Java 7, 47 Bytes
Probieren Sie es online aus.
Die oben beschriebene Methode im rekursiven Java 7-Stil ist 2 Byte kürzer als ein iteratives Lambda im Java 8-Stil:
Probieren Sie es online aus.
Erläuterung:
quelle
Emacs Lisp, 38 Bytes
Testfälle:
quelle
Gelee , 8 Bytes
Einfache Umsetzung der Definition. Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Perl 5, 35 Bytes
Sehr einfach, benötigt
-M5.016
(was kostenlos ist), um das__SUB__
Schlüsselwort für die anonyme Rekursion zu aktivieren .Eine andere Alternative ist
Dies ist 34 Byte und gibt für alle Eingaben> 1 die gleiche Ausgabe aus, gibt jedoch den speziellen falschen Wert für Eingaben <= 1 zurück. False ist numerisch gleich Null, wird jedoch als "" (leere Zeichenfolge) ausgegeben. t qualifizieren.
quelle
sub{($_=pop)>1?1+__SUB__->(log):0}
wenn Sie dies tunCJam (16 Bytes)
Online-Demo
Einfache While-Schleife mit Vorbedingung. (Was ich hier wirklich möchte, ist eine Entfaltungsoperation im Golfscript-Stil, aber CJam hat keine, und Gleitkomma in GolfScript ist chaotisch und überhaupt nicht Golf).
quelle
PARI / GP , 24 Bytes
Nur die einfache Rekursion.
quelle
Schläger, 61 Bytes
quelle
Ahorn,
32,3029 BytesTestfälle:
quelle
R, 36 Bytes
Etwas anderer Ansatz als bei Plannapus
Verwendet eine Rechtezuweisung, um den Code auszuführen - daher muss die gewünschte Nummer davor stehen. dh
quelle
Mathematica, 29 Bytes
Einfach wie die Hölle und funktioniert sowohl für komisch große als auch für negative Eingänge:
quelle
Ruby, 29 Bytes
quelle
n<=1?a:b
alsn>1?b:a
und -1 Byte mit anonymen Lambda-Funktionen .Perl 6 , 21 Bytes
Probieren Sie es online!
Der Ausdruck in Klammern ist eine Sequenz.
$_
, das Argument für die Funktion, ist das erste Element.*.log
generiert jedes nachfolgende Element, indem es das Protokoll des vorherigen Elements aufnimmt. Die Sequenz wird fortgesetzt, bis die Endebedingung1 >= *
wahr ist: 1 ist größer oder gleich dem aktuellen Element. Das Subtrahieren von 1 von der Sequenz zwingt es zu einer Zahl: seiner Länge.quelle