ส่งออกลำดับ Goodstein


18

(นี่อาจจะค่อนข้างคลาสสิก แต่นี่เป็นโพสต์แรกของฉันที่นี่ดังนั้นฉันยังไม่พร้อมสำหรับสิ่งแฟนซียัง)

ลำดับ Goodsteinมีการกำหนดจำนวนการป้อนข้อมูลดังต่อไปนี้:

เลือกหมายเลขเริ่มต้นn , ให้b = 2 และทำซ้ำ:

  • เขียนnในสัญกรณ์ทางพันธุกรรมฐาน
  • แทนที่ทั้งหมด ( b ) s เป็น ( b +1) s ในnและ substract 1
  • ส่งออกการประเมินผลทศนิยมใหม่ของn
  • เพิ่ม

สัญกรณ์ฐานทางพันธุกรรมคือการสลายตัวของจำนวนที่พื้นฐานเป็นจำนวนที่มากขึ้นที่จะปรากฏ ตัวอย่าง:

  • 83 ใน HB3: 3^(3+1)+2
  • 226 ใน HB2: 2^(2^(2+1))+2^(2+1)+2

ลำดับ Goodstein สิ้นสุดที่ 0เสมอ แต่พวกเขามักจะมีขนาดค่อนข้างใหญ่เร็วมากดังนั้นจึงไม่ขอให้แสดงลำดับที่สมบูรณ์


งาน:

ให้หมายเลขอินพุตในรูปแบบที่สมเหตุสมผลงานของคุณคือส่งออกลำดับ Goodstein สำหรับหมายเลขนี้อย่างน้อยก็จนกว่าจะถึง 10 ^ 25 หรือ 0

ตัวอย่าง:

Input: 3
Output: 3, 3, 3, 2, 1, 0
Input: 13
Output: 13, 108, 1279, 16092, 280711, 5765998, 134219479, 3486786855, 100000003325, 3138428381103, 106993205384715, 3937376385706415, 155568095557821073, 6568408355712901455, 295147905179352838943, 14063084452067725006646, 708235345355337676376131, 37589973457545958193377292
Input: 38
Output: 38, 22876792454990

รายละเอียด:

  • หมายเลขอินพุตสามารถเป็นอาร์เรย์สตริงสตริงจำนวนเต็มตราบใดที่อยู่ในฐานเลขฐานสิบ
  • เอาต์พุตเป็นไปตามกฎเดียวกัน
  • การแยกคำในเอาต์พุตสามารถเป็นช่องว่างบรรทัดใหม่หรือการแยกที่สมเหตุสมผล
  • ทันทีที่ซีเควนซ์นั้นมีขนาดใหญ่กว่า 10 ^ 25 โปรแกรมของคุณอาจออกโดยปกติโยนข้อผิดพลาด / ยกเว้นหรือดำเนินการต่อ (ไม่มีข้อ จำกัด )
  • นี่คือดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ
  • แน่นอนช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • Python ungolfed ตัวอย่างการทำงานที่นี่

2
คุณช่วยเพิ่มกรณีทดสอบทีละขั้นตอนได้ไหม
Rod

5
ยินดีต้อนรับสู่ PPCG! ความท้าทายแรกที่ดี!
FantaC


2
@ ØrjanJohansenใช่ข้อผิดพลาดคือint(q/base.b), q%base.bต้องq//base.b, q%base.b(หรือเพียงdivmod(q, base.b)) เพื่อหลีกเลี่ยงข้อผิดพลาดจุดลอย
Anders Kaseorg

2
“ อย่างน้อยก็จนกว่าจะถึง 10 ^ 25 หรือ 0” หมายความว่าโปรแกรมได้รับอนุญาตให้ดำเนินการต่อหลังจากถึง 0 (สมมุติว่าด้วย −1, −2, −3, …)?
Anders Kaseorg

คำตอบ:


3

Pyth , 28 26 ไบต์

.V2JbL&bs.e*^hJykb_jbJ=ty

ขึ้นบรรทัดใหม่ที่มีความสำคัญ

ลองออนไลน์! (ลิงค์นี้มี Pyth ที่Qไม่จำเป็นต้องใช้ในเวอร์ชั่นปัจจุบัน)

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

.V2JbL&bs.e*^hJykb_jbJ=ty
.V2                          for b in [2, 3, 4, ...]:
   Jb                          assign J = b
     L                         def y(b):
      &b                         b and
                   jbJ             convert b to base J
                  _                reverse
         .e                        enumerated map for values b and indices k:
             hJ                      J + 1
            ^  yk                    to the power y(k)
           *     b                   times b
(newline)                      print Q (autoinitialized to the input)
                        y      y(Q)
                       t       subtract 1
                      =        assign back to Q

มันเป็นสิ่งสำคัญที่yเป็นนิยามใหม่ในแต่ละซ้ำห่วงเพื่อป้องกันไม่ให้ memoization Jข้ามการเปลี่ยนแปลงตัวแปรโลก


3

Haskell , 77 ไบต์

(&2)เป็นฟังก์ชั่นที่ไม่ระบุชื่อสละIntegerและกลับรายการ (อาจนานมาก) ของIntegerS, (&2) 13ใช้เป็น

(&2)
n&b|n<0=[]|let _?0=0;e?n=(e+1)?div n b+mod n b*(b+1)^0?e=n:(0?n-1)&(b+1)

ลองออนไลน์! (ตัดที่10^25.)

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

  • (&2)2เริ่มต้นลำดับที่มีฐาน
  • n&bคำนวณ subsequence ที่เริ่มต้นด้วยจำนวนและฐาน nb
    • มันหยุดกับรายการว่างเปล่าถ้าซึ่งโดยทั่วไปจะเกิดขึ้นในขั้นตอนหลังจากที่n<0n==0
    • มิฉะนั้นจะ prepends ในรายการกลับมาซ้ำโดยการแสดงออกn(0?n-1)&(b+1)
  • ?เป็นผู้ดำเนินการฟังก์ชั่นท้องถิ่น 0?nให้ผลลัพธ์ของการแปลงnเป็นฐานพันธุกรรมbแล้วเพิ่มฐานทุกที่
    • การแปลงจะเกิดขึ้นอีกครั้งพร้อมกับeการติดตามตัวแปรของเลขชี้กำลังปัจจุบัน แปลงหมายเลขe?nn*b^e
    • หยุดการเรียกซ้ำกับเมื่อ0n==0
    • มิฉะนั้นจะแบ่งโดยฐาน nb
      • (e+1)?div n b จัดการการสอบถามซ้ำสำหรับผลหารและเลขยกกำลังที่สูงขึ้นต่อไป
      • mod n b*(b+1)^0?eจัดการที่เหลือ (ซึ่งก็คือหลักที่สอดคล้องกับสัญลักษณ์ในปัจจุบันe) การเพิ่มขึ้นของฐานและการแปลงสัญลักษณ์ปัจจุบัน hereditarily 0?eกับ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.