Tháp năng lượng vô hạn


22

Các thách thức

Khá đơn giản, được cung cấp một đầu vào x, tính toán tháp năng lượng vô hạn của nó!

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

Đối với bạn toán học người yêu trên mạng, đây là x's vô hạn tetration .

Hãy ghi nhớ những điều sau:

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

Ngạc nhiên là chúng tôi chưa có một thử thách toán học "đơn giản" nào liên quan đến việc này! *

Giả định

  • xsẽ luôn hội tụ.
  • Số âm và số phức có thể được xử lý
  • Đây là , vì vậy byte thấp nhất sẽ thắng!
  • Câu trả lời của bạn phải chính xác đến ít nhất 5 chữ số thập phân

Ví dụ

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

* (Khác với một thử thách phức tạp hơn ở đây )


1
Tôi không nghĩ tòa tháp này hội tụ tại x = −2 hoặc x = 0,5.
Anders Kaseorg

@AndersKaseorg Tôi đồng ý, mặc dù tất cả các chương trình dường như có cùng một câu trả lời hội tụ. Tại sao họ không hội tụ?
Graviton

2
x = 2 bị thu hút vào chu kỳ 8 và x = .50,5 bị thu hút vào chu kỳ 6. (Chương trình của tôi vẫn đưa ra câu trả lời trong những trường hợp này, nhưng đó là một trong những điểm trong chu kỳ và không phải là điểm cố định; điều này không biểu thị sự hội tụ.)
Anders Kaseorg

@AndersKaseorg Aha rất thú vị. Bạn sẽ không biết tại sao '8' cho -2 và '6' cho -0,5? Tất nhiên chỉ vì tò mò.
Graviton

2
Bạn có thể chạy các vòng lặp một cách dễ dàng nhất có thể, nhưng đây là một hình ảnh: commons.wik
mega.org/wiki/File:Tetration_apse.png

Câu trả lời:




7

Haskell , 100 63 byte

Đối với các đầu vào không hội tụ (ví dụ. -2), Điều này sẽ không chấm dứt:

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

Cảm ơn rất nhiều @ janrjanJohansen đã dạy tôi untilvà tiết kiệm cho tôi 37byte!

Hãy thử trực tuyến!


1
Bạn có thể rút ngắn điều này rất nhiều với untilchức năng. Hãy thử trực tuyến!
Ørjan Johansen

Khéo léo! Không biết until, cảm ơn rất nhiều.
ბიმო

7

Python 3 , 40 39 35 byte

  • Cảm ơn @ rjan Johansen cho một byte: d>99thay vì d==99: 1 lần lặp nữa cho số byte ít hơn
  • Cảm ơn @Uriel cho 4 byte: sử dụng khôn ngoan thực tế x**Trueđánh giá x trong x**(d>99or g(x,d+1)). Biểu thức trong thuật ngữ đánh giá là True cho độ sâu lớn hơn 99 và do đó trả về giá trị được truyền.

Lambda đệ quy với độ sâu tối đa 100 tức là cho độ sâu 100 trả về cùng một giá trị. Trên thực tế là hội tụ - bất khả tri, vì vậy mong đợi những điều bất ngờ đối với các số có giá trị không hội tụ cho hàm.

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

Hãy thử trực tuyến!


1
Trong liên kết tio, bạn có thể thay thế complex('j')bằng1j
Ông Xcoder

1
d>99thực hiện thêm một lần lặp và ngắn hơn.
Ørjan Johansen

1
lưu 4 byte với g=lambda x,d=0:x**(d>99or g(x,d+1)), x**Trueước tính thànhx
Uriel

@Uriel, Điều đó thực sự thông minh ..... Cảm ơn !!!
chính thức

6

Python 3, 37 30 27 byte

-7 byte từ @FelipeNardiBatista.
-3 byte từ @xnor

Tôi không còn nhớ nhiều về Python nữa, nhưng tôi đã xoay sở để trả lời câu trả lời Ruby của mình và đánh bại câu trả lời Python 3 khác: D

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

Hãy thử trực tuyến!


1
FYI, có vẻ như chuỗi f được giới thiệu lần đầu tiên trong Python 3.6: xem python.org/dev/peps/pep-0498 . (Điều này sẽ giải thích lý do tại sao mã của bạn không hoạt động với tôi trong 3.5.2.) Chỉ cần nghĩ rằng tôi sẽ đề cập đến điều này trong trường hợp bất kỳ ai khác bị nhầm lẫn.
mathmandan

1
Bạn không cần phải thay thế vào giá trị của x, eval('x**'*99+'1')công trình
XNOR

@xnor doh, tất nhiên là có :) cảm ơn
daniero

@xnor Neat - Tôi đã áp dụng điều tương tự trong câu trả lời Ruby của mình và bằng cách nào đó nó đã sửa nó :)
daniero

+1, tôi đang tự tát mình vì quên mất sự tồn tại của eval ....: D
chính thức tuyên bố

4

Toán học, 12 byte

#//.x_:>#^x&

Lấy số floating điểm nổi làm đầu vào.


4

J , 5 byte

^^:_~

Hãy thử trực tuyến!

Giải trình

Đầu tiên, tôi sẽ chỉ ra lệnh nào đang được thực thi sau khi phân tích cú pháp ~ở cuối và phần tiếp theo sẽ dành cho động từ mới.

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

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

Giải pháp J thực sự tốt đẹp ở đây. Để phá vỡ dòng đầu tiên của bạn trong hạt mịn hơn, có đúng không khi nói rằng điều sau đây xảy ra: (^^:_) tạo ra một động từ dyadic mới thông qua liên kết sức mạnh, sau đó tự động từ ~làm cho động từ đó đơn điệu, để khi đưa ra một đối số, xnó được mở rộng thành x (^^:_) x. bên trái xsau đó "gậy", đưa ra ((x&^)^:_) xmỗi ghi chú của bạn và chỉ đối số bên phải thay đổi trong khi lặp lại?
Giô-na

1
@Jonah Chắc chắn, khi đưa ra hai đối số cho một con đê có sức mạnh, x u^:n yđối số bên trái được liên kết với con đê để tạo thành một đơn nguyên được lồng nvào nhau y. x u^:n y -> (x&u)^:n y -> (x&u) ... n times ... (x&u) y
dặm

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;}

Hãy thử trực tuyến!

Tôi đã chọn lặp lại cho đến khi i= 999 vì nếu tôi lặp lại cho đến 99, một số ví dụ không đạt được độ chính xác cần thiết. Thí dụ:

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)

Như bạn có thể thấy, sau 99 lần lặp, phần tưởng tượng đã thất bại ở vị trí thập phân thứ 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)

Trong trường hợp này sau 99 lần lặp, chúng ta có được độ chính xác như mong đợi. Trên thực tế, tôi có thể lặp lại cho đến i= 1e9 với cùng số byte, nhưng điều đó sẽ làm cho mã chậm hơn đáng kể

  • Lưu 1 byte nhờ một người dùng ẩn danh.

1
+1 Đối với lớp phức tạp, tôi thậm chí không biết rằng nó đã tồn tại.
TheLethalCoder

1
@TheLethalCoder cũng không làm thế cho đến khi tôi googled nó. :-)
Charlie


2

Ruby, 21 20 byte

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

Tuyên bố miễn trừ trách nhiệm : Có vẻ như Ruby trả về một số giá trị kỳ lạ khi tăng một số phức lên một sức mạnh. Tôi cho rằng vượt quá phạm vi cho thử thách này để sửa toàn bộ mô-đun toán học của Ruby, nhưng nếu không thì kết quả của hàm này phải chính xác. Chỉnh sửa : Áp dụng các thay đổi mới nhất từ câu trả lời Python 3 của tôivà đột nhiên nó bằng cách nào đó cho kết quả như mong đợi :)

Hãy thử trực tuyến!


Lấy ra không gian sau eval.
Mực giá trị

Phiên bản gốc của bạn đã thất bại trong trường hợp thử nghiệm phức tạp vì nó đánh giá chuỗi "0+1i**0+1i**0+1i**...", phân tích sai cách vì **có độ ưu tiên cao hơn +.
Ørjan Johansen

@ RjanJohansen huh, bạn nói đúng. Tôi đoán rằng tôi đã bị lừa bởi thực tế đó #inspect#to_strả lại các giá trị khác nhau. Trước khi gửi câu trả lời ban đầu, tôi đã thực hiện một số thử nghiệm trong irb và thấy rằng ví dụ: nhập vào Complex(1,2)REPL sẽ cung cấp (1+2i), bao gồm cả dấu ngoặc đơn. Tuy nhiên, khi xâu chuỗi giá trị, các dấu ngoặc đơn không được bao gồm, do đó, mức độ ưu tiên, như bạn chỉ ra, đã làm hỏng nó.
daniero

Tôi nghĩ rằng evalviệc sử dụng đã bị cấm.
V. Courtois

@ V.Courtois Ok. Nhưng nó không phải là.
daniero

2

TI-BASIC, 16 byte

Đầu vào và đầu ra được lưu trữ trong Ans.

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

1

R , 36 33 byte

- 3 byte nhờ Jarko Dubbeldam

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

Đọc từ stdin. Reduces từ bên phải để có được số mũ được áp dụng theo đúng thứ tự.

Hãy thử nó (chức năng)

Hãy thử nó (stdin)


1
scan(,1i)công trinh. Tương tự như cách làm scan(,'')việc.
JAD

@JarkoDubbeldam tất nhiên! đôi khi não của tôi không hoạt động.
Giuseppe


1

MATL , 20 10 byte

giảm xuống còn một nửa nhờ @LuisMendo

t^`Gw^t5M-

Hãy thử trực tuyến!

Đây là đầu tiên của tôi và là lần đầu tiên tôi sử dụng MATL nên tôi chắc chắn rằng nó có thể dễ dàng vượt qua.


Chào mừng đến với trang web, và câu trả lời đầu tiên tốt đẹp! Một vài gợi ý: XIItương đương với t. Bạn cũng có thể thoát khỏi XHHsử dụng bảng tạm tự động M, nghĩa là , ttt^`yw^t5M-]bb-x. Và trong phần cuối cùng, thay vì xóa các giá trị không mong muốn bạn có thể sử dụng &, điều này cho biết chức năng hiển thị ngầm chỉ hiển thị trên cùng. Vì vậy, bạn có thể sử dụng ttt^`yw^t5M-]&và lưu một vài byte.
Luis Mendo

Ngoài ra, cái đầu tiên tlà không cần thiết, và sử dụng Gthay vì cái khác tbạn có thể tránh &và do đó để lại ]ẩn : t^`Gw^t5M-. Này, chúng tôi đã giảm một nửa số byte!
Luis Mendo

@LuisMendo Cảm ơn những lời khuyên tuyệt vời! Tôi có rất nhiều điều để tìm hiểu về MATL, nhưng tôi thực sự thích nó.
Cinaski

Vui mừng khi nghe điều đó!
Luis Mendo

0

Perl 6 , 17 byte

{[R**] $_ xx 999}

Hãy thử trực tuyến!

R**là toán tử lũy thừa ngược; x R** ybằng y ** x. [R**]giảm danh sách 999 bản sao của đối số đầu vào với lũy thừa ngược.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.