Nieskończona wieża mocy


22

Wyzwanie

Dość proste, biorąc pod uwagę wkład x, obliczyć, że to nieskończona wieża mocy!

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

Dla was, miłośników matematyki, jest xto nieskończona podróż .

Pamiętaj, że:

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

Zaskoczeni, że nie mieliśmy z tym „prostego” wyzwania matematycznego! *

Założenia

  • xzawsze będzie zbieżny.
  • Liczby ujemne i zespolone powinny być obsługiwane
  • To jest , więc wygrywa najmniej bajtów !
  • Twoje odpowiedzi powinny być poprawne do co najmniej 5 miejsc po przecinku

Przykłady

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

* (Inne niż bardziej skomplikowane wyzwanie tutaj )


1
Nie sądzę, aby ta wieża zbiegała się przy x = -2 lub x = -0,5.
Anders Kaseorg,

@AndersKaseorg Zgadzam się, chociaż wszystkie programy wydają się mieć tę samą zbieżną odpowiedź. Dlaczego się nie zbiegają?
Graviton,

2
x = -2 zostaje przyciągnięty do cyklu 8, a x = -0,5 zostaje przyciągnięty do cyklu 6. (Mój program wciąż daje odpowiedź w tych przypadkach, ale jest to jeden z punktów w cyklu, a nie punkt stały; nie oznacza to zbieżności.)
Anders Kaseorg,

@AndersKaseorg Aha bardzo interesujące. Nie wiedziałbyś, dlaczego „8” dla -2 i „6” dla -0,5? Oczywiście z ciekawości.
Graviton,

2
Możesz uruchamiać iteracje tak łatwo jak ja, ale oto zdjęcie: commons.wikimedia.org/wiki/File:Tetration_period.png
Anders Kaseorg

Odpowiedzi:




7

Haskell , 100 63 bajtów

W przypadku danych wejściowych, które nie są zbieżne (np. -2), Nie zostanie to zakończone:

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

Wielkie dzięki @ ØrjanJohansen za nauczenie mnie untili oszczędzanie 37bajtów!

Wypróbuj online!


1
Za pomocą tej untilfunkcji można to znacznie skrócić . Wypróbuj online!
Ørjan Johansen

Schludny! Nie wiedziałem until, wielkie dzięki.
ბიმო

7

Python 3 , 40 39 35 bajtów

  • Dzięki @ Ørjan Johansen za bajt: d>99zamiast d==99: 1 dodatkowej iteracji dla mniejszej liczby bajtów
  • Dzięki @Uriel za 4 bajty: mądre wykorzystanie faktu, że zwraca się x**Truedo x in x**(d>99or g(x,d+1)). Wyrażenie w tym terminie ma wartość True dla głębokości większej niż 99, a zatem zwraca przekazaną wartość.

Rekurencyjna lambda o maksymalnej głębokości 100, tj. Dla głębokości 100 zwraca tę samą wartość. W rzeczywistości jest niezależny od zbieżności, więc spodziewaj się nieoczekiwanego wyniku dla liczb o wartościach niespełniających funkcji.

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

Wypróbuj online!


1
W związku tio, można zastąpić complex('j')z1j
Pan Xcoder

1
d>99wykonuje jeszcze jedną iterację i jest krótszy.
Ørjan Johansen

1
zapisz 4 bajty za pomocą g=lambda x,d=0:x**(d>99or g(x,d+1)), x**Trueocenia nax
Uriel

@Uriel, To jest naprawdę mądre ..... Dzięki !!!
officialaimm

6

Python 3, 37 30 27 bajtów

-7 bajtów od @FelipeNardiBatista.
-3 bajty od @xnor

Nie pamiętam już dużo Python, ale udało mi się przenieść moją odpowiedź Ruby i pobić drugą odpowiedź Python 3: D

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

Wypróbuj online!


1
Do twojej wiadomości, wygląda na to, że f-stringi zostały po raz pierwszy wprowadzone w Pythonie 3.6: patrz python.org/dev/peps/pep-0498 . (To by wyjaśniało, dlaczego twój kod nie działał dla mnie w 3.5.2.) Pomyślałem, że wspomnę o tym na wypadek, gdyby ktoś był zdezorientowany.
matmandan

1
Nie musisz zastępować wartością x, eval('x**'*99+'1')works
xnor

@xnor doh, oczywiście że tak :) dzięki
daniero

@xnor Neat - zastosowałem to samo w mojej odpowiedzi Ruby i jakoś to naprawiło :)
daniero

+1, klepię się za to, że zapomniałem o istnieniu eval ....: D
officialaimm

4

Mathematica, 12 bajtów

#//.x_:>#^x&

Pobiera na wejściu liczbę zmiennoprzecinkową.


4

J , 5 bajtów

^^:_~

Wypróbuj online!

Wyjaśnienie

Najpierw pokażę, jakie polecenie jest wykonywane po parsowaniu ~na końcu, a przejście będzie dotyczyło nowego czasownika.

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

((x&^)^:_) x  |  Input: x
      ^:_     |  Execute starting with y = x until the result converges
  x&^         |    Compute y = x^y

Rozwiązanie J jest tutaj naprawdę fajne. Aby rozbić pierwszą linię na drobniejsze ziarno, prawdą jest, aby powiedzieć, że dzieje się tak: (^^:_) tworzy nowy czasownik dynastyczny za pomocą sprzężenia potęgowego, a następnie przysłówek sam ~sprawia, że ​​czasownik ten jest monadyczny, aby po podaniu argumentu xrozwinął się x (^^:_) x. lewy xnastępnie „wtyka”, dając ((x&^)^:_) xzgodnie z notatką, a tylko poprawny argument zmienia się podczas iteracji?
Jonah

1
@Jonah Oczywiście, gdy podając dwa argumenty do diadzie z władzy x u^:n y, lewy argument jest związany z diadzie tworząc monady, który jest zagnieżdżony nrazy na y. x u^:n y -> (x&u)^:n y -> (x&u) ... n times ... (x&u) y
mile

4

C # (.NET Core) , 79 78 bajtów

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

Wypróbuj online!

Wybrałem iterację do i= 999, ponieważ jeśli iterowałem do 99, niektóre przykłady nie osiągnęły wymaganej precyzji. Przykład:

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)

Jak widać, po 99 iteracjach wyimaginowana część zawiodła z dokładnością do 5. miejsca po przecinku.

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)

W tym przypadku po 99 iteracjach otrzymujemy oczekiwaną precyzję. W rzeczywistości mógłbym iterować do i= 1e9 z tą samą liczbą bajtów, ale to znacznie spowolniłoby kod

  • 1 bajt zapisany dzięki anonimowemu użytkownikowi.

1
+1 Dla złożonej klasy nawet nie wiedziałem, że istnieje.
TheLethalCoder

1
@ TheLethalCoder też tego nie zrobiłem, dopóki go nie przejrzałem. :-)
Charlie


2

Rubin, 21 20 bajtów

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

Oświadczenie : Wygląda na to, że Ruby zwraca dziwne wartości, gdy podnosi liczbę zespoloną do potęgi. Zakładam, że naprawienie całego modułu matematycznego Ruby nie jest możliwe, ale w przeciwnym razie wyniki tej funkcji powinny być prawidłowe. Edycja : zastosowałem najnowsze zmiany z mojej odpowiedzi w Pythonie 3 i nagle daje to w ten sposób oczekiwane rezultaty :)

Wypróbuj online!


Wyjmij przestrzeń po eval.
Wartość tuszu

Twoja oryginalna wersja nie powiodła się w złożonym przypadku testowym, ponieważ ewaluowała ciąg "0+1i**0+1i**0+1i**...", który analizuje w niewłaściwy sposób, ponieważ **ma wyższy priorytet niż +.
Ørjan Johansen

@ ØrjanJohansen huh, masz rację. Wydaje mi się, że byłem oszukany faktem #inspecti #to_szwracają różne wartości. Przed przesłaniem wstępnej odpowiedzi przeszedłem testy w irb i zobaczyłem, że np Complex(1,2). Wpisanie REPL da (1+2i), w tym nawiasy. Podczas nawijania wartości jednak nawiasy nie są uwzględniane, więc pierwszeństwo, jak zauważyłeś, pomieszało ją.
daniero

Myślałem, że evalużycie jest zabronione.
V. Courtois,

@ V.Courtois Ok. Ale nie jest.
daniero

2

TI-BASIC, 16 bajtów

Wejścia i wyjścia są przechowywane w Ans.

Ans→X
While Ans≠X^Ans
X^Ans
End



1

MATL , 20 10 bajtów

zredukowane do połowy dzięki @LuisMendo

t^`Gw^t5M-

Wypróbuj online!

To jest mój pierwszy i pierwszy raz, kiedy korzystam z MATL-a, więc jestem pewien, że można go łatwo wygrać.


Witamy na stronie i fajna pierwsza odpowiedź! Kilka sugestii: XIIjest równoważne z t. Możesz także pozbyć się automatycznego schowka XHi Hkorzystać z niego M, czyli ttt^`yw^t5M-]bb-x. I w ostatniej części, zamiast usuwania niepożądanych wartości, których możesz użyć &, co mówi domyślnej funkcji wyświetlania, aby pokazywała tylko górę. Możesz więc użyć ttt^`yw^t5M-]&i zapisać kilka bajtów.
Luis Mendo

Ponadto, pierwszy tnie jest potrzebny, i stosując Gzamiast innego tmożna uniknąć &, a tym samym opuścić ]niejawna: t^`Gw^t5M-. Hej, zmniejszyliśmy liczbę bajtów o połowę!
Luis Mendo

@LuisMendo Dzięki za wspaniałe wskazówki! Muszę się wiele nauczyć o MATL, ale bardzo mi się podoba.
Cinaski

Cieszę się, że to słyszę!
Luis Mendo,

0

Perl 6 , 17 bajtów

{[R**] $_ xx 999}

Wypróbuj online!

R**jest operatorem odwrotnego potęgowania; x R** yjest równy y ** x. [R**]zmniejsza listę 999 kopii argumentu wejściowego z odwrotnym potęgowaniem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.