Sonsuz güç kulesi


22

Meydan okuma

Oldukça basit, bir giriş verildiğinde x, onun sonsuz güç kulesini hesapla!

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

Dışardaki matematik severler için bu, xsonsuz tetrasyondur .

Aşağıdakileri aklınızda bulundurun:

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

Bunu içeren "basit" bir matematik zorluğumuz olmadı şaşırttı! *

Varsayımlar

  • xher zaman birleşecek.
  • Negatif ve karmaşık sayılar ele alınabilmelidir
  • Bu , yani en düşük bayt kazanır!
  • Cevaplarınız en az 5 ondalık basamağa kadar doğru olmalıdır.

Örnekler

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

* ( Burada daha karmaşık bir mücadele dışında )


1
Bu kulenin x = −2 veya x = −0,5 değerlerinde yakınlaştığını sanmıyorum .
Anders Kaseorg

@AndersKaseorg Katılıyorum, ancak bütün programlar aynı yakınsayan cevaba sahip görünüyor. Neden birleşmiyorlar?
Graviton

2
x = −2 8 döngüye, x = −0,5 ise 6 döngüye çekilir. (Bu durumlarda programım hala bir cevap veriyor, ancak bu, döngüdeki noktalardan biri ve sabit bir nokta değil; bu yakınsamaya işaret etmiyor.)
Anders Kaseorg

@AndersKaseorg Aha çok ilginç. Neden -2 için '8' ve -0.5 için '6' olduğunu bilemezsin? Sadece meraktan değil elbette.
Graviton,

2
Yinelemeleri olabildiğince kolay yapabilirsiniz, ama işte bir resim: commons.wikimedia.org/wiki/File:Tetration_period.png
Anders Kaseorg

Yanıtlar:





7

Python 3 , 40 39 35 bayt

  • Bir bayt için @ Ørjan Johansen @ teşekkürler: d>99bunun yerine d==99: daha küçük bir bayt sayısı için 1 yineleme
  • 4 bayt için @Uriel @ teşekkürler: x**Truex ini değerlendiren gerçeğin akıllıca kullanılması x**(d>99or g(x,d+1)). Terimdeki ifade, 99'dan büyük derinlik için Doğru olarak değerlendirilir ve böylece iletilen değeri döndürür.

Maksimum derinlik 100 ile özyinelemeli lamda yani 100 derinlik için aynı değeri verir. Aslında yakınsaklık agnostiğidir, bu nedenle işlev için yakınsak olmayan değerleri olan sayılar için beklenmeyenleri bekleyin.

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

Çevrimiçi deneyin!


1
Tio bağlantısında, complex('j')ile değiştirebilirsiniz1j
Mr. Xcoder

1
d>99bir kez daha yineleme yapar ve daha kısadır.
Ørjan Johansen

1
4 bayt ile kaydet g=lambda x,d=0:x**(d>99or g(x,d+1)), x**Truedeğerlendirirx
Uriel 12

@Uriel, Bu gerçekten akıllı ..... Teşekkürler !!!
officialaimm

6

Python 3, 37 30 27 bayt

-FelipeNardiBatista'dan -7 bayt.
@Xnor adlı kullanıcıdan -3 bayt

Artık Python'u pek hatırlamıyorum ama Ruby cevabımı aktarmayı ve diğer Python 3 cevabını geçmeyi başardım: D

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

Çevrimiçi deneyin!


1
Bilginize, f-stringlerin ilk olarak Python 3.6'da tanıtıldığı anlaşılıyor : bkz. Python.org/dev/peps/pep-0498 . (Bu, kodunuzun neden 3.5.2'de benim için çalışmadığını açıklar.) Başka birinin kafası karışması durumunda, bundan bahsettiğimi düşündüm.
mathmandan

1
Sen değerinde yerine gerekmez x, eval('x**'*99+'1')eserleri
XNOR

@xnor doh, elbette öyle olur :) teşekkürler
daniero

@xnor Neat - Ruby cevabımda aynı şeyi uyguladım ve bir şekilde düzeltti :)
daniero

1, ben .... eval varlığını unutmak için kendimi tokat ediyorum: D
officialaimm

4

Mathematica, 12 bayt

#//.x_:>#^x&

Giriş olarak kayan nokta sayısı alır.


4

J , 5 bayt

^^:_~

Çevrimiçi deneyin!

açıklama

İlk önce, sonunda ayrıştırma işleminden sonra hangi komutun çalıştırıldığını ~göstereceğim ve yeni fiil çekimi olacaktır.

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

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

J çözümü burada gerçekten güzel. Daha iyi tahıldaki ilk çizginizi kırmak için, aşağıdakilerin olduğunu söylemek doğru mu: (^^:_) güç konnektörü aracılığıyla yeni bir dyadik fiil yaratır, sonra kendi kendine zarf ~bu fiili monadik yapar, böylece bir argüman verildiğinde xgenişleyecektir x (^^:_) x. sol xsonradan "yapışıyor", notunuza veriyor ((x&^)^:_) xve yineleme sırasında yalnızca doğru argüman değişiyor mu?
Jonah

1
Güce sahip bir ikilisinin için iki argüman verirken @Jonah Tabii, x u^:n ysol argüman iç içe olan bir monad oluşturmak üzere ikilisinin ile yapıştırılır nzamanları y. x u^:n y -> (x&u)^:n y -> (x&u) ... n times ... (x&u) y
mil

4

C # (.NET Core) , 79 78 bayt

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

Çevrimiçi deneyin!

i= 999'a kadar yinelemeyi seçtim çünkü 99'a kadar yinelersem bazı örnekler gerekli kesinliğe ulaşamadı. Örnek:

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)

Görebildiğiniz gibi, 99 tekrardan sonra hayali kısım 5. ondalık basamağında başarısız oldu.

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)

Bu durumda 99 tekrardan sonra beklenen hassasiyeti alıyoruz. Aslında, i= 1e9'a kadar aynı byte sayısına kadar yineleyebilirdim , ancak bu kodun oldukça yavaşlamasını sağlayacaktır.

  • İsimsiz bir kullanıcı sayesinde 1 bayt kaydedildi.

1
+1 Karmaşık sınıf için bunun var olduğunu bile bilmiyordum.
TheLethalCoder

1
@ TheLethalCoder de googled kadar ben yapmadım. :-)
Charlie,


2

Ruby, 21 20 bayt

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

Feragatname : Görünüşe göre Ruby bir güce karmaşık bir sayı yükseltirken bazı garip değerler veriyor. Ruby'nin tüm matematik modülünü düzeltmenin bu zorluğun kapsamı dışında olduğunu düşünüyorum, ancak aksi takdirde bu işlevin sonuçları doğru olmalıdır. Düzenleme : Python 3 cevabımdaki son değişiklikleri uyguladı ve aniden aynı, beklenen sonuçları verdi :)

Çevrimiçi deneyin!


Boşluktan sonra boşluk bırak eval.
Value Ink,

Orijinal sürümünüz karmaşık test senaryosunda başarısız oldu çünkü dizgeyi değerlendirdi "0+1i**0+1i**0+1i**...", çünkü **önceliği olduğundan daha yanlış bir şekilde ayrıştırdı +.
Ørjan Johansen

@ ØrjanJohansen ha, haklısınız. Sanırım bu #inspectve #to_sfarklı değerler getirdiğim için kandırıldım . İlk cevabı göndermeden önce irb ile bazı testler yaptım ve parantez dahil, örneğin REPL'e girmenin Complex(1,2)vereceğini gördüm (1+2i). Değeri parantez içine alırken, parantezler dahil edilmez, bu nedenle önceliğiniz, belirttiğiniz gibi, onu berbatlaştırır.
daniero

evalKullanımın yasak olduğunu sanıyordum .
V. Courtois,

@ V.Courtois Tamam. Ama değil.
daniero

2

TI-BASIC, 16 bayt

Giriş ve çıkış içinde saklanır Ans.

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

1

R , 36 33 bayt

- Jarko Dubbeldam sayesinde 3 bayt

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

Stdin'den okur. ReduceÜsleri doğru sırayla uygulayabilmek için sağdan s.

Deneyin (işlev)

Deneyin (stdin)


1
scan(,1i)Eserleri. Nasıl scan(,'')çalıştığına benzer .
JAD,

Elbette @JarkoDubbeldam! bazen beynim çalışmıyor.
Giuseppe,


1

MATL , 20 10 bayt

@LuisMendo sayesinde yarıya indirdi

t^`Gw^t5M-

Çevrimiçi deneyin!

Bu benim ilk golf'üm ve ilk kez MATL kullanıyorum, bu yüzden kolayca aşılabileceğinden eminim.


Siteye Hoşgeldiniz ve güzel ilk cevap! Birkaç öneri: XIIeşittir t. Ayrıca kurtulabilirsiniz XHve Hotomatik panoya kullanarak M, olduğunu, ttt^`yw^t5M-]bb-x. Ve son bölümde, kullanabileceğiniz istenmeyen değerleri silmek yerine &, örtük görüntüleme işlevine yalnızca üst kısmı göstermesini söyler. Böylece, ttt^`yw^t5M-]&birkaç bayt kullanabilir ve kaydedebilirsiniz.
Luis Mendo,

Ayrıca, ilk tgerekli değildir ve kullanan Gbaşka yerine tsen önleyebilirsiniz &ve böylece terk ]örtük: t^`Gw^t5M-. Hey, bayt sayısını yarı yarıya azalttık!
Luis Mendo,

@LuisMendo Harika ipuçları için teşekkürler! MATL hakkında öğreneceğim çok şey var, ama gerçekten hoşuma gitti.
Cinaski,

Bunu duyduğuma sevindim!
Luis Mendo,

0

Perl 6 , 17 bayt

{[R**] $_ xx 999}

Çevrimiçi deneyin!

R**ters üstelleştirme operatörüdür; x R** yeşittir y ** x. [R**]ters argümanlı giriş bağımsız değişkeninin 999 kopya listesini azaltır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.