Der unendliche Kraftturm

22

Die Herausforderung

Ganz einfach, wenn Sie einen Input haben x, berechnen Sie, dass es ein unendlicher Power Tower ist!

x^x^x^x^x^x...

Für Sie Mathe-Liebhaber da draußen ist dies eine xunendliche Tetration .

Beachten Sie Folgendes:

x^x^x^x^x^x... = x^(x^(x^(x^(x...)))) != (((((x)^x)^x)^x)^x...)

Wir waren überrascht, dass wir keine "einfache" mathematische Herausforderung hatten! *

Annahmen

  • xwird immer konvergieren.
  • Negative und komplexe Zahlen sollten behandelt werden können
  • Das ist , also gewinnt das niedrigste Byte !
  • Ihre Antworten sollten auf mindestens 5 Dezimalstellen genau sein

Beispiele

Input >> Output

1.4 >> 1.8866633062463325
1.414 >> 1.9980364085457847
[Square root of 2] >> 2
-1 >> -1
i >> 0.4382829367270323 + 0.3605924718713857i
1 >> 1
0.5 >> 0.641185744504986
0.333... >> 0.5478086216540975
1 + i >> 0.6410264788204891 + 0.5236284612571633i
-i >> 0.4382829367270323 -0.3605924718713857i
[4th root of 2] >> 1.239627729522762

* (Anders als eine kompliziertere Herausforderung hier )

Graviton
quelle
1
Ich glaube nicht, dass dieser Turm bei x = −2 oder x = −0.5 konvergiert .
Anders Kaseorg
@AndersKaseorg Ich stimme zu, obwohl alle Programme die gleiche konvergierende Antwort zu haben scheinen. Warum laufen sie nicht zusammen?
Graviton
2
x = −2 wird von einem 8-Zyklus angezogen und x = −0.5 von einem 6-Zyklus. (Mein Programm gibt in diesen Fällen immer noch eine Antwort, aber es ist einer der Punkte im Zyklus und kein fester Punkt; dies zeigt keine Konvergenz an.)
Anders Kaseorg,
@AndersKaseorg Aha sehr interessant. Sie würden nicht zufällig wissen, warum "8" für -2 und "6" für -0,5? Natürlich nur aus Neugier.
Graviton
2
Sie können die Iterationen genauso einfach ausführen wie ich, aber hier ist ein Bild: commons.wikimedia.org/wiki/File:Tetration_period.png
Anders Kaseorg

Antworten:

10

Pyth,  4  3 Bytes

durchgestrichen 4 ist immer noch regulär 4; (

u^Q

Probieren Sie es online aus

Wie es funktioniert

u       first repeated value under repeated application of G ↦
 ^QG        input ** G
    Q   starting at input
Anders Kaseorg
quelle
2
Sie brauchen nicht das letzte G, es wird automatisch ausgefüllt.
FryAmTheEggman
@FryAmTheEggman Richtig, danke!
Anders Kaseorg
7

Haskell , 100 63 Bytes

Bei Eingaben, die nicht konvergieren (z. B. -2), wird dies nicht beendet:

import Data.Complex
f x=until(\a->magnitude(a-x**a)<1e-6)(x**)x

Vielen Dank @ ØrjanJohansen, dass du untilmir das beigebracht und mir 37Bytes gespart hast !

Probieren Sie es online!

ბიმო
quelle
1
Sie können dies mit der untilFunktion erheblich verkürzen . Probieren Sie es online!
Ørjan Johansen
Ordentlich! Wusste nicht until, vielen Dank.
25.
7

Python 3 , 40 39 35 Bytes

  • Vielen Dank an @ Ørjan Johansen für ein Byte: d>99anstelle von d==99: 1 weitere Iteration für eine geringere Anzahl von Bytes
  • Danke @Uriel für 4 Bytes: sinnvolle Ausnutzung der Tatsache, dass x**Truex in ausgewertet wird x**(d>99or g(x,d+1)). Der Ausdruck im Ausdruck wird für Tiefen größer als 99 als True ausgewertet und gibt somit den übergebenen Wert zurück.

Rekursives Lambda mit einer maximalen Tiefe von 100, dh für eine Tiefe von 100, gibt den gleichen Wert zurück. Tatsächlich ist es konvergenzunabhängig. Erwarten Sie daher das Unerwartete für Zahlen mit nicht konvergierenden Werten für die Funktion.

g=lambda x,d=0:x**(d>99or g(x,d+1))

Probieren Sie es online!

officialaimm
quelle
1
Im tio Link können Sie complex('j')mit1j
Mr. Xcoder
1
d>99macht noch eine Iteration und ist kürzer.
Ørjan Johansen
1
4 Bytes mit speichern g=lambda x,d=0:x**(d>99or g(x,d+1)), x**Trueergibtx
Uriel
@Uriel, das ist echt schlau ..... Danke !!!
Amtszeit
6

Python 3, 37 30 27 Bytes

-7 Bytes von @FelipeNardiBatista.
-3 Bytes von von @xnor

Ich kann mich nicht mehr an viel Python erinnern, aber ich konnte meine Ruby-Antwort portieren und die andere Python 3-Antwort schlagen: D

lambda x:eval('x**'*99+'1')

Probieren Sie es online!

daniero
quelle
1
Zu Ihrer Information , es scheint, dass F-Strings zum ersten Mal in Python 3.6 eingeführt wurden: siehe python.org/dev/peps/pep-0498 . (Dies würde erklären, warum Ihr Code in 3.5.2 nicht für mich funktioniert hat.) Ich dachte nur, ich würde dies erwähnen, falls jemand anderes verwirrt wäre.
Mathmandan
1
Sie müssen nicht im Wert von x, eval('x**'*99+'1')works
xnor
@xnor doh, natürlich tut es :) danke
daniero
@ Xnor Neat - Ich habe das gleiche in meine Ruby-Antwort angewendet und es irgendwie behoben :)
Daniero
+1, ich schlage mich dafür, dass ich die Existenz von eval vergessen habe ....: D
officialaimm
4

Mathematica, 12 Bytes

#//.x_:>#^x&

Nimmt eine Gleitkommazahl als Eingabe.

Alephalpha
quelle
4

J , 5 Bytes

^^:_~

Probieren Sie es online!

Erläuterung

Zuerst werde ich zeigen, welcher Befehl ausgeführt wird, nachdem das ~am Ende analysiert wurde , und der Durchgang wird für das neue Verb sein.

(^^:_~) x = ((x&^)^:_) x

((x&^)^:_) x  |  Input: x
      ^:_     |  Execute starting with y = x until the result converges
  x&^         |    Compute y = x^y
Meilen
quelle
Die J-Lösung ist hier wirklich schön. Um Ihre erste Zeile in feineres Korn zu (^^:_) zerlegen , ist es richtig zu sagen, dass Folgendes passiert: Erstellt ein neues dyadisches Verb über die Potenz-Konjunktion, dann ~macht das Selbst-Adverb dieses Verb monadisch, so dass es bei gegebenem Argument xerweitert wird x (^^:_) x. das linke bleibt xanschließend "stecken" und gibt ((x&^)^:_) xje nach notiz nur das richtige argument während der iteration wieder?
Jonah
1
@Jonah Sicher, wenn einer Dyade mit Macht zwei Argumente gegeben werden, x u^:n ywird das linke Argument mit der Dyade verbunden, um eine Monade zu bilden, die sich das ganze nMal ineinander verschachtelt y. x u^:n y -> (x&u)^:n y -> (x&u) ... n times ... (x&u) y
Meilen
4

C # (.NET Core) , 79 bis 78 Byte

x=>{var a=x;for(int i=0;i++<999;)a=System.Numerics.Complex.Pow(x,a);return a;}

Probieren Sie es online!

Ich habe mich für eine Iteration bis i= 999 entschieden, da einige Beispiele bei einer Iteration bis 99 nicht die erforderliche Genauigkeit erreichten. Beispiel:

Input:                      (0, 1)
Expected output:            (0.4382829367270323, 0.3605924718713857)
Output after 99 iterations: (0.438288569331222,  0.360588154553794)
Output after 999 iter.:     (0.438282936727032,  0.360592471871385)

Wie Sie sehen, ist der Imaginärteil nach 99 Iterationen auf der 5. Dezimalstelle ausgefallen.

Input:                      (1, 1)
Expected output:            (0.6410264788204891, 0.5236284612571633)
Output after 99 iterations: (0.64102647882049,   0.523628461257164)
Output after 999 iter.:     (0.641026478820489,  0.523628461257163)

In diesem Fall erhalten wir nach 99 Iterationen die erwartete Genauigkeit. Tatsächlich könnte ich bis i= 1e9 mit der gleichen Byteanzahl iterieren , aber das würde den Code erheblich langsamer machen

  • Dank eines anonymen Benutzers wird 1 Byte gespeichert.
Charlie
quelle
1
+1 Für die komplexe Klasse wusste ich nicht einmal, dass es das gibt.
TheLethalCoder
1
@TheLethalCoder habe ich auch nicht getan, bis ich es gegoogelt habe. :-)
Charlie
2

Ruby, 21 bis 20 Bytes

->n{eval'n**'*99+?1}

Haftungsausschluss : Es scheint, dass Ruby einige seltsame Werte zurückgibt, wenn eine komplexe Zahl zu einer Potenz erhoben wird. Ich gehe davon aus, dass es für diese Herausforderung nicht sinnvoll ist, Rubys gesamtes Mathematikmodul zu reparieren, aber ansonsten sollten die Ergebnisse dieser Funktion korrekt sein. Edit : Habe die letzten Änderungen aus meiner Python 3-Antwort übernommen und plötzlich gibt es irgendwie die gleichen, erwarteten Ergebnisse :)

Probieren Sie es online!

daniero
quelle
Nehmen Sie den Raum nach dem eval.
Wert Tinte
Ihre ursprüngliche Version ist in dem komplexen Testfall fehlgeschlagen, da sie die Zeichenfolge ausgewertet hat "0+1i**0+1i**0+1i**...", die in der falschen Weise analysiert wird, da sie **eine höhere Priorität als hat +.
Ørjan Johansen
@ ØrjanJohansen huh, du hast recht. Ich denke, ich wurde von der Tatsache getäuscht, dass #inspectund #to_sunterschiedliche Werte zurückgeben. Bevor ich die erste Antwort abschickte, habe ich einige Tests in irb durchgeführt und festgestellt, dass z. B. die Eingabe Complex(1,2)der REPL (1+2i)einschließlich der Klammern hilfreich ist. Wenn Sie den Wert einschränken, werden die Klammern jedoch nicht eingeschlossen, sodass der Vorrang, wie Sie darauf hinweisen, ihn durcheinander gebracht hat.
Daniero
Ich dachte, die evalVerwendung sei verboten.
V. Courtois
@ V.Courtoist Ok. Aber es ist nicht.
Daniero
2

TI-BASIC, 16 Bytes

Die Eingabe und Ausgabe werden in gespeichert Ans .

Ans→X
While Ans≠X^Ans
X^Ans
End
kamoroso94
quelle
1

R , 36 33 Bytes

- 3 Bytes dank Jarko Dubbeldam

Reduce(`^`,rep(scan(,1i),999),,T)

Liest von stdin. Reduces von rechts, um die Exponenten in der richtigen Reihenfolge anzuwenden.

Probieren Sie es aus (Funktion)

Probieren Sie es aus (stdin)

Giuseppe
quelle
1
scan(,1i)funktioniert. Ähnlich wie es scan(,'')funktioniert.
JAD
@ JarkoDubbeldam natürlich! Manchmal funktioniert mein Gehirn nicht.
Giuseppe
1

Javascript, 33 Bytes

f=(x,y=x)=>(x**y===y)?y:f(x,x**y)
quant2016
quelle
JavaScript verarbeitet keine imaginären Zahlen.
Kamoroso94
1

MATL , 20 10 Bytes

Dank @LuisMendo auf die Hälfte reduziert

t^`Gw^t5M-

Probieren Sie es online!

Dies ist mein erstes und mein erstes Mal, dass ich MATL benutze, also bin ich mir sicher, dass es leicht zu übertreffen ist.

Cinaski
quelle
Willkommen auf der Seite und schöne erste Antwort! Ein paar Vorschläge: XIIentspricht t. Sie können auch die automatische Zwischenablage entfernen XHund Hverwenden M, d ttt^`yw^t5M-]bb-x. H. Und im letzten Teil können Sie die unerwünschten Werte löschen &, wodurch die implizite Anzeigefunktion angewiesen wird, nur den oberen Bereich anzuzeigen. Sie können also ttt^`yw^t5M-]&einige Bytes verwenden und speichern.
Luis Mendo
Auch die erste tist nicht erforderlich, und unter Verwendung Ganstelle eines anderen tkönnen Sie vermeiden , &und somit lassen ]implizit: t^`Gw^t5M-. Hey, wir haben die Anzahl der Bytes um die Hälfte reduziert!
Luis Mendo
@LuisMendo Danke für die tollen Tipps! Ich muss viel über MATL lernen, aber es gefällt mir sehr gut.
Cinaski
Freut mich das zu hören!
Luis Mendo
0

Perl 6 , 17 Bytes

{[R**] $_ xx 999}

Probieren Sie es online!

R**ist der Reverse-Exponentiation-Operator; x R** yist gleich y ** x. [R**]Reduziert eine Liste von 999 Kopien des Eingabearguments mit umgekehrter Exponentiation.

Sean
quelle