คำนวณตัวเลขสุดท้ายของหมายเลขของ Graham


13

หมายเลขของ Grahamสิ้นสุดใน 7 มันเป็นจำนวนมากในทางทฤษฎีที่ต้องการข้อมูลเพิ่มเติมเพื่อเก็บมากกว่าขนาดของจักรวาลเอง อย่างไรก็ตามเป็นไปได้ที่จะคำนวณตัวเลขสองสามหลักสุดท้ายของหมายเลขของ Graham

ตัวเลขสองสามตัวสุดท้ายคือ:

02425950695064738395657479136519351798334535362521
43003540126026771622672160419810652263169355188780
38814483140652526168785095552646051071172000997092
91249544378887496062882911725063001303622934916080
25459461494578871427832350829242102091825896753560
43086993801689249889268099510169055919951195027887
17830837018340236474548882222161573228010132974509
27344594504343300901096928025352751833289884461508
94042482650181938515625357963996189939679054966380
03222348723967018485186439059104575627262464195387

โปรแกรมของคุณอาจไม่มี (หรือตัวเลขที่คล้ายกัน) แต่ต้องคำนวณ จะต้องคำนวณ 200 หลักหรือมากกว่า

ส่งออกไปยัง stdout ใช้เวลาสูงสุด 2 นาทีกับฮาร์ดแวร์ที่เหมาะสม โปรแกรมที่สั้นที่สุดชนะ


ควรพิมพ์ตัวเลขกี่หลัก
Wile E. Coyote

@Dogbert D'oh ฉันคิดถึงสิ่งนั้น 200 หรือมากกว่านั้นก็โอเค
โทมัส O

ทับทิมจะไม่ได้คำนวณ3**7625597484987ในขณะที่งูใหญ่ไม่ :)
gnibbler

@gnibbler อืมได้อย่างไร ผลลัพธ์จะมีตัวเลขมากกว่า 3 ล้านล้านหลัก
Wile E. Coyote

1
@Dogbert ให้หน่วยความจำและเวลาเพียงพอที่ Python จะคำนวณล่วงหน้าโดยใช้ความยาว Ruby จะไม่ทำ 3 ** 5000000 ดูเหมือนว่าจะมีข้อ จำกัด บางอย่างอยู่ในนั้น
gnibbler

คำตอบ:


9

dc - 21 ตัวอักษร

[3z202>xO200^|]dsxxrp

ใช้เวลาประมาณหนึ่งนาทีในคอมพิวเตอร์ของฉันและจะใช้เวลานานกว่าสำหรับค่าที่มากกว่า 200 แต่จะไม่นำศูนย์ออก

นี่เป็นเวอร์ชันที่ยาวกว่า แต่เร็วกว่าเล็กน้อย (26 ตัวอักษร):

[3rAz^|dz205>x]dsxxAz6-^%p
3[3rAz^|dz202>x]dsxxAz3-^%p # or an extra character for a few less iterations

4

Haskell, 99

ประสิทธิภาพไม่ได้เป็นตัวเอก แต่มันสามารถคำนวณตัวเลข 500 หลักในหนึ่งนาทีบนฮาร์ดแวร์เก่าของฉัน

f a b|b==0=1|odd b=mod(a*f a(b-1))m|0<1=f(mod(a^2)m)$div b 2
main=print$iterate(f 3)3!!500
m=10^500

(btw ฉันชอบที่จะได้ยินเกี่ยวกับประสิทธิภาพของมันบนฮาร์ดแวร์ที่ทันสมัยกว่า)


ใช้เวลาประมาณ 19 วินาทีในการทำงานบนพีซีของฉัน ในหมายเหตุด้านนี้จะไม่พิมพ์ 0 นำหน้าก่อนออก
Wile E. Coyote

ใช่มันเป็นข้อผิดพลาดในการนับจำนวนหลักทั้งหมดด้วยศูนย์นำ เพียงคำนวณหา 501 ;-) ขอขอบคุณสำหรับมาตรฐาน คุณเรียกใช้มันตีความหรือรวบรวม?
JB

ghc -o g.exe g.hsผมรวบรวมมันด้วย ไม่แน่ใจว่าเป็นวิธีที่ดีที่สุดในการรวบรวม
Wile E. Coyote

ฉันวิ่งghc -O3 graham.hs ตัวเลือก Badass แนะนำจาก doc -O2 -fvia-Cออนไลน์ดูเหมือนจะเป็น (และดูเหมือนว่า GHC ของฉันจะออกมาไม่กี่รุ่นอยู่แล้ว)
JB

ดูเหมือนว่าจะทำงานด้วยความเร็วเท่ากันทั้งใน-O3และ-O2 -fvia-Cประมาณ 18.3 วินาที
Wile E. Coyote

3

Python - 41 ตัวอักษร

499 หลัก

x=3;exec'x=pow(3,x,10**500);'*500;print x

500 หลัก

x=3;exec'x=pow(3,x,10**500);'*500;print'0'+`x`

1
คุณกำลังใช้ความรู้ที่ตัวเลข 500th จากด้านหลังเป็น 0 มันจะให้คำตอบที่ผิดสำหรับพูด 200.

1
@Tim ปัญหาถามว่า "200 หลักหรือมากกว่า" เพียง hardcode จำนวนที่ใช้งานได้และใช้งานได้ (หรือปล่อยให้เป็นเช่นนั้น: มันพิมพ์ 499 หลักและดีพอสำหรับคำถามตามที่ถาม)
JB

@JB: แน่นอนฉันจะพอใจกับ 499 ถ้า 0 ถูกทิ้ง อย่างไรก็ตามในตอนนี้สมมติว่าตัวเลขเฉพาะคือ 0

@ user475 - โดยคุณสมบัติของเสาสัญญาณไฟหากคุณกำลังคำนวณตัวเลข (d) หลักสุดท้ายและผลลัพธ์มีค่าน้อยกว่า (d) หลักตัวเลขที่หายไป (ด้านซ้าย) จะต้องเป็น "0" ดังนั้นมันก็โอเคที่จะเพิ่มตัวเลข "0" ที่หายไป แต่ควรทำโดยตรวจสอบความยาวของผลลัพธ์และเพิ่มจำนวนที่เหมาะสมของ "0's"
Kevin Fegan

3

Python - 62 59 55 ตัวอักษร

x=3
for i in range(500):x=pow(3,x,10**500)
print"0%d"%x

ใช้เวลาประมาณ 12 วินาทีบนพีซีของฉัน

sh-3.1$ time python cg_graham.py
02425950695064738395657479136519351798334535362521430035401260267716226721604198
10652263169355188780388144831406525261687850955526460510711720009970929124954437
88874960628829117250630013036229349160802545946149457887142783235082924210209182
58967535604308699380168924988926809951016905591995119502788717830837018340236474
54888222216157322801013297450927344594504343300901096928025352751833289884461508
94042482650181938515625357963996189939679054966380032223487239670184851864390591
04575627262464195387

real    0m11.807s
user    0m0.000s
sys     0m0.015s
sh-3.1$

3
Native powmod เป็นนักฆ่า :-)
JB

คุณสามารถใช้10**500
gnibbler

@JB ว่าเป็นเหตุผลเดียวที่ผมใช้งูใหญ่สำหรับรายการนี้ :)
อีโคโยตี้

@gnibbler อัปเดตขอบคุณ! ฉันใหม่กับ Python :)
Wile E. Coyote

0

ความจริง 63 ไบต์

f()==(r:=3;d:=10^203;for i in 1..203 repeat r:=powmod(3,r,d);r)

ungolf และผลลัพธ์

--This find the Graham's number follow the algo found in wiki
--http://en.wikipedia.org/wiki/Graham%27s_number
ff()==
   r:=3; d:=10^203
   for i in 1..203 repeat r:=powmod(3,r,d)
   r

(3) -> a:=f()::String
   (3)
  "8871783083701834023647454888222216157322801013297450927344594504343300901096
  92802535275183328988446150894042482650181938515625357963996189939679054966380
  03222348723967018485186439059104575627262464195387"
                                                             Type: String
(4) -> #a
   (4)  203
                                                    Type: PositiveInteger

# a = 203 หมายถึงจำนวน len คือ> 200 มันก็เช่นกันโดยที่ไม่มี 0 ก่อน ...


0

Headsecks ขนาด 602 ไบต์

(h@HP0&Y+h8h (hx0RWc@4vYcx#@#PJ"B?[#CPx (h Lx$2(pl2YL;KD:T{9$2j<
 LSSh,ZT l2I<Pp,@4SX`,:xtc@T",($)<cKT\lbBAy44,dQl[yL"l+i,;9<*j0P
|)lD[+`\RBi!< LaD(LHPLyt{{@\iADRQdHTZQIT3[X`DB*`X$Cxh$*(T0$| ,[;
4:bit0DqAqi!lCYQ)<Ad(|1<$R4l+#tZrLPDatC[d*@0pDclJbh0|#S9<JRy!TP0
D+!|qiTXp<r$##Atj,B1ts;HLJ"Xp44I4cK4@|Q,4JI$|hp$Zyd+yl:y<s#\pD:9
4RDK,A!<X \cqLZ" h,kHp|qLRQIDh,+StZbL+{(|jqqL;9L"(xd"<s$8\:x,CY\
z0T[,(XdcxlbaD*D;+tDj\JIi4k[)LPDLBzP@DSc$jL $s4BjQ19|;!)|9t;TaQA
dLzit[0@l2!)I$,0P@$y<L4pLPLStQT"!a| $+8(DZ`00t ,RtX4C@$yQ11|KI\"
`|2<k3|R(Dyi<)LshTrzQ$sp D+DRbH|Q$CqT0D;AA\jdXd"ppdK3LzZl#\Bl`@t
k$*,11qTK+Xp|rqDZXp4{C!<Y4

พิมพ์ 200 หลักสุดท้าย

โปรดลบบรรทัดใหม่ก่อนเรียกใช้


เราควรจะใช้มันอย่างไร?
caird coinheringaahing

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