La torre de poder infinito

22

El reto

Muy simple, dada una entrada x, ¡calcule su torre de energía infinita!

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

Para ustedes amantes de las matemáticas, esta es xla tentación infinita .

Tenga en cuenta lo siguiente:

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

¡Sorprendido de que no hayamos tenido un desafío matemático "simple" con esto! *

Supuestos

  • xserá siempre convergen.
  • Los números negativos y complejos deben poder manejarse
  • Este es el , por lo que gana los bytes más bajos .
  • Sus respuestas deben ser correctas al menos con 5 decimales

Ejemplos

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

* (Aparte de un desafío más complicado aquí )

Graviton
fuente
1
No creo que esta torre converja en x = −2 o x = −0.5.
Anders Kaseorg
@AndersKaseorg Estoy de acuerdo, aunque todos los programas parecen tener la misma respuesta convergente. ¿Por qué no convergen?
Graviton
2
x = −2 se siente atraído por un ciclo de 8 y x = −0,5 se siente atraído por un ciclo de 6. (Mi programa todavía da una respuesta en estos casos, pero es uno de los puntos en el ciclo y no un punto fijo; esto no indica convergencia.)
Anders Kaseorg
@AndersKaseorg Aha muy interesante. ¿No sabrías por qué '8' para -2 y '6' para -0.5? Solo por curiosidad, por supuesto.
Graviton
2
Puede ejecutar las iteraciones tan fácilmente como yo, pero aquí hay una imagen: commons.wikimedia.org/wiki/File:Tetration_period.png
Anders Kaseorg el

Respuestas:

10

Pyth,  4  3 bytes

tachado 4 sigue siendo regular 4; (

u^Q

Pruébalo en línea

Cómo funciona

u       first repeated value under repeated application of G ↦
 ^QG        input ** G
    Q   starting at input
Anders Kaseorg
fuente
2
No necesita el último G, se llenará automáticamente.
FryAmTheEggman
@FryAmTheEggman Correcto, ¡gracias!
Anders Kaseorg
7

Haskell , 100 63 bytes

Para las entradas que no convergen (por ejemplo -2), esto no terminará:

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

¡Muchas gracias @ ØrjanJohansen por enseñarme untily guardarme 37bytes!

Pruébalo en línea!

ბიმო
fuente
1
Puedes acortar esto mucho con la untilfunción. Pruébalo en línea!
Ørjan Johansen
¡Ordenado! No lo sabía until, muchas gracias.
ბიმო
7

Python 3 , 40 39 35 bytes

  • Gracias @ Ørjan Johansen por un byte: en d>99lugar de d==99: 1 iteración más para un recuento de bytes menor
  • Gracias @Uriel por 4 bytes: utilización inteligente del hecho de que se x**Trueevalúa como x en x**(d>99or g(x,d+1)). La expresión en el término se evalúa como Verdadero para una profundidad mayor que 99 y, por lo tanto, devuelve el valor pasado.

Lambda recursiva con una profundidad máxima de 100, es decir, para una profundidad de 100, devuelve el mismo valor. En realidad, es independiente de la convergencia, por lo que se espera lo inesperado para los números con valores no convergentes para la función.

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

Pruébalo en línea!

officialaimm
fuente
1
En el enlace tio, puede reemplazar complex('j')con1j
Mr. Xcoder
1
d>99hace una iteración más y es más corta.
Ørjan Johansen
1
guardar 4 bytes con g=lambda x,d=0:x**(d>99or g(x,d+1)), x**Trueevalúa ax
Uriel
@Uriel, eso es muy inteligente ... ¡Gracias!
officialaimm
6

Python 3, 37 30 27 bytes

-7 bytes de @FelipeNardiBatista.
-3 bytes de @xnor

Ya no recuerdo mucho de Python, pero logré portar mi respuesta de Ruby y superé la otra respuesta de Python 3: D

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

Pruébalo en línea!

daniero
fuente
1
Para su información, parece que las cadenas f se introdujeron por primera vez en Python 3.6: consulte python.org/dev/peps/pep-0498 . (Esto explicaría por qué su código no funcionó para mí en 3.5.2.) Solo pensé en mencionar esto en caso de que alguien más estuviera confundido.
mathmandan
1
No necesita sustituir el valor de x, eval('x**'*99+'1')funciona
xnor
@xnor doh, por supuesto que sí :) gracias
daniero
@xnor Neat - Apliqué lo mismo en mi respuesta Ruby y de alguna manera lo arregló :)
daniero
+1, me estoy abofeteando por olvidar la existencia de eval ....: D
officialaimm
4

Mathematica, 12 bytes

#//.x_:>#^x&

Toma un número de punto flotante como entrada.

alephalpha
fuente
4

J , 5 bytes

^^:_~

Pruébalo en línea!

Explicación

Primero, mostraré qué comando se está ejecutando después de analizar el ~al final, y el recorrido será para el nuevo verbo.

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

((x&^)^:_) x  |  Input: x
      ^:_     |  Execute starting with y = x until the result converges
  x&^         |    Compute y = x^y
millas
fuente
La solución J es realmente agradable aquí. Para desglosar su primera línea en grano más fino, es correcto decir que sucede lo siguiente:(^^:_) crea un nuevo verbo diádico a través de la conjunción de poder, luego el adverbio propio ~hace que el verbo sea monádico, de modo que cuando se le da un argumento xse expande a x (^^:_) x. la izquierda xposteriormente "se pega", dando ((x&^)^:_) xpor su nota, y solo el argumento correcto cambia durante la iteración?
Jonás
1
@Jonah Claro, cuando le das dos argumentos a una díada con poder, x u^:n yel argumento de la izquierda se une a la díada para formar una mónada que se anida varias nveces y. x u^:n y -> (x&u)^:n y -> (x&u) ... n times ... (x&u) y
millas
4

C # (.NET Core) , 79 78 bytes

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

Pruébalo en línea!

Elegí iterar hasta i= 999 porque si iteraba hasta 99 algunos ejemplos no alcanzarían la precisión requerida. Ejemplo:

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)

Como puede ver, después de 99 iteraciones, la parte imaginaria falló en el quinto decimal.

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)

En este caso después de 99 iteraciones obtenemos la precisión esperada. De hecho, podría iterar hasta i= 1e9 con el mismo número de bytes, pero eso haría que el código sea considerablemente más lento

  • 1 byte guardado gracias a un usuario anónimo.
Charlie
fuente
1
+1 Para la clase compleja, ni siquiera sabía que existía.
TheLethalCoder
1
@TheLethalCoder tampoco lo hice hasta que lo busqué en Google. :-)
Charlie
2

Ruby, 21 20 bytes

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

Descargo de responsabilidad : Parece que Ruby devuelve algunos valores extraños al elevar un número complejo a un poder. Supongo que está fuera del alcance de este desafío arreglar todo el módulo matemático de Ruby, pero de lo contrario los resultados de esta función deberían ser correctos. Editar : Aplica los últimos cambios de mi respuesta de Python 3 y de repente de alguna manera da los mismos resultados esperados :)

Pruébalo en línea!

daniero
fuente
Saque el espacio después del eval.
Value Ink el
Su versión original falló en el caso de prueba complejo porque evadió la cadena "0+1i**0+1i**0+1i**...", que se analiza de manera incorrecta ya que **tiene mayor prioridad que +.
Ørjan Johansen
@ ØrjanJohansen eh, tienes razón. Creo que fui engañado por el hecho de que #inspecty #to_sdevuelve valores diferentes. Antes de enviar la respuesta inicial, hice algunas pruebas en irb y vi que, por ejemplo, entrar Complex(1,2)en el REPL daría (1+2i), incluidos los paréntesis. Sin embargo, al encadenar el valor los paréntesis no se incluyen, por lo que la precedencia, como usted señala, lo confundió.
daniero
Pensé que el evaluso estaba prohibido.
V. Courtois
@ V.Courtois Ok. Pero no lo es.
daniero
2

TI-BASIC, 16 bytes

La entrada y la salida se almacenan en Ans.

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

R , 36 33 bytes

- 3 bytes gracias a Jarko Dubbeldam

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

Lecturas de stdin. Reduces desde la derecha para aplicar los exponentes en el orden correcto.

Pruébalo (función)

Pruébalo (stdin)

Giuseppe
fuente
1
scan(,1i)trabajos. Similar a cómo scan(,'')funciona.
JAD
@JarkoDubbeldam, por supuesto! A veces mi cerebro no funciona.
Giuseppe
1

Javascript, 33 bytes

f=(x,y=x)=>(x**y===y)?y:f(x,x**y)
quant2016
fuente
JavaScript no maneja números imaginarios.
kamoroso94
1

MATL , 20 10 bytes

reducido a la mitad gracias a @LuisMendo

t^`Gw^t5M-

Pruébalo en línea!

Este es mi primer y la primera vez que uso MATL, así que estoy seguro de que podría superarlo fácilmente.

Cinaski
fuente
Bienvenido al sitio, y buena primera respuesta! Algunas sugerencias: XIIes equivalente a t. También puede deshacerse de XHy Hel uso del portapapeles automática M, es decir, ttt^`yw^t5M-]bb-x. Y en la última parte, en lugar de eliminar los valores no deseados que puede usar &, lo que le dice a la función de visualización implícita que solo muestre la parte superior. Por lo tanto, puede usar ttt^`yw^t5M-]&y guardar algunos bytes.
Luis Mendo
Además, la primera tno es necesaria, y utilizar Gen lugar de otro tse puede evitar &y por lo tanto dejar ]implícita: t^`Gw^t5M-. ¡Hey, hemos reducido la cantidad de bytes a la mitad!
Luis Mendo
@LuisMendo ¡Gracias por los buenos consejos! Tengo mucho que aprender sobre MATL, pero realmente me gusta.
Cinaski
Me alegra escuchar eso!
Luis Mendo
0

Perl 6 , 17 bytes

{[R**] $_ xx 999}

Pruébalo en línea!

R**es el operador de exponenciación inversa; x R** yes igual a y ** x. [R**]reduce una lista de 999 copias del argumento de entrada con exponenciación inversa.

Sean
fuente