Bei einer positiven ganzen Zahl n und eine Anzahl ein , die n -te tetration of a ist definiert als ein ^ ( ein ^ ( ein ^ (^ ... ein ))), wobei ^ bezeichnet Potenzierung (oder Leistung) und der Ausdruck enthält die nummer a genau n mal.
Mit anderen Worten, Tetration ist rechtsassoziativ iterierte Potenzierung. Für n = 4 und a = 1,6 beträgt die Tetration 1,6 ^ (1,6 ^ (1,6 ^ 1,6)) ≈ 3,5743.
Die inverse Funktion der tetration mit Bezug auf n ist der Super-Logarithmus . Im vorherigen Beispiel ist 4 der Superlogarithmus von 3,5743 mit "Super-Base" 1,6.
Die Herausforderung
Wenn eine positive ganze Zahl n gegeben ist , finde x so, dass n der Superlogarithmus von sich selbst in der Super-Basis x ist . Das heißt, finden x , so daß x ^ ( x ^ ( x ^ (... ^ x ))) (mit x erscheinenden n mal) gleich n .
Regeln
Programm oder Funktion erlaubt.
Eingabe- und Ausgabeformate sind wie gewohnt flexibel.
Der Algorithmus sollte theoretisch für alle positiven ganzen Zahlen funktionieren. In der Praxis kann die Eingabe aufgrund von Speicher-, Zeit- oder Datentypbeschränkungen auf einen Maximalwert beschränkt sein. Der Code muss jedoch für Eingaben 100
mindestens in weniger als einer Minute funktionieren .
Der Algorithmus sollte theoretisch das Ergebnis mit 0.001
Präzision liefern . In der Praxis kann die Ausgabegenauigkeit aufgrund von akkumulierten Fehlern bei numerischen Berechnungen schlechter sein. Die Ausgabe muss jedoch bis zu 0.001
den angegebenen Testfällen genau sein .
Kürzester Code gewinnt.
Testfälle
1 -> 1
3 -> 1.635078
6 -> 1.568644
10 -> 1.508498
25 -> 1.458582
50 -> 1.448504
100 -> 1.445673
Referenzimplementierung
Hier ist eine Referenzimplementierung in Matlab / Octave (versuchen Sie es bei Ideone ).
N = 10; % input
t = .0001:.0001:2; % range of possible values: [.0001 .0002 ... 2]
r = t;
for k = 2:N
r = t.^r; % repeated exponentiation, element-wise
end
[~, ind] = min(abs(r-N)); % index of entry of r that is closest to N
result = t(ind);
disp(result)
Dafür N = 10
gibt es result = 1.5085
.
Der folgende Code dient zur Überprüfung der Ausgabegenauigkeit mithilfe von Arithmetik mit variabler Genauigkeit:
N = 10;
x = 1.5085; % result to be tested for that N. Add or subtract 1e-3 to see that
% the obtained y is farther from N
s = num2str(x); % string representation
se = s;
for n = 2:N;
se = [s '^(' se ')']; % build string that evaluates to iterated exponentiation
end
y = vpa(se, 1000) % evaluate with variable-precision arithmetic
Das gibt:
- Für
x = 1.5085
:y = 10.00173...
- Für
x = 1.5085 + .001
:y = 10.9075
- Denn
x = 1.5085 - .001
es gibty = 9.23248
.
Das 1.5085
ist eine gültige Lösung mit .001
Präzision.
x
konvergieren alsn
unendlich geht?Antworten:
Dyalog APL ,
3325 BytesBedürfnisse,
⎕IO←0
die auf vielen Systemen Standard sind.Theoretisch berechnet für alle ganzen Zahlen, aber praktisch nur für sehr kleine.
TryAPL online!
quelle
Haskell,
555452 BytesVerwendung:
Danke an @nimi für 1 Byte!
Danke an @xnor für 2!
quelle
[ ]!!0
statthead[ ]
speichert ein Bytes n=[x|x<-[2,1.9999..],n>iterate(x**)1!!n]!!0
wäre kürzer, wenn Sie Haskell dazu bringen könnten, seine Typen zu akzeptieren.Javascript, ES6: 77 Byte / ES7:
5753 ByteES6
ES7
Verwendung
**
wie von DanTheMan vorgeschlagen:Beispiel
quelle
**
anstelle von verwendenMath.pow
.Mathematica,
4033 BytesDank Murphy für fast 20% Ersparnis!
Nest[x^#&,1,n]
erzeugt die n-te Tetration von x.Nest[x^#&,1,#]<#
Prüft also , ob die (Eingabe) -te Tetration von x kleiner als (Eingabe) ist. Wir beginnen einfach bei x = 1 und addieren 0,001 so oft, bis die Tetration zu groß ist, und geben dann den letzten x-Wert aus (damit die Antwort garantiert größer als der exakte Wert ist, aber innerhalb von 0,001).Wie ich langsam lerne:
//.x_:>y/;z
oder//.x_/;z:>y
bedeutet "Suche nach etwas, das mit der Vorlage x übereinstimmt, aber nur nach Dingen, für die der Test z true zurückgibt; und bearbeite dann x durch die Regel y; so oft, bis sich nichts mehr ändert". Hier ist das Templatex_
nur "irgendeine Zahl, die ich sehe", obwohl es in anderen Zusammenhängen weiter eingeschränkt werden könnte.Wenn die Eingabe mindestens 45 ist, steigt die Tetration so schnell an, dass dieser letzte Schritt einen Überlauffehler verursacht. Der Wert von x wird jedoch weiterhin aktualisiert und korrekt ausgegeben. Das Verringern der Schrittgröße von 0,001 auf 0,0001 behebt dieses Problem für Eingaben bis zu 112 und gibt eine genauere Antwort auf das Booten (und läuft immer noch schnell, in ungefähr einer Viertelsekunde). Aber das ist ein zusätzliches Byte, also vergiss das!
Originalfassung:
quelle
1//.x_:>x+.001/;Nest[x^#&,1,#]<#&
//.
ohne Hilfe verwenden kann :)J,
393128 BytesBasierend auf der Referenzimplementierung. Es ist nur auf drei Dezimalstellen genau.
8 Bytes mit der Methode von @ Adáms Lösung gespeichert .
Verwendung
Zusätzliche Befehle zum Formatieren mehrerer Ein- / Ausgaben.
Erläuterung
quelle
Python, 184 Bytes
Testausgabe (Überspringen der tatsächlichen Druckanweisungen):
quelle
s(1000000)
ziemlich schnellSchläger 187 Bytes
Testen:
Ausgabe:
Ausführliche Version:
quelle
Perl 6 , 42 Bytes
(Übersetzung eines Matlab-Beispielcodes)
Prüfung:
quelle
PHP, 103 Bytes
quelle
Axiom 587 Bytes
weniger Golf + Zahlen
quelle
Common Lisp, 207 Bytes
Durch die Verwendung von
reduce
with wird:from-end t
die Notwendigkeit einer "Umkehrung der Exponentiation" von Lambda-Zwischenwerten vermieden (im Grunde(lambda (x y) (expt y x))
werden 14 Byte gespart (12, wenn Sie entfernbare Leerzeichen entfernen).Wir müssen den Float-Überlauf noch behandeln, aber ein
ignore-errors
Formular wird zurückgegeben,nil
wenn ein Fehler aufgetreten ist, sodass wiror
einen Standardwert bereitstellen können.quelle