Menara listrik tanpa batas


22

Tantangan

Cukup sederhana, diberi input x, hitung menara kekuatannya tak terbatas!

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

Bagi Anda pecinta matematika di luar sana, ini adalah tetrasix tak terbatas .

Ingatlah hal-hal berikut:

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

Terkejut kami belum memiliki tantangan matematika "sederhana" yang melibatkan ini! *

Asumsi

  • xakan selalu bertemu.
  • Angka negatif dan kompleks harus dapat ditangani
  • Ini adalah , sehingga byte terendah menang!
  • Jawaban Anda harus benar untuk setidaknya 5 tempat desimal

Contohnya

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

* (Selain tantangan yang lebih rumit di sini )


1
Saya tidak berpikir menara ini bertemu di x = −2 atau x = −0.5.
Anders Kaseorg

@AndersKaseorg Saya setuju, meskipun semua program tampaknya memiliki jawaban konvergen yang sama. Mengapa mereka tidak bertemu?
Graviton

2
x = −2 tertarik pada siklus 8 dan x = −0.5 tertarik pada siklus 6. (Program saya masih memberikan jawaban dalam kasus-kasus ini, tetapi ini adalah salah satu poin dalam siklus dan bukan titik tetap; ini tidak menunjukkan konvergensi.)
Anders Kaseorg

@AndersKaseorg Aha sangat menarik. Anda tidak akan tahu mengapa '8' untuk -2 dan '6' untuk -0,5? Tentu saja karena penasaran.
Graviton

2
Anda dapat menjalankan iterasi semudah yang saya bisa, tetapi inilah gambarnya: commons.wikimedia.org/wiki/File:Tetration_ Period.png
Anders Kaseorg

Jawaban:




7

Haskell , 100 63 byte

Untuk input yang tidak konvergen (mis. -2) Ini tidak akan berakhir:

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

Terima kasih banyak @ ØrjanJohansen karena mengajari saya tentang untildan menyelamatkan saya 37byte!

Cobalah online!


1
Anda dapat mempersingkat ini banyak dengan untilfungsinya. Cobalah online!
Ørjan Johansen

Rapi! Tidak tahu until, terima kasih banyak.
ბიმო

7

Python 3 , 40 39 35 byte

  • Terima kasih @ Ørjan Johansen untuk byte: d>99alih-alihd==99 : 1 lebih banyak iterasi untuk byte-count yang lebih rendah
  • Terima kasih @Uriel untuk 4 byte: pemanfaatan bijak dari fakta yang x**Truemengevaluasi ke x in x**(d>99or g(x,d+1)). Ekspresi dalam istilah mengevaluasi ke True untuk kedalaman lebih besar dari 99 dan dengan demikian mengembalikan nilai yang diteruskan.

Lambda rekursif dengan kedalaman maksimum 100 yaitu untuk kedalaman 100 mengembalikan nilai yang sama. Sebenarnya konvergensi-agnostik, jadi perkirakan angka-angka yang tidak terduga dengan nilai-nilai yang tidak konvergen untuk fungsi tersebut.

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

Cobalah online!


1
Di tautan tio, Anda dapat menggantinya complex('j')dengan1j
Tn. Xcoder

1
d>99melakukan satu iterasi lagi dan lebih pendek.
Ørjan Johansen

1
simpan 4 byte dengan g=lambda x,d=0:x**(d>99or g(x,d+1)), x**Truedievaluasi menjadix
Uriel

@Uriel, Itu sangat pintar ..... Terima kasih !!!
officialaimm

6

Python 3, 37 30 27 byte

-7 byte dari @FelipeNardiBatista.
-3 byte dari dari @xnor

Saya tidak ingat banyak tentang Python lagi, tapi saya berhasil mem-porting jawaban Ruby saya dan mengalahkan jawaban Python 3 lainnya: D

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

Cobalah online!


1
FYI, tampaknya f-string pertama kali diperkenalkan dalam Python 3.6: lihat python.org/dev/peps/pep-0498 . (Ini akan menjelaskan mengapa kode Anda tidak berfungsi untuk saya di 3.5.2.) Hanya berpikir saya akan menyebutkan ini jika ada orang lain yang bingung.
mathmandan

1
Anda tidak perlu mengganti nilai dari x, eval('x**'*99+'1')karya
xnor

@ xnor doh, tentu saja ya :) terima kasih
daniero

@ xnor Rapi - Saya menerapkan hal yang sama dalam jawaban Ruby saya dan entah bagaimana memperbaikinya :)
daniero

+1, saya menampar diri saya sendiri karena lupa akan keberadaan eval ....: D
officialaimm

4

Mathematica, 12 byte

#//.x_:>#^x&

Mengambil nomor floating-point sebagai input.


4

J , 5 byte

^^:_~

Cobalah online!

Penjelasan

Pertama, saya akan menunjukkan perintah apa yang dieksekusi setelah menguraikan ~di akhir, dan walk-through akan menjadi kata kerja baru.

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

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

Solusi J sangat bagus di sini. Untuk memecah baris pertama Anda dalam butir yang lebih halus, apakah benar mengatakan bahwa yang berikut ini terjadi: (^^:_) membuat kata kerja diad baru melalui power conj, lalu kata keterangan diri ~membuat kata kerja itu monadik, sehingga ketika diberi argumen xitu diperluas ke x (^^:_) x. sebelah kiri xselanjutnya "menempel", memberikan ((x&^)^:_) xper catatan Anda, dan hanya argumen yang benar berubah selama iterasi?
Jonah

1
@Jonah Tentu, ketika memberikan dua argumen untuk angka dua dengan kekuatan,, x u^:n yargumen kiri terikat dengan angka dua untuk membentuk monad yang bersarang nkali y. x u^:n y -> (x&u)^:n y -> (x&u) ... n times ... (x&u) y
mil

4

C # (.NET Core) , 79 78 byte

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

Cobalah online!

Saya memilih untuk mengulangi sampai i= 999 karena jika saya mengulangi sampai 99 beberapa contoh tidak mencapai presisi yang diperlukan. Contoh:

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)

Seperti yang Anda lihat, setelah 99 iterasi bagian imajiner gagal di tempat desimal 5.

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)

Dalam hal ini setelah 99 iterasi kami mendapatkan presisi yang diharapkan. Bahkan, saya bisa mengulangi sampai i= 1e9 dengan jumlah byte yang sama, tetapi itu akan membuat kode jauh lebih lambat

  • 1 byte disimpan berkat pengguna anonim.

1
+1 Untuk kelas kompleks, saya bahkan tidak tahu itu ada.
TheLethalCoder

1
@TheLethalCoder juga tidak sampai saya googled itu. :-)
Charlie


2

Ruby, 21 20 byte

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

Penafian : Tampaknya Ruby mengembalikan beberapa nilai aneh ketika menaikkan bilangan kompleks ke kekuasaan. Saya menganggap itu di luar jangkauan untuk tantangan ini untuk memperbaiki seluruh modul matematika Ruby, tetapi jika tidak, hasil dari fungsi ini harus benar. Sunting : Menerapkan perubahan terbaru dari jawaban Python 3 sayadan tiba-tiba entah bagaimana memberikan hasil yang sama diharapkan :)

Cobalah online!


Keluarkan ruang setelah eval.
Nilai Tinta

Versi asli Anda gagal pada test case yang kompleks karena ia menghasilkan string "0+1i**0+1i**0+1i**...", yang diurai dengan cara yang salah karena **memiliki prioritas lebih tinggi daripada +.
Ørjan Johansen

@ ØrjanJohansen ya, Anda benar. Saya kira saya tertipu oleh fakta itu #inspectdan #to_smengembalikan nilai yang berbeda. Sebelum mengirimkan jawaban awal saya melakukan beberapa pengujian di irb dan melihat bahwa misalnya memasukkan Complex(1,2)dalam REPL akan memberi (1+2i), termasuk tanda kurung. Ketika meringkas nilai namun tanda kurung tidak termasuk, jadi prioritasnya, seperti yang Anda tunjukkan, mengacaukannya.
daniero

Saya pikir evalpenggunaannya dilarang.
V. Courtois

@ V.Courtois Oke. Tapi ternyata tidak.
daniero

2

TI-BASIC, 16 byte

Input dan output disimpan di Ans.

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

1

R , 36 33 byte

- 3 byte terima kasih kepada Jarko Dubbeldam

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

Baca dari stdin. Reduces dari hak untuk menerapkan eksponen dalam urutan yang benar.

Cobalah (fungsi)

Cobalah (stdin)


1
scan(,1i)bekerja. Mirip dengan cara scan(,'')kerjanya.
JAD

@JarkoDubbeldam tentu saja! terkadang otak saya tidak berfungsi.
Giuseppe


1

MATL , 20 10 byte

kurangi menjadi separuh berkat @LuisMendo

t^`Gw^t5M-

Cobalah online!

Ini adalah pertama saya dan pertama kali saya menggunakan MATL jadi saya yakin itu bisa dengan mudah kalah.


Selamat datang di situs ini, dan jawaban pertama yang bagus! Beberapa saran: XIIsetara dengan t. Anda juga dapat menyingkirkan XHdan Hmenggunakan papan klip otomatis M, yaitu ttt^`yw^t5M-]bb-x,. Dan pada bagian terakhir, alih-alih menghapus nilai yang tidak diinginkan yang dapat Anda gunakan &, yang memberitahu fungsi tampilan implisit untuk hanya menampilkan bagian atas. Jadi, Anda dapat menggunakan ttt^`yw^t5M-]&dan menyimpan beberapa byte.
Luis Mendo

Juga, yang pertama ttidak diperlukan, dan menggunakan yang Glain tyang bisa Anda hindari &dan dengan demikian ]menyiratkan:t^`Gw^t5M- . Hei, kami telah mengurangi jumlah byte hingga setengahnya!
Luis Mendo

@LuisMendo Terima kasih atas tips hebatnya! Saya harus banyak belajar tentang MATL, tetapi saya sangat menyukainya.
Cinaski

Senang mendengarnya!
Luis Mendo

0

Perl 6 , 17 byte

{[R**] $_ xx 999}

Cobalah online!

R**adalah operator reverse-exponentiation; x R** ysama dengan y ** x. [R**]mengurangi daftar 999 salinan argumen input dengan eksponensial terbalik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.