หอพลังที่ไม่มีที่สิ้นสุด


22

ความท้าทาย

ค่อนข้างง่ายรับอินพุตxคำนวณมันเป็นหอคอยพลังงานที่ไม่มีที่สิ้นสุด!

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

สำหรับคุณที่ชื่นชอบคณิตศาสตร์ออกมีนี้เป็นxของอนันต์tetration

โปรดจำไว้ว่า:

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

แปลกใจที่เราไม่ได้มีความท้าทายทางคณิตศาสตร์ที่ "ง่าย" ที่เกี่ยวข้องกับเรื่องนี้! *

สมมติฐาน

  • xจะเสมอมาบรรจบกัน
  • จำนวนลบและจำนวนเชิงซ้อนควรจะสามารถจัดการได้
  • นี่คือดังนั้นไบต์ที่ต่ำที่สุดจึงชนะ!
  • คำตอบของคุณควรถูกต้องเป็นทศนิยมอย่างน้อย5ตำแหน่ง

ตัวอย่าง

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

* (นอกเหนือจากความท้าทายที่ซับซ้อนกว่าที่นี่ )


1
ฉันไม่คิดว่าหอคอยนี้จะมาบรรจบกันที่x = −2 หรือx = −0.5
Anders Kaseorg

@AndersKaseorg ฉันเห็นด้วยแม้ว่าโปรแกรมทั้งหมดดูเหมือนจะมีคำตอบที่เหมือนกัน ทำไมพวกเขาถึงไม่มาบรรจบกัน?
Graviton

2
x = −2 ดึงดูด 8 รอบและx = −0.5 ดึงดูดเข้าสู่รอบ 6 (โปรแกรมของฉันยังคงให้คำตอบในกรณีเหล่านี้ แต่เป็นหนึ่งในจุดในรอบและไม่ใช่จุดคงที่นี่ไม่ได้บ่งบอกถึงการบรรจบกัน)
Anders Kaseorg

@AndersKaseorg Aha น่าสนใจมาก คุณคงไม่รู้ว่าทำไม '8' ถึง -2 และ '6' ถึง -0.5? เพิ่งออกจากความอยากรู้แน่นอน
Graviton

2
คุณสามารถรันการวนซ้ำได้อย่างง่ายดาย แต่นี่คือรูปภาพ: commons.wikimedia.org/wiki/File:Tetration_period.png
Anders Kaseorg

คำตอบ:



10

Pyth,  4  3 ไบต์

เครื่องหมายกากบาท 4 ยังคงเป็นปกติ 4; (

u^Q

ลองออนไลน์

มันทำงานอย่างไร

u       first repeated value under repeated application of G ↦
 ^QG        input ** G
    Q   starting at input

2
คุณไม่จำเป็นต้องใช้คนสุดท้ายGมันจะถูกป้อนอัตโนมัติ
FryAmTheEggman

@FryAmTheEggman ถูกต้องขอบคุณ!
Anders Kaseorg

7

Haskell , 100 63 ไบต์

สำหรับอินพุตที่ไม่ได้มาบรรจบกัน (เช่น-2) สิ่งนี้จะไม่สิ้นสุด:

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

ขอบคุณมาก @ ØrjanJohansenสำหรับการสอนเกี่ยวกับฉันuntilและช่วยฉัน37ไบต์!

ลองออนไลน์!


1
คุณสามารถย่อให้สั้นลงได้ด้วยuntilฟังก์ชั่น ลองออนไลน์!
Ørjan Johansen

เรียบร้อย! ไม่ทราบuntilขอบคุณมาก
ბიმო

7

Python 3 , 40 39 35 ไบต์

  • ขอบคุณ @ Ørjan Johansen สำหรับ byte: d>99แทนที่จะเป็นd==99: 1 ซ้ำอีกสำหรับ byte-count ที่น้อยกว่า
  • ขอบคุณ @Uriel 4 ไบต์: การใช้งานที่ชาญฉลาดของความจริงที่ว่าx**Trueประเมิน x x**(d>99or g(x,d+1))ใน การแสดงออกในคำที่ประเมินเป็นจริงสำหรับความลึกมากกว่า 99 และส่งกลับค่าผ่าน

แลมบ์แบบเรียกซ้ำที่มีความลึกสูงสุด 100 เช่นสำหรับความลึก 100 จะส่งกลับค่าเดิม ที่จริงแล้วคือผู้ไม่เชื่อเรื่องพระเจ้าลู่ดังนั้นคาดว่าตัวเลขที่ไม่คาดคิดสำหรับฟังก์ชั่นที่ไม่คาดคิด

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

ลองออนไลน์!


1
ในลิงค์ tio คุณสามารถแทนที่complex('j')ด้วย1j
Mr. Xcoder

1
d>99ทำซ้ำอีกครั้งหนึ่งและสั้นกว่า
Ørjan Johansen

1
บันทึก 4 ไบต์ด้วยg=lambda x,d=0:x**(d>99or g(x,d+1)), x**Trueประเมินเป็นx
Uriel

@Uriel นั่นฉลาดจริงๆ ..... ขอบคุณ !!!
อย่างเป็นทางการ

6

Python 3, 37 30 27 ไบต์

-7 ไบต์จาก @FelipeNardiBatista
-3 ไบต์จากจาก @xnor

ฉันจำ Python ไม่ได้อีกต่อไป แต่ฉันจัดการพอร์ต Ruby ของฉันแล้วตอบ Python 3 อีกคำตอบ: D

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

ลองออนไลน์!


1
FYI ก็ปรากฏว่า F-สตริงเป็นครั้งแรกในหลาม 3.6: ดูpython.org/dev/peps/pep-0498 (นี่จะอธิบายว่าทำไมโค้ดของคุณใช้ไม่ได้กับฉันใน 3.5.2) แค่คิดว่าฉันจะพูดถึงเรื่องนี้ในกรณีที่คนอื่นสับสน
mathmandan

1
คุณไม่จำเป็นต้องเปลี่ยนตัวลงสนามในมูลค่าของx, eval('x**'*99+'1')งาน
XNOR

@ xnor doh แน่นอนมันไม่ :) ขอบคุณ
daniero

@xnor นี - ฉันนำมาใช้ในสิ่งเดียวกันในคำตอบทับทิมของฉันและมันอย่างใดคงได้ :)
daniero

+1, ฉันตบตัวเองเพื่อลืมการมีอยู่ของ eval .... : D
officialaimm


4

J , 5 ไบต์

^^:_~

ลองออนไลน์!

คำอธิบาย

ก่อนอื่นฉันจะแสดงให้เห็นว่าคำสั่งใดที่ถูกดำเนินการหลังจากการแยกวิเคราะห์~ในตอนท้ายและการเดินผ่านจะเป็นคำกริยาใหม่

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

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

วิธีการแก้ปัญหา J ดีจริงๆที่นี่ ที่จะทำลายลงบรรทัดแรกของคุณได้ในเมล็ดปลีกย่อยคือมันถูกต้องที่จะบอกว่าต่อไปนี้เกิดขึ้น: (^^:_) สร้างกริยา dyadic ใหม่ผ่าน conj อำนาจแล้วคำวิเศษณ์ตนเอง~ทำให้คำกริยาเอกเพื่อที่ว่าเมื่อได้รับการโต้แย้งก็ขยายไปx x (^^:_) xทางซ้ายในxภายหลัง "เกาะติด", ให้((x&^)^:_) xบันทึกย่อของคุณต่อไป, และการโต้แย้งที่ถูกต้องเท่านั้นที่เปลี่ยนไปในระหว่างการทำซ้ำ?
โยนาห์

1
@Jonah แน่นอนว่าเมื่อให้สองข้อโต้แย้งที่จะคู่กับอำนาจx u^:n yอาร์กิวเมนต์ซ้ายถูกผูกมัดกับคู่ในรูปแบบ monad ที่ซ้อนกันครั้งในn yx u^:n y -> (x&u)^:n y -> (x&u) ... n times ... (x&u) y
ไมล์

4

C # (. NET Core) , 79 78 ไบต์

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

ลองออนไลน์!

ฉันเลือกที่จะทำซ้ำจนถึงi= 999 เพราะถ้าฉันทำซ้ำจนถึง 99 ตัวอย่างบางส่วนไม่ถึงความแม่นยำที่ต้องการ ตัวอย่าง:

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)

อย่างที่คุณเห็นหลังจากการวนซ้ำ 99 ครั้งส่วนจินตภาพล้มเหลวในตำแหน่งทศนิยมที่ 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)

ในกรณีนี้หลังจากการทำซ้ำ 99 ครั้งเราจะได้ความแม่นยำที่คาดหวัง ในความเป็นจริงฉันสามารถวนซ้ำจนถึงi= 1e9 ด้วยจำนวนไบต์เดียวกัน แต่จะทำให้โค้ดช้าลงอย่างมาก

  • บันทึก 1 ไบต์ต้องขอบคุณผู้ใช้ที่ไม่ระบุชื่อ

1
+1 สำหรับชั้นเรียนที่ซับซ้อนฉันไม่รู้ด้วยซ้ำว่ามีอยู่จริง
TheLethalCoder

1
@TheLethalCoder ทั้งฉันจนกว่าฉันจะ googled มัน :-)
Charlie


2

Ruby, 21 20 ไบต์

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

คำเตือน : ดูเหมือนว่าทับทิมคืนค่าแปลก ๆ บางอย่างเมื่อเพิ่มจำนวนเชิงซ้อนเป็นพลังงาน ฉันถือว่ามันอยู่นอกขอบเขตสำหรับความท้าทายนี้เพื่อแก้ไขโมดูลคณิตศาสตร์ทั้งหมดของ Ruby แต่ไม่เช่นนั้นผลลัพธ์ของฟังก์ชันนี้ควรถูกต้อง แก้ไข : ใช้การเปลี่ยนแปลงล่าสุดจากคำตอบ Python 3ของฉันและทันใดนั้นก็ให้ผลเหมือนกัน :)

ลองออนไลน์!


evalที่จะออกจากพื้นที่หลังจากที่
หมึกมูลค่า

รุ่นเดิมของคุณล้มเหลวในกรณีทดสอบที่ซับซ้อนเพราะมัน evaled สตริง"0+1i**0+1i**0+1i**..."ซึ่งจะแยกวิเคราะห์ในทางที่ผิดตั้งแต่มีลำดับความสำคัญสูงกว่า** +
Ørjan Johansen

@ ØrjanJohansen huh คุณพูดถูก ฉันเดาว่าฉันถูกหลอกโดยความจริงนั้น#inspectและ#to_sคืนค่าที่แตกต่าง ก่อนที่จะส่งคำตอบเริ่มต้นฉันทำการทดสอบใน irb และเห็นว่าเช่นการป้อนComplex(1,2)ใน REPL จะให้(1+2i)รวมถึงวงเล็บ เมื่อทำการ stringing ค่า แต่ไม่รวมวงเล็บดังนั้นสิ่งที่สำคัญกว่านั้นในขณะที่คุณชี้ให้มันสับสน
daniero

ฉันคิดว่าการevalใช้นั้นถูกห้าม
V. Courtois

@ V.Courtois ตกลง แต่มันไม่ใช่
daniero

2

TI-BASIC ขนาด 16 ไบต์

Ansอินพุตและเอาต์พุตจะถูกเก็บไว้ใน

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

1

R , 36 33 ไบต์

- 3 ไบต์ขอบคุณ Jarko Dubbeldam

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

อ่านจาก stdin Reduces จากสิทธิในการรับเลขชี้กำลังที่ใช้ในลำดับที่ถูกต้อง

ลอง (ฟังก์ชั่น)

ลอง (stdin)


1
scan(,1i)โรงงาน คล้ายกับวิธีการscan(,'')ทำงาน
JAD

@ JarkoDubbeldam แน่นอน! บางครั้งสมองของฉันไม่ทำงาน
Giuseppe


1

MATL , 20 10 ไบต์

ลดเหลือครึ่งขอขอบคุณ @LuisMendo

t^`Gw^t5M-

ลองออนไลน์!

นี่คือครั้งแรกของฉันและเป็นครั้งแรกที่ฉันใช้ MATL ดังนั้นฉันมั่นใจว่ามันจะโตเร็วกว่านี้


ยินดีต้อนรับสู่เว็บไซต์และคำตอบแรกที่ดี! ไม่กี่ข้อเสนอแนะ: เทียบเท่ากับXII tนอกจากนี้คุณยังสามารถกำจัดXHและHใช้คลิปบอร์ดอัตโนมัติM, ttt^`yw^t5M-]bb-xที่อยู่, และในส่วนสุดท้ายแทนที่จะลบค่าที่ไม่ต้องการที่คุณสามารถใช้ได้&ซึ่งจะบอกให้ฟังก์ชั่นการแสดงผลโดยนัยแสดงเฉพาะด้านบนเท่านั้น ดังนั้นคุณสามารถใช้ttt^`yw^t5M-]&และบันทึกไม่กี่ไบต์
Luis Mendo

นอกจากนี้ยังเป็นครั้งแรกที่tไม่จำเป็นและการใช้Gแทนอีกtคุณสามารถหลีกเลี่ยง&และทำให้ออกโดยปริยาย:] t^`Gw^t5M-เฮ้เราลดจำนวนไบต์ลงครึ่งหนึ่ง!
Luis Mendo

@LuisMendo ขอบคุณสำหรับเคล็ดลับที่ยอดเยี่ยม! ฉันมีอะไรหลายอย่างให้เรียนรู้เกี่ยวกับ MATL แต่ฉันชอบมันมาก
Cinaski

ดีใจที่ได้ยินเช่นนั้น!
Luis Mendo

0

Perl 6 , 17 ไบต์

{[R**] $_ xx 999}

ลองออนไลน์!

R**เป็นตัวดำเนินการ reverse-exponentiation จะมีค่าเท่ากับ x R** y ลดรายการ 999 สำเนาของอาร์กิวเมนต์อินพุตด้วยการยกกำลังแบบย้อนกลับy ** x[R**]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.