ส่งออกสำเนาของ googol ของสตริง


63

ฉันสนใจที่จะเห็นโปรแกรมที่ไม่ขอข้อมูลใด ๆ พิมพ์สำเนาgoogolของสตริงที่ไม่มีข้อผิดพลาดไม่น้อยไม่มากแล้วหยุด googolถูกกำหนดให้เป็น 10 ^ 100 คือ 1 ตามด้วย 0 ร้อยในทศนิยม

ตัวอย่างผลลัพธ์:

111111111111111111111111111111111111111111111111111111111111111111111111...

หรือ

Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
...

สตริงสามารถประกอบด้วยพื้นที่สีขาวหรือสัญลักษณ์พิเศษทั้งหมดได้ ข้อยกเว้นเพียงอย่างเดียวสำหรับสำเนาที่เหมือนกันของสตริงคงที่คือหากภาษาของคุณตกแต่งเอาท์พุทด้วยวิธีการที่ไม่สามารถป้องกันได้ แต่สามารถลบออกได้เล็กน้อยในสคริปต์ตัวห่อหุ้มเช่นการเติมหมายเลขบรรทัดในแต่ละบรรทัด ไม่จำเป็นต้องระบุสคริปต์ตัวแรปเปอร์ในกรณีดังกล่าว

คุณสามารถสมมติว่าคอมพิวเตอร์ของคุณจะไม่หมดเวลา แต่นอกเหนือจากนั้นโปรแกรมของคุณจะต้องมีความต้องการทรัพยากรที่เหมาะสม นอกจากนี้คุณต้องเคารพข้อ จำกัด ใด ๆ ที่ภาษาการเขียนโปรแกรมที่คุณเลือกโพสเช่นคุณต้องไม่เกินค่าสูงสุดที่อนุญาตสำหรับประเภทจำนวนเต็มและไม่จำเป็นต้องมีหน่วยความจำเกิน 4 GB

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

นี่คือดังนั้นการแก้ปัญหาด้วยจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ

ตัวอย่างโซลูชัน (C, ungolfed, 3768 bytes)

#include <stdio.h>

int main() {
  int a00, a01, a02, a03, ..., a99;
  for(a00 = 0; a00 < 10; a00++)
  for(a01 = 0; a01 < 10; a01++)
  for(a02 = 0; a02 < 10; a02++)
  for(a03 = 0; a03 < 10; a03++)
  ...
  for(a99 = 0; a99 < 10; a99++)
    puts("1");
  return 0;
}

10
พิจารณาแซนด์บ็อกซ์ในครั้งต่อไป
แมว

9
เมื่อคุณโพสต์คำถามใหม่คุณจะถูกถามในการโพสต์แรกในกล่องเครื่องมือ
ข้อบกพร่อง

1
@KritixiLithos มันกำลังเล่นกับไอเดียนั้น แต่ฉันไม่สามารถหาวิธีแก้ปัญหาตัวอย่างได้อย่างรวดเร็ว รู้สึกเป็นอิสระที่จะสร้างผลสืบเนื่อง :-)
The Vee

3
@closevoter คุณแน่ใจหรือว่ามันกว้างเกินไป? สามัญสำนึกจะ จำกัด สิ่งนี้ลงโดยอัตโนมัติจาก "พิมพ์สตริงที่ไม่ว่างเปล่า 10 ^ 100 ครั้ง" ถึง "พิมพ์อักขระ 10 ^ 100 ครั้ง"
dorukayhan

คำตอบ:


34

เยลลี่ , 6 4 ไบต์

³Ȯ*¡

นี้เป็นลิงค์ niladic (ฟังก์ชั่น w / o ข้อโต้แย้ง) ที่พิมพ์10 200สำเนาของสตริง100หมายความว่ามันพิมพ์10 100สำเนาของสตริงที่ประกอบด้วย10 100สำเนาของสตริง100

ลองออนไลน์!

โปรดทราบว่าล่ามออนไลน์จะลดเอาต์พุตที่ 100 KB ด้วยเหตุผลทางปฏิบัติ รหัสยังทำงานเป็นโปรแกรมเต็มรูปแบบ แต่เนื่องจากเอาต์พุตโดยนัยโปรแกรมนั้นพิมพ์หนึ่งสำเนามากเกินไป

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

³Ȯ*¡  Niladic link. No arguments.

³     Set the left argument and initial return value to 100.
 Ȯ    Print the current return value.
  *   Compute 100 ** 100 = 1e200.
   ¡  Call Ȯ 1e200 times. 

3
ดี ... ว้าว ... พิมพ์10^100สำเนาของการส่งออกเดิม ( 10^100สำเนาของสตริง) คือการมันเล็ก ๆ น้อย ๆห่างไกลแม้สำหรับไบต์ที่สองทั้งหมด คุณเคยส่งสิ่งนี้เข้ากับความท้าทาย "คะแนนคือเอาท์พุท / ความยาวสูงสุดที่ชนะ" หรือยัง?
wizzwizz4

1
ไม่แน่ใจว่าคุณกำลังพูดถึงความท้าทายใด (เรามีประเภทนี้ไม่มากนัก) แต่3e200อาจไม่สามารถแข่งขันได้
Dennis

2
@ wizzwizz4 หากคุณสามารถแสดงหมายเลขของคุณในรูปแบบมาตรฐานมันอาจจะเล็กเกินไป
orlp

1
"Fall over" = fail / crash
Loren Pechtel

4
@ LorenPechtel Jelly ถูกนำไปใช้ใน Python ซึ่งจัดการจำนวนเต็ม 665 บิตได้อย่างง่ายดาย
เดนนิส

60

Fuzzy Octo Guacamole, 13 12 11 10 ไบต์

9+ddpp![g] 

คำอธิบาย:

9+ddpp![g]
9+           # push 9 and increment, giving 10
  dd         # duplicate, twice. now you have [10,10,10]
    pp       # raise a 10 to the 10th power, then raise that to the 10th again. That ends up being 10^100.
      ![ ]   # for loop, `!` sets the counter to the top of stack
        g    # prints an ASCII art goat. 

ตัวอย่างแพะพิมพ์:

                  ___.
                 //  \\
                ((   ""
                 \\__,
                /6 (%)\,
               (__/:";,;\--____----_
                ;; :";,:";`;,";,;";`,`_
                  ;:,;;";";,;":,";";,-Y\
                   ;,;,;";";,;":;";"; Z/
                   / ;,";";,;";,;";;"
                  / / |";/~~~~~\";;"
                 ( K  | |      || |
                  \_\ | |      || |
                   \Z | |      || |
                      L_|      LL_|
                      LW/      LLW/

2
ฉันใช้เวลาสักครู่เพื่อทำความเข้าใจหัวแพะ มันไม่สามารถจดจำได้ง่าย
mbomb007

gaot ให้ศิลปะ ASCII แก่ฉันถามเขาเกี่ยวกับมัน
Rɪᴋᴇʀ

9
ฉันไม่รู้ว่าคุณกำลังพูดถึงเรื่องอะไร +1
djechlin

15
@djechlin Downgoat ขอให้ฉันเพิ่ม builtin สำหรับการพิมพ์แพะ ฉันจำเป็นต้อง
Rɪᴋᴇʀ

21

Python ขนาด 28 ไบต์

-1 ไบต์ขอบคุณ Jonathan Allan!

Python 2:

i=10**100
while i:print;i-=1

Python 3 (30 ไบต์):

i=10**100
while i:print();i-=1

2
i=10**100ขึ้นบรรทัดใหม่while i:print();i-=1จะบันทึกไบต์ ประหยัดอีกสองอย่างโดยใช้ Python 2 กับwhile i:print;i-=1
Jonathan Allan

@ Jonathanathan ขอบคุณสำหรับ -1 ไบต์ สำหรับโซลูชัน Python 2 ฉันจะปล่อยให้คุณโพสต์ :)
FlipTack

คำตอบแรกที่ดี! :)
Daniel

Python จริงสามารถเก็บ 10 ถึง 100 ในจำนวนเต็มได้หรือไม่?
Arturo Torres Sánchez

7
@ ArturoTorresSánchezใช่ไม่มีขีด จำกัด บนขนาด int ในหลาม :)
FlipTack

18

Haskell, 28 ไบต์

main=putStr$[1..10^100]>>"1"

เชื่อมต่อ 10 ^ 100 สำเนาของสตริง"1"และพิมพ์


การต่อสตริงเสร็จก่อนที่จะเริ่มการพิมพ์หรือไม่ ถ้าเป็นเช่นนั้นฉันคิดว่านี่
เป็นการละเมิด

8
@daniero: ขอบคุณการพิมพ์ที่ขี้เกียจของ Haskell เริ่มขึ้นทันที บนคอมพิวเตอร์ของฉันโปรแกรมต้องการหน่วยความจำน้อยกว่า 2MB (รวมถึงระบบรันไทม์ RTS)
nimi

คือs=[1..10^100]>>"1"รูปแบบคำตอบที่ได้รับอนุญาต?
user253751

จำนวนเต็มไม่สิ้นสุด? มิฉะนั้นจะตกไปในวันที่ 10 ^ 100
Loren Pechtel

@immibis: ความท้าทายบอกว่า "print" ซึ่งมักจะหมายถึง "print to stdout" sจากตัวอย่างของคุณไม่ได้พิมพ์ - หรือถ้าคุณใช้ REPL ล้อมรอบด้วย1 "ฉันเดาว่าputStr$[1..10^100]>>"1"ไม่มีสิ่งmain=ใดจะดี แต่ฉันต้องการส่งโปรแกรมเต็มรูปแบบ
nimi

17

brainfuck, 480 188 114 106 98 ไบต์

เพียงเพราะมันจำเป็นต้องทำ

สมมติว่าเซลล์ 8 บิตมีการห่อ พิมพ์ 250 255 NUL ไบต์ซึ่งคือ 10 100ครั้ง 10 155ครั้ง 25 255 NUL ไบต์

>>>>>>-[[->>>+<<<]------>>>-]<<<[<<<]+[+[>>>]<<<->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-[<<<].>>>-]

คำอธิบาย:

>>>>>> จำเป็นต้องออกจากพื้นที่ทำงานเล็กน้อย

- ผลิต 255

[[->>>+<<<]------>>>-] เปลี่ยนเป็น 255 สำเนาของค่า 250 โดยให้เทปที่มีลักษณะดังนี้:

0 0 0 0 0 0 250 0 0 250 0 0 ... 250 0 0 [0]

<<<[<<<]+ ย้ายตัวชี้ข้อมูลไปด้านหลังและจบข้อมูลแรก:

0 0 0 [1] 0 0 250 0 0 250 0 0 ...

จากนั้นลูป: [+...-]เริ่มแรกตั้งค่า 1 เป็น 2 ซึ่งได้รับการตั้งค่ากลับเป็น 1 ในตอนท้ายของลูป ลูปจะสิ้นสุดลงเมื่อร่างกายลูปตั้งค่า 2 เป็น 1 แล้ว

ทีนี้ตัวเลข 2 250 250 250 ... 250 แทนเคาน์เตอร์ในฐาน 250 โดยแต่ละหมายเลขหนึ่งมากกว่าตัวเลข

  • [>>>]<<<เลื่อนไปจนสุดทาง เนื่องจากตัวเลขแต่ละหลักแสดงด้วยตัวเลขที่ไม่เป็นศูนย์นี่เป็นเรื่องเล็กน้อย

  • ->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-ลดจำนวนตัวนับ 1 เริ่มต้นด้วยหลักสุดท้าย: ตัวเลขจะลดลง ถ้ามันยังคงเป็นบวกเราจะทำ หากเปลี่ยนเป็นศูนย์ให้ตั้งเป็น 250 และดำเนินการต่อด้วยตัวเลขก่อน

  • [<<<].>>>เลื่อนตัวชี้กลับมาก่อนตัวเลขหลักซ้ายสุดและนี่เป็นช่วงเวลาที่ดีในการพิมพ์ NUL ไบต์ จากนั้นปรับตำแหน่งให้เป็นจำนวนหลักซ้ายสุดเพื่อดูว่าเราเสร็จแล้วหรือไม่

เพื่อตรวจสอบความถูกต้องเปลี่ยนเริ่มต้น-ในการ+พิมพ์ 250 1ไบต์ NUL, ++250 2ฯลฯ


16

C, 51 ไบต์

ฟังก์ชั่นg()เรียกฟังก์ชั่นซ้ำf()เพื่อความลึก 99

ไม่รวมบรรทัดใหม่ที่ไม่จำเป็นที่เพิ่มระหว่างf()และg()เพื่อความชัดเจน

f(n,i){for(i=10;i--;)n?f(n-1):puts("");}
g(){f(99);}

//call like this
main(){g();}

พิมพ์บรรทัดใหม่ 1E100

การประกาศiเป็นพารามิเตอร์ที่สองของf()ไม่รับประกันว่าจะทำงานในทุกรุ่นของ C ทดสอบบนเครื่องของฉันเอง (GCC บน CygWin) และบน ideone.com (ฉันเชื่อว่าพวกเขาใช้ GCC ด้วย) แต่ไม่ถึง f (99) เหตุผล!


1
สิ่งนั้นสอดคล้องกับขีด จำกัด หน่วยความจำ 4 GiB หรือไม่?
เดนนิส

3
@Dennis ควรทำอย่างไรมันจะเก็บเฉพาะความลึก 99 การวนซ้ำของ f, n และ i บนสแต็คทำให้ทราบว่า C ไม่สามารถจัดการกับเลขทศนิยม 100 หลัก ฉันจะประมาณสูงสุด 20 ไบต์สำหรับแต่ละอินสแตนซ์f()ดังนั้นประมาณ 1980 ไบต์ การputsขึ้นบรรทัดใหม่ไปยัง API และ API ควรส่งออกและล้างบัฟเฟอร์ตามความจำเป็น
เลเวลริเวอร์เซนต์

3
ทดสอบในพื้นที่และการใช้หน่วยความจำไม่ได้เกิน 1 MiB
เดนนิส

การประกาศของ i เป็นพารามิเตอร์ตัวที่สองของ f () ไม่รับประกันว่าจะทำงานในทุกเวอร์ชั่นของ C : มันอาจจะแตกด้วยระเบียบการเรียกสแต็ก - อาร์กที่ callee pops args จากสแต็ก (หรือถ้าfเขียนไปยังสแต็คพื้นที่ ไม่ได้คาดหวังว่าจะเป็น) เสียงดังกราวจะเตือนเกี่ยวกับ "อาร์กิวเมนต์น้อยเกินไปในการเรียก 'f'" ใน-std=c89และ-std=c99ดังนั้นคำจำกัดความจะทำหน้าที่เป็นการประกาศที่มีจำนวน args ที่เฉพาะเจาะจง แต่ฉันลืม ฉันคิดว่านั่นอาจหมายถึงคอมไพเลอร์รู้ว่าฟังก์ชั่นคาดหวังว่า 2 args และจะเว้นที่ว่างสำหรับ arg ที่ 2
Peter Cordes

1
@FelixDombek ชุมชนตัดสินใจว่า "โปรแกรม" หมายความว่าคุณสามารถเขียนโปรแกรมหรือฟังก์ชันได้เว้นแต่จะระบุ "full program" ไว้อย่างชัดเจน meta.codegolf.stackexchange.com/a/6912/15599 ดังนั้นการส่งของฉันประกอบด้วยและฟังก์ชั่นผู้ช่วยของตนg จะนานขึ้น มีการส่งฟังก์ชั่นอื่น ๆ ไม่กี่ที่นี่ถ้าคุณมองผ่าน fmain
Level River St

14

Commodore VIC 20 รหัสเครื่อง (40 ไบต์)

... ที่นี่แสดงเป็นเลขฐานสิบหก:

1040   A9[64]A2 00 9D 68 10 E8  E0[32]D0 F8 A9 00 9D 68
1050   10 A9[31]20 D2 FF A2 00  A9[64]DE 68 10 30 08 D0
1060   F0 9D 68 10 E8 D0 F3 60

(เริ่มใช้: SYS 4160)

ความหมายของไบต์ในวงเล็บ

  • 0x64 (เกิดขึ้นสองครั้ง) คือฐาน (100); (ค่าตั้งแต่ 2 ถึง 127 ควรใช้ได้)
  • 0x32 คือเลขชี้กำลัง (50) (ค่าใด ๆ ที่ไม่เป็นศูนย์ (1-255) ควรทำงาน)
  • โปรดทราบว่า 100 ^ 50 = 10 ^ 100; การรันโปรแกรม 100 ^ 50 ครั้งมีประสิทธิภาพมากกว่าแรม 10 ^ 100 ครั้ง
  • 0x31 เป็นอักขระ ASCII ที่จะพิมพ์

และไม่จำเป็นต้องมีหน่วยความจำเกิน 4 G B

นี่เป็นความผิดพลาดในการพิมพ์หรือไม่?

เรามีปี 1981

คอมพิวเตอร์ที่บ้านทั่วไปมีRAM 1 ถึง 16 K B! และคุณแทบจะไม่พบกับรุ่นมืออาชีพที่มี 1 M B หรือมากกว่า

(ตกลงแค่เรื่องตลก)

กล่าวโดยทั่วไปแล้วโปรแกรมควรจะสามารถทดสอบได้โดยใช้โปรแกรมบนคอมพิวเตอร์ของคุณ แต่เนื่องจากขนาดของจำนวนนี้คุณจะได้รับการคาดหวังว่าจะพิสูจน์ได้ว่าจำนวนสำเนาของสตริงที่ส่งออกมีค่าเท่ากับ 10 ^ 100 และโปรแกรมหยุดทำงานหลังจากนั้น

โปรแกรมได้รับการทดสอบกับฐานและเลขชี้กำลังอื่น ๆ ฉันไม่สงสัยเลยว่ามันจะใช้ได้กับ 100 และ 50

อย่างน้อยก็ไม่ได้ผิดพลาดกับตัวเลขเหล่านี้ (แต่ไม่ยุติในเวลาที่วัดได้เช่นกัน)

ขนาดหน่วยความจำเพียงพอสำหรับเลขชี้กำลัง 50 และ 100 น้อยกว่า 127 ดังนั้นฐาน 100 ไม่ควรมีปัญหา

ความคิดพื้นฐาน

มีตัวนับ 50 หลักที่นับในระบบ 100 ไบต์ 0x01-0x64 แสดงถึงตัวเลข 0-99 ไบต์แรกในตัวนับเป็นตัวเลขที่ต่ำที่สุด ไบต์สุดท้ายในตัวนับ (ตัวเลขสูงสุด) ตามด้วยไบต์ที่มีค่า 0x00

ตัวนับมีค่าเริ่มต้น 100 ^ 50

ลูปด้านนอกกำลังเขียนไบต์ไปที่ "ช่องสัญญาณปัจจุบัน" ("เอาต์พุตมาตรฐาน" บนระบบที่ทันสมัย; โดยทั่วไปหน้าจอ) แล้วลดจำนวนตัวนับ

การลดลงทำได้โดยการวนรอบภายใน: มันลดตัวเลขและในกรณีของอันเดอร์โฟล์ตั้งแต่ 1 ถึง 99 มันจะเลื่อนไปยังตัวเลขถัดไป หาก byte 0x00 ที่ส่วนท้ายของตัวนับลดลงโปรแกรมจะหยุดทำงาน

รหัสการประกอบคือ

    ; Some constants
    base=10
    exponent=100
    character=0x32

    ; Initialize the content of the counter to 100^50
    ; (Fill the first 50 bytes with the value 100)
    lda  #base
    ldx  #0
initLoop:
    sta  counter,x
    inx
    cpx  #exponent
    bne  initLoop
    ; (The terminating 0 at the end of the counter)
    lda  #0
    sta  counter,x

    ; Now do the actual job
outerLoop:
    ; Output a character
    lda  #character
    jsr  (0xFFD2)
    ; Prepare for the inner loop
    ldx  #0
    lda  #base
innerLoop:
    ; Decrement one digit
    dec  counter,x
    ; Result is negative -> must have been the terminating
    ; NUL byte -> Exit
    bmi  progEnd
    ; Result is not zero -> Print the next byte
    bne  outerLoop
    ; Result is zero -> Was 0x01 before -> As 0x01 represents
    ; digit 0 this is an underflow -> set the digit to
    ; "exponent" (100) again (which represents digit 99)
    sta  counter,x
    ; Go to the next digit and...
    inx
    ; ... repeat the inner loop (decrement next digit)
    ; (Note that this conditional branch is ALWAYS taken)
    bne  innerLoop

progEnd:
    rts

counter:
    ; The memory used by the counter is here...

แก้ไข

โปรแกรมทำงานบน Commodore C64 เช่นกัน!


ฉันยืมแนวคิดการเรียกซ้ำของ @ LevelRiverStore สำหรับการติดตั้งรหัสเครื่อง x86-64ของฉันมาที่ 30B (โดยใช้ putchar จาก libc สำหรับการพิมพ์) ฉันพิจารณาตัวนับลูปที่มีความแม่นยำเพิ่มขึ้นและมันจะทำงานใน x86 ด้วย (และในทำนองเดียวกันสามารถเริ่มต้นค่อนข้างถูก) บางทีผมอาจจะลองบางครั้ง ...
ปีเตอร์ Cordes

1
ว้าวววววว .... <การตีกอล์ฟ>> ฉันไม่เห็นชุดประกอบ 6502 ใน ... อืมนานมาก
Alex Howansky

12

โหนด, 89 ไบต์

for(i="0".repeat(100)+1;+i;i=i.replace(/0*./,x=>"9".repeat(x.length-1)+~-x))console.log()

เอาต์พุต 10 100บรรทัดใหม่ (ในทางทฤษฎีคือทดสอบโดยแทนที่100ด้วยบรรทัดใหม่110 1บรรทัดแทน)

สิ่งนี้ทำงานได้โดยการตั้งค่าiเป็นสตริง

00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001

(100 ศูนย์และ a 1; googol กลับด้าน) จากนั้น "ลบ 1" ซ้ำด้วยการแทนที่ regex และส่งออกบรรทัดใหม่จนกว่าสตริงจะเป็นศูนย์ทั้งหมด

พอร์ตของคำตอบ C ++ จะเป็น 49 ไบต์:

(f=n=>{for(i=10;i--;)n?f(n-1):console.log()})(99)

1
นี่คืออัจฉริยะ! ไม่ว่าจะเป็นหรือคุณเป็นผู้เชี่ยวชาญที่ Retina ซึ่งไม่จำเป็นต้องตัดออก "อัจฉริยะ" ...
Patrick Roberts

7

05AB1E , 6 ไบต์

Tn°F1?

คำอธิบาย

Tn°    # push 10^100
   F   # 10^100 times do
    1? # print 1

5
@MartinRosenau: โชคดีที่ 05AB1E ใช้จำนวนเต็ม 3 ไพ ธ อนซึ่งไม่มีขีด จำกัด
Emigna

1
@JanDvorak: ตามเอกสาร Python 3 ไม่มีการ จำกัด มูลค่าของจำนวนเต็มอีกต่อไป
Emigna

1
@JanDvorak: แน่นอน ฉันใช้ตัวเลขที่ค่อนข้างใหญ่โดยไม่มีปัญหา (ไม่ใช่เรื่องใหญ่) เราจะต้องจัดการ 1e100 ที่นี่และแม้ว่าหลามแน่นอนว่าสามารถจัดการ :)
Emigna

1
@JanDvorak ขนาดสูงสุดของจำนวนเต็ม Python ขึ้นอยู่กับปริมาณของหน่วยความจำที่มีอยู่ แต่เพียงผู้เดียว
Mego

4
ฉันได้รับถึงขีด จำกัด ก่อนหน้านี้ในขณะที่พยายามทำให้งงงวยเป็นเวลานาน เครื่องที่ฉันใช้นั้นสามารถจัดการกับตัวเลขที่มากกว่า 10 ^ 3000 ก่อนล้นจำนวนเต็ม
แยกผลไม้

6

Ruby, 20 ไบต์

(10**100).times{p 1}

พิมพ์ 1 ตามด้วยบรรทัดใหม่ 1E100 ครั้ง

1E100 ไม่ทำงานตามที่ประเมินเป็นทศนิยมไม่ใช่จำนวนเต็มความแม่นยำโดยพลการ


คุณสามารถลบวงเล็บได้หรือไม่?
OldBunny2800

1
@ OldBunny2800 ไม่ได้ลำดับความสำคัญเหนือผู้ประกอบการดังนั้นมันจะถูกตีความว่าเป็น10**(100.times{p 1})
ระดับแม่น้ำเซนต์

1
สำหรับผู้ที่มีความอยากรู้อยากเห็นให้1E100.to_iประเมินเป็น 10000000000000000000015902891109759918046836080856394528138978893275577478387721838772183877217038106081346998585686810104 ในคอมพิวเตอร์ของฉัน
Andrew Grimm

6

/// , 36 อักขระ ASCII (แตกต่างกัน 4 ตัว)

/t./.ttttt//.t/t\..........//t//t...

ส่งออก.อักขระ 3 * 10 ^ 125 ครั้งซึ่งหมายความว่ามันจะส่งออกสตริงที่ประกอบด้วย 3 * 10 ^ 25 ซ้ำของ.ตัวละคร 10 ^ 100 ครั้ง

คำอธิบาย:

  1. /t./.ttttt/: แทนที่t.ด้วย.tttttตลอดโปรแกรมที่เหลือทำซ้ำจนกว่าจะไม่มีอินสแตนซ์t.เหลืออยู่ สิ่งนี้แทนที่t...ด้วย...ตามด้วย 125 tวิ
  2. /.t/t\........../: แทนที่.tด้วยt..........ตลอดโปรแกรมที่เหลือทำซ้ำจนกว่าจะไม่มีอินสแตนซ์.tเหลืออยู่ นี้จะใช้เวลา...ตามด้วย 125 ts, และเปลี่ยนมันเป็น 125 ts ตามด้วย 10 ^ 125 ...การเกิดขึ้นของ
  3. /t//: ลบts ที่เหลือทั้งหมด
  4. t...: สิ่งนี้จะถูกแทนที่ด้วย 3 * 10 ^ 125 .s เอาท์พุทพวกเขา

ตอนนี้การแสดงผลซ้ำ 10 ^ 100 3 * 10 ^ 25 การทำซ้ำบางสิ่งบางอย่างที่รู้สึกเหมือนการโกง โปรแกรมนี้ให้ผลลัพธ์.อักขระ 10 ^ 100 ครั้งโดยใช้อักขระ 45 ASCII

/T/tttttttttt//.t/t..........//t//.TTTTTTTTTT

คำอธิบายของสิ่งนี้:

  1. /T/tttttttttt/: แทนที่Tด้วยttttttttttตลอดโปรแกรมที่เหลือ นี้แทนที่TTTTTTTTTTด้วย 100 tซ้ำของ
  2. /.t/t........../: แทนที่.tด้วยt..........ตลอดโปรแกรมที่เหลือ ซึ่งจะใช้เวลา.ตามด้วย 100 tวินาทีและเปลี่ยนเป็น 100 tวินาทีตามด้วย 10 ^ 100 .วินาที
  3. /t//: ลบts ที่เหลือทั้งหมด
  4. .TTTTTTTTTT: สิ่งนี้จะถูกแทนที่ด้วย 10 ^ 100 .s เอาท์พุทพวกเขา

สุดท้ายนี่คือโปรแกรมประนีประนอมซึ่งจะแสดงผล.ตัวอักษร 2 * 10 ^ 100 ครั้งโดยใช้ 40 ตัวอักษร:

/t./.tttttttttt//.t/t\..........//t//t..

6

Befunge 93, 33 bytes

1>01g0`#@!# _01v
d^.1 **52p10-1g<

น่าเสียดายที่ Befunge ไม่มีฟังก์ชั่นการใช้พลังงานดังนั้นรหัสเกือบทั้งหมดเป็นการนำเอาฟังก์ชั่นการใช้พลังงานมาใช้ ฉันยังคงทำสิ่งนี้อยู่

คำอธิบาย:

1 > 01g 0` #@!# _ 01g 1- 01p 25** 1. v
d ^                                  <

1: เริ่มจาก1ด้านซ้ายบนเพื่อว่าเมื่อเราคูณเราจะไม่ได้รับ0ทุกครั้ง

01g: รับตัวละครที่ตำแหน่ง (0, 1), ซึ่งคือd, ซึ่งรหัส ASCII คือ 100

0`: ดูว่าค่าที่เก็บใน (0, 1) มากกว่า 0 หรือไม่ ค่านี้จะเปลี่ยนแปลง

#@!# _: ตรรกะไม่ใช่!ค่าที่เราได้รับจากขั้นตอนสุดท้าย (0 หรือ 1) ดังนั้นถ้าเป็น 1 ตอนนี้เรามี 0 และเราสังเกตว่านั่น#หมายความว่าคุณข้ามอักขระถัดไปในรหัส

01g 1- 01p: นำค่าที่เก็บไว้ใน (0, 1) อีกครั้งลบ 1 จากมันและเก็บค่าใหม่นี้ที่ (0, 1)

25**: คูณค่าสูงสุดของสแต็กด้วย 10

1.: พิมพ์1ทุกครั้งที่ลูปนี้

1 ถูกพิมพ์ (ในทางทฤษฎี) ครั้ง googol แต่ที่วิ่งออกไปอย่างรวดเร็วของหน้าเว็บที่ฉันทดสอบนี้

คุณสามารถเรียกใช้ Befunge 93 รหัสที่นี่ ด้วยเหตุผลบางอย่างคุ้มค่าด้านบนของสแต็คคือเมื่อมันควรจะเป็น1.0000000000000006e+100 1.0e+100ฉันไม่รู้ว่า6มาจากไหนแต่ฉันไม่คิดว่ามันควรจะอยู่ตรงนั้นและมันอาจจะเป็นข้อผิดพลาดในการปัดเศษหรืออะไรทำนองนั้น


4

ABCR , 56 ไบต์

++++++++++AAAAAAAAAA7a*A!(x4bBBBBBBBBBB7b+B@(xa(Ax5b(Box

ผ้าใบ turingits สนุกโดยเฉพาะอย่างยิ่งเมื่อพวกเขาไม่มีการคูณหรือเลขชี้กำลังง่าย ๆ ในทางกลับกันฉันแค่ต้องการใช้สองในสามของคิว!

คำอธิบาย:

++++++++++                                             Set register to 10
          AAAAAAAAAA                                   Queue 10 to queue A 10 times
                    7a*A!(x                            Sum up all of queue A by:
                    7     x                             While the register is truthy:
                     a*                                 Dequeue two elements of A, sum them...
                       A                                ...and queue the result back to A.
                        !(                              If there's only one element left,
                                                        i.e. !(A.len - 1),
                                                        break from the loop.  A now has 100, our exponent.

                             4                        While A's front is truthy:
                              bBBBBBBBBBB              Clone the front of B 10 (our base) times.  (The first iteration fills it up with ten 1s)
                                         7b+B@(x       Sum up all of queue B like we did with A
                                                a(A    Decrement a (so that the loop actually ends. Runs 101 times like it should) x   

                                                       B now contains 10^100 only.

                                                   5b(B x   10^100 times:
                                                       o     print the front of queue A (0)

4

แบตช์574 242 ไบต์

@echo off
set t=for /l %%a in (2,1,33554432)do call:
set f=for /l %%a in (2,1,9765625)do call:
%t%a
:a
%t%b
:b
%t%c
:c
%t%d
:d
%f%e
:e
%f%f
:f
%f%g
:g
%f%h
:h
%f%i
:i
%f%j
:j
%f%k
:k
%f%l
:l
%f%m
:m
%f%n
:n
echo

แต่ละลูปจะผ่านดังนั้นจึงเรียกใช้การวนซ้ำเพิ่มเติม ลูปถูก จำกัด ที่ ~ 2³²เนื่องจากข้อ จำกัด จำนวนเต็ม 32 บิต สี่ลูปแรกแต่ละอันนับ2²⁵รวมเป็น2¹⁰⁰ในขณะที่อีกสิบลูปที่เหลือจะนับ 5 each แต่ละอันรวม5¹⁰⁰

แก้ไข: บันทึกเป็นไปไม่ได้ 58% ขอบคุณ @ ConorO'Brien



1
@ ConorO'Brien เดี๋ยวก่อนคุณทำได้เหรอ? ฉันไม่เคยรู้มาก่อน!
Neil

4

TI-Basic, 20 ไบต์

ซื่อตรง แสดงเพียงแปดบรรทัดในครั้งเดียวและบรรทัดก่อนหน้าไม่อยู่ในหน่วยความจำ เพราะᴇ100ได้รับการสนับสนุนเราต้องห่วงจากไป-ᴇ99 9ᴇ99จากนั้นถ้าI!=0แสดงสตริง (ซึ่งโดยวิธีคือ 3) ด้วยวิธีนี้เราจะพิมพ์ทุกᴇ100ครั้ง

For(I,-ᴇ99,9ᴇ99:If I:Disp 3:End

คุณแน่ใจหรือว่าตัวแปร "ฉัน" นั้นแม่นยำพอที่จะเก็บ 99 หลักได้หรือไม่
Martin Rosenau

เอาล่ะใช่ฉันควรจะพอที่จะถือไว้แม้ว่ามันจะแสดงถึง 14 เท่านั้นหากใช้ "Disp" แต่เราไม่ได้เอาท์พุทจริง ๆ ให้ตรวจสอบว่ามันไม่เท่ากับศูนย์ นอกจากนี้คุณถูกต้องเกี่ยวกับสัญลักษณ์ แต่ฉันคิดว่าคุณจะเข้าใจสิ่งที่ฉันหมายถึง ฉันจะคัดลอกที่ลงในโพสต์ของฉันตอนนี้
Timtech

ฉันไม่เคยพบ BASIC รุ่นหนึ่งที่มีจำนวนเต็มไม่ จำกัด แต่นั่นไม่สำคัญเท่ากับว่าลูปของคุณทำงานได้ไม่เพียงพอ
Loren Pechtel

1
อืมใช่ไม่มีจำนวนเต็มไม่มีที่นี่ จำนวนเต็มต้องอยู่ใน + -10 ^ 100
Timtech

4

ฟังก์ชั่นรหัสเครื่อง x86-64 ขนาด 30 ไบต์

ใช้ตรรกะการเรียกซ้ำเช่นเดียวกับคำตอบที่ C โดย @Level แม่น้ำเซนต์ (ความลึกสูงสุดของการเรียกซ้ำ = 100)

ใช้puts(3)ฟังก์ชั่นจาก libc ซึ่งไฟล์เอ็กซีคิ้วท์ปกติเชื่อมโยงกันอยู่แล้ว มันเรียกได้ว่าใช้ x86-64 System V ABI เช่นจาก C บน Linux หรือ OS X และไม่ได้ปิดบังการลงทะเบียนใด ๆ ที่ไม่ควรทำ


objdump -drwC -Mintel เอาท์พุทแสดงความคิดเห็นพร้อมคำอธิบาย

0000000000400340 <g>:  ## wrapper function
  400340:       6a 64                   push   0x64
  400342:       5f                      pop    rdi       ; mov edi, 100  in 3 bytes instead of 5
  ; tailcall f by falling into it.

0000000000400343 <f>:  ## the recursive function
  400343:       ff cf                   dec    edi
  400345:       97                      xchg   edi,eax
  400346:       6a 0a                   push   0xa
  400348:       5f                      pop    rdi       ; mov edi, 10
  400349:       0f 8c d1 ff ff ff       jl     400320 <putchar>   # conditional tailcall
; if we don't tailcall, then eax=--n = arg for next recursion depth, and edi = 10 = '\n'

  40034f:       89 f9                   mov    ecx,edi   ; loop count = the ASCII code for newline; saves us one byte


0000000000400351 <f.loop>:
  400351:       50                      push   rax       ; save local state
  400352:       51                      push   rcx
  400353:       97                      xchg   edi,eax   ; arg goes in rdi
  400354:       e8 ea ff ff ff          call   400343 <f>
  400359:       59                      pop    rcx       ; and restore it after recursing
  40035a:       58                      pop    rax
  40035b:       e2 f4                   loop   400351 <f.loop>
  40035d:       c3                      ret    
# the function ends here

000000000040035e <_start>:

0x040035e - 0x0400340 = 30 bytes

# not counted: a caller that passes argc-1 to f() instead of calling g
000000000040035e <_start>:
  40035e:       8b 3c 24                mov    edi,DWORD PTR [rsp]
  400361:       ff cf                   dec    edi
  400363:       e8 db ff ff ff          call   400343 <f>
  400368:       e8 c3 ff ff ff          call   400330 <exit@plt>    # flush I/O buffers, which the _exit system call (eax=60) doesn't do.

yasm -felf64 -Worphan-labels -gdwarf2 golf-googol.asm && gcc -nostartfiles -o golf-googol golf-googol.oสร้างขึ้นด้วย ฉันสามารถโพสต์ต้นฉบับของ NASM ได้ แต่นั่นดูเหมือนว่าจะยุ่งเหยิงเนื่องจากคำแนะนำของ asm อยู่ที่นั่นในการถอดชิ้นส่วน

putchar@pltอยู่ห่างจากน้อยกว่า 128 ไบต์jlดังนั้นฉันสามารถใช้การกระโดดแบบ 2 ไบต์สั้น ๆ แทนการกระโดดแบบ 6 ไบต์ใกล้ ๆ แต่นั่นเป็นความจริงในไฟล์ปฏิบัติการขนาดเล็กเท่านั้นไม่ใช่เป็นส่วนหนึ่งของโปรแกรมที่มีขนาดใหญ่กว่า ดังนั้นฉันไม่คิดว่าฉันจะพิสูจน์ได้ว่าไม่นับขนาดของการใช้งาน libc หากฉันใช้ประโยชน์จากการเข้ารหัส jcc แบบสั้นเพื่อเข้าถึง

การเรียกซ้ำแต่ละระดับใช้ 24B ของพื้นที่สแต็ก (2 pushes และที่อยู่ผู้ส่งเป็นแบบ CALL) ความลึกอื่น ๆ จะเรียกputcharด้วยสแต็คที่จัดเรียงตาม 8 เท่านั้นไม่ใช่ 16 ดังนั้นนี่จึงเป็นการละเมิด ABI การใช้งาน stdio ที่ใช้ร้านค้าที่มีการจัดแนวเพื่อหกลงทะเบียน xmm กับสแต็กจะเป็นความผิด แต่ glibc ก็putcharไม่ได้ทำเช่นนั้นเขียนไปที่ไปป์ที่มีบัฟเฟอร์เต็มหรือเขียนไปยังเทอร์มินัลที่มีการบัฟเฟอร์บรรทัด ทดสอบกับ Ubuntu 15.10 สิ่งนี้สามารถแก้ไขได้ด้วยการกด / จำลองแบบดัมมี่ใน.loop, เพื่อชดเชยสแต็กอีก 8 ก่อนการโทรซ้ำ


พิสูจน์ว่าพิมพ์บรรทัดใหม่จำนวนที่เหมาะสม:

   # with a version that uses argc-1  (i.e. the shell's $i)  instead of a fixed 100
$ for i in {0..8}; do echo -n "$i: "; ./golf-googol $(seq $i) |wc -c; done
0: 1
1: 10
2: 100
3: 1000
4: 10000
5: 100000
6: 1000000
7: 10000000
8: 100000000
... output = 10^n newlines every time.

รุ่นแรกของฉันคือ 43B และใช้puts()กับบัฟเฟอร์ของ 9 บรรทัดใหม่ (และยกเลิก 0 ไบต์) ดังนั้นการใส่จะผนวกที่ 10 กรณีฐานการเรียกซ้ำนั้นอยู่ใกล้กับแรงบันดาลใจ C มากขึ้น

แฟคตอริ่ง 10 ^ 100 วิธีที่แตกต่างกันอาจจะทำให้บัฟเฟอร์สั้นลงอาจถึง 4 บรรทัดใหม่ประหยัด 5 ไบต์ แต่การใช้ putchar ดีกว่า มันต้องการ ARG จำนวนเต็มเท่านั้นไม่ใช่ตัวชี้และไม่มีบัฟเฟอร์เลย มาตรฐาน C อนุญาตการใช้งานที่เป็นแมโครputc(val, stdout)แต่ใน glibc จะมีอยู่เป็นฟังก์ชันจริงที่คุณสามารถโทรจาก asm

การพิมพ์บรรทัดใหม่เพียงครั้งเดียวต่อการโทรแทน 10 หมายถึงเราจำเป็นต้องเพิ่มความลึกสูงสุดของการเรียกซ้ำ 1 เพื่อให้ได้ปัจจัยใหม่อีก 10 บรรทัด ตั้งแต่ 99 และ 100 ทั้งสองสามารถแสดงด้วยสัญญาณขยาย 8 บิตทันทีpush 100ยังคงเป็นเพียง 2 ไบต์

ยิ่งไปกว่านั้นการมี10การลงทะเบียนใช้งานได้ทั้ง newline และ loop counter ช่วยประหยัด byte

แนวคิดสำหรับการบันทึกไบต์

เวอร์ชัน 32 บิตสามารถบันทึกไบต์สำหรับdec ediแต่การเรียก stack-args (สำหรับฟังก์ชันไลบรารีเช่น putchar) ทำให้การโทรแบบหางทำงานได้ง่ายขึ้นน้อยลงและอาจต้องใช้ไบต์มากขึ้นในที่ต่างๆ ฉันสามารถใช้ระเบียบทะเบียน register-arg สำหรับไพรเวตf()เรียกโดยg()เท่านั้น แต่จากนั้นฉันไม่สามารถเรียก putchar (เพราะ f () และ putchar () จะใช้จำนวนสแต็ก args ที่แตกต่างกัน

เป็นไปได้ที่จะมี f () คงสถานะผู้โทรไว้แทนที่จะทำการบันทึก / กู้คืนในผู้โทร แต่นั่นอาจจะแย่เพราะมันอาจจะต้องแยกจากกันในแต่ละด้านของสาขาและไม่สามารถใช้งานร่วมกับ tailcalling ฉันลองแล้ว แต่ไม่พบการประหยัดใด ๆ

การรักษาตัวนับลูปบนสแต็ก (แทนที่จะกด / popping rcx ในลูป) ก็ไม่ได้ช่วยอะไรเช่นกัน มันแย่กว่ารุ่นที่ 1B ที่ใช้แล้วและอาจขาดทุนมากกว่ารุ่นนี้ที่ตั้งค่า rcx ให้ถูกกว่า


2
ไชโยสำหรับคำตอบการชุมนุม! :)

4

PHP, 44 ไบต์

for($i=bcpow(10,1e2);$i=bcsub($i,print 1););

ตัวอย่างนี้จะส่งออก1เวลา googol มันจะไม่หมดหน่วยความจำ แต่มันช้าชะมัด ฉันกำลังใช้ BCMath เพื่อให้สามารถจัดการจำนวนเต็มแบบยาวได้

ประสิทธิภาพดีขึ้นเล็กน้อย แต่ไม่เล็ก (74 ไบต์):

for($m=bcpow(10,100);$m;$m=bcsub($m,$a))echo str_repeat(a,$a=min(4e9,$m));

จะเอาท์พุทตัวอักษรagoogol ครั้ง มันจะใช้หน่วยความจำเกือบ 4GB, ส่งออกประมาณ 4e9 ตัวอักษรในแต่ละครั้ง


ถ้าเพียงแค่ 'a' ใช้เวลาเกือบ 4GB, 'aaa' จะทำอะไร? มันจะใช้รหัสเพิ่มเติม แต่ด้วย ob_flush (); คุณอาจไปไกลกว่านี้อีกมาก
Martijn

เอ่อไม่ใช่หนึ่งaมันคือสตริง 4 * 10 ^ 9 as ไม่มีทางที่จะไม่ไปเหนือ 4GB หากคุณกำลังใส่ 3 เท่าaในนั้น Ob_flush ไม่มีส่วนเกี่ยวข้องจุดสำคัญของตัวอย่างที่สองคือการส่งออกสตริงขนาดใหญ่ในครั้งเดียวแทนที่จะส่งออกอักขระจำนวนเล็กน้อยในแต่ละครั้งซึ่งส่งผลให้โปรแกรมทำงานได้เร็วขึ้นเล็กน้อยในราคาที่ใช้หน่วยความจำมากขึ้น
chocochaos

เท่าที่ฉันรู้ "> =" ไม่สามารถจัดการจำนวนเต็มขนาดใหญ่คุณควรใช้ bccomp
Crypto

คุณถูกต้องมันไม่ได้ให้ผลลัพธ์ที่ถูกต้องเมื่อเปรียบเทียบสตริง ฉันจะแก้ไขในไม่กี่นาที
chocochaos

แก้ไขด้วยวิธีการที่แตกต่างกันบ้าง แต่ใช้งานได้ดี :)
chocochaos


3

Pyke, 6 5 ไบต์

TTX^V

ลองที่นี่!

ไม่ได้ทดสอบเนื่องจากขัดข้องเบราว์เซอร์ของฉัน 4 ตัวอักษรแรกสร้าง 10 ^ 100 และVพิมพ์บรรทัดใหม่จำนวนมาก 100Vการทดสอบด้วย


3

แร็กเก็ต 36 ไบต์

(for((i(expt 10 100)))(display "1"))

เอาท์พุท:

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111...

3

JAISBaL ขนาด 4 ไบต์

˖Q

Chrome ไม่สามารถอ่านสัญลักษณ์ทั้งหมดและฉันไม่แน่ใจเกี่ยวกับเบราว์เซอร์อื่นดังนั้นนี่คือรูปภาพ:

คำอธิบาย:

# \# enable verbose parsing #\
10^100       \# [0] push 10^100 onto the stack #\
for          \# [1] start for loop #\
    space    \# [2] print a space #\

ค่อนข้างง่าย .... เพียงพิมพ์ช่องว่าง googol สามคำแนะนำ แต่ค่าคงที่ googol คือสองไบต์

(เขียนในเวอร์ชั่น 3.0.5)


นี่คือ 6 UTF-8 ไบต์ คุณใช้การเข้ารหัสแบบใด
Conor O'Brien

"ไบต์" ไม่เชื่อมโยงไป ...
เสวนาฟีนิกซ์

Gah ขอโทษ ฉันมี userscript ที่ทำให้ลิงค์ดูเหมือนข้อความปกติ
Conor O'Brien

โอ้ฉันไม่รู้ว่ามันเป็นไปได้โอเค :)
Socratic Phoenix

@ ConorO'Brien อืมทำไม?
Cyoce

3

JavaScript ES6, 85 83 ไบต์

บันทึก 2 ไบต์ด้วย ETHproductions!

eval([...Array(i=100)].map(_=>`for($${--i}=0;$${i}++<10;)`).join``+"console.log()")

พิมพ์บรรทัดใหม่ 1e100

ส่วนภายในสร้างโปรแกรมนี้ซึ่งจะถูกประเมินหลังจากนั้น

for($0=0;$0++<10;)for($1=0;$1++<10;)for($2=0;$2++<10;)for($3=0;$3++<10;)for($4=0;$4++<10;)for($5=0;$5++<10;)for($6=0;$6++<10;)for($7=0;$7++<10;)for($8=0;$8++<10;)for($9=0;$9++<10;)for($10=0;$10++<10;)for($11=0;$11++<10;)for($12=0;$12++<10;)for($13=0;$13++<10;)for($14=0;$14++<10;)for($15=0;$15++<10;)for($16=0;$16++<10;)for($17=0;$17++<10;)for($18=0;$18++<10;)for($19=0;$19++<10;)for($20=0;$20++<10;)for($21=0;$21++<10;)for($22=0;$22++<10;)for($23=0;$23++<10;)for($24=0;$24++<10;)for($25=0;$25++<10;)for($26=0;$26++<10;)for($27=0;$27++<10;)for($28=0;$28++<10;)for($29=0;$29++<10;)for($30=0;$30++<10;)for($31=0;$31++<10;)for($32=0;$32++<10;)for($33=0;$33++<10;)for($34=0;$34++<10;)for($35=0;$35++<10;)for($36=0;$36++<10;)for($37=0;$37++<10;)for($38=0;$38++<10;)for($39=0;$39++<10;)for($40=0;$40++<10;)for($41=0;$41++<10;)for($42=0;$42++<10;)for($43=0;$43++<10;)for($44=0;$44++<10;)for($45=0;$45++<10;)for($46=0;$46++<10;)for($47=0;$47++<10;)for($48=0;$48++<10;)for($49=0;$49++<10;)for($50=0;$50++<10;)for($51=0;$51++<10;)for($52=0;$52++<10;)for($53=0;$53++<10;)for($54=0;$54++<10;)for($55=0;$55++<10;)for($56=0;$56++<10;)for($57=0;$57++<10;)for($58=0;$58++<10;)for($59=0;$59++<10;)for($60=0;$60++<10;)for($61=0;$61++<10;)for($62=0;$62++<10;)for($63=0;$63++<10;)for($64=0;$64++<10;)for($65=0;$65++<10;)for($66=0;$66++<10;)for($67=0;$67++<10;)for($68=0;$68++<10;)for($69=0;$69++<10;)for($70=0;$70++<10;)for($71=0;$71++<10;)for($72=0;$72++<10;)for($73=0;$73++<10;)for($74=0;$74++<10;)for($75=0;$75++<10;)for($76=0;$76++<10;)for($77=0;$77++<10;)for($78=0;$78++<10;)for($79=0;$79++<10;)for($80=0;$80++<10;)for($81=0;$81++<10;)for($82=0;$82++<10;)for($83=0;$83++<10;)for($84=0;$84++<10;)for($85=0;$85++<10;)for($86=0;$86++<10;)for($87=0;$87++<10;)for($88=0;$88++<10;)for($89=0;$89++<10;)for($90=0;$90++<10;)for($91=0;$91++<10;)for($92=0;$92++<10;)for($93=0;$93++<10;)for($94=0;$94++<10;)for($95=0;$95++<10;)for($96=0;$96++<10;)for($97=0;$97++<10;)for($98=0;$98++<10;)for($99=0;$99++<10;)console.log()

ตอนนี้เพื่อพิสูจน์ความถูกต้องเราจะใช้การเหนี่ยวนำ Let 's แทนเริ่มต้น 100 ค่าอื่น ๆ ทั่วไปยังไม่มีข้อความ ฉันอ้างว่าการใส่Nจะให้บรรทัดใหม่10 N มารวมกันเป็นผลลัพธ์ของสิ่งนี้wc -lซึ่งนับจำนวนบรรทัดใหม่ในอินพุต เราจะใช้สคริปต์ที่แก้ไขแล้วนี้ แต่เทียบเท่าที่รับอินพุตN :

eval([...Array(+process.argv[2])].map(_=>`for($${i}=0;$${i++}++<10;)`,i=0).join``+"console.log()")

ตอนนี้เอาท์พุท:

C:\Users\Conor O'Brien\Documents\Programming
λ node googol.es6 1 | wc -l
10

C:\Users\Conor O'Brien\Documents\Programming
λ node googol.es6 2 | wc -l
100

C:\Users\Conor O'Brien\Documents\Programming
λ node googol.es6 3 | wc -l
1000

C:\Users\Conor O'Brien\Documents\Programming
λ node googol.es6 4 | wc -l
10000

เราจะเห็นว่าแปลงนี้การป้อนข้อมูลที่ไม่มีค่าขนาดเล็กถึง 10 ยังไม่มีการขึ้นบรรทัดใหม่

นี่คือตัวอย่างเอาต์พุตสำหรับN = 1:

C:\Users\Conor O'Brien\Documents\Programming
λ node googol.es6 1











C:\Users\Conor O'Brien\Documents\Programming
λ

ดี บันทึกสองสามไบต์ด้วยeval([...Array(i=100)].map(_=>`for($${--i}=0;$${i}++<10;)`).join``+"console.log()")
ETHproductions

@ ETHproductions ขอบคุณ! : D
Conor O'Brien

PS ฉันนับ 83 ไบต์;)
ETHproductions

อีกตัวอย่างหนึ่งที่นี่ ไม่แน่ใจว่าเป็นประโยชน์กับคนอื่นหรือไม่ แต่ฉันไม่แน่ใจว่าวิธีนี้ใช้ได้ผลและเขียนฟังก์ชัน wrapper สำหรับฟังก์ชัน eval'd เพื่อเล่นกับ คุณสามารถเห็นได้อย่างชัดเจนว่าโปรแกรมนับถึง 10 ^ n โดยที่ n คือจำนวนลูปที่ประเมิน ฉันตั้งเงื่อนไขการส่งคืนเพื่อให้มันแบ่งกันก่อน googol; เปลี่ยนตัวแปรที่ใช้ในเงื่อนไขนั้นเพื่อนับผ่านระดับลูปต่าง ๆ นอกจากนี้ nitpick: ตัวอย่างโค้ดที่สองของคุณแสดงวงนอกเป็น $ 0 ลดลงไปที่ $ 99 ควรกลับรายการโดยมี $ 99 เป็นวงวนนอก
MichaelS

@MichaelS จริง ฉันจะเปลี่ยนเป็นโอกาสต่อไปที่ฉันจะได้รับ
Conor O'Brien

3

Mathematica, 48 30 25 ไบต์

For[n=1,n++<Echo@1*^100,]

เอาท์พุท:

>> 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>> 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>> 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>> 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
>> 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
etc.

ไม่สามารถทดสอบได้ในตอนนี้ แต่จะเป็นFor[n=0,n++<10^100,Echo[]]อย่างไร
Martin Ender

ฉันจะพิจารณา>>ส่วนสำคัญของผลลัพธ์ พวกเขากำลังพิมพ์ถ้าคุณใช้Echoบนคอนโซล
Martin Ender

@MartinEnder อ๊ะคงที่
LegionMammal978

ประมาณEcho@0&~Array~10^100;21 ไบต์
Greg Martin

3

Fortran 95 แบบฟรีแบบวนซ้ำ 117 ไบต์

Program M
Call R(99)
END
Recursive Subroutine R(L)
IF(L)3,1,1
1 DO 2 I=1,10
2 Call R(L-1)
RETURN
3 PRINT*,0
END

พิมพ์ googol ของบรรทัดที่มี

          0

Fortran 90, แบบเรียกซ้ำ, 149 ไบต์

     CallR(99)
     END
     RecursiveSubroutineR(L)
     IF(L)3,1,1
   1 DO2I=1,10
   2 CallR(L-1)
     RETURN
   3 PRINT*,0
     END     

เรียกวนซ้ำซ้อนกัน 100 ลูปซ้ำแต่ละ 10 ซ้ำทำให้หนึ่ง googol N, L และตัวนับลูปทั้งหมดพอดีกับจำนวนเต็มขนาดไบต์

ทดสอบโดยแทนที่ 99 ด้วย 1, 2, 3, 4, 5 และสังเกตว่าในแต่ละกรณีการนับบรรทัดผลลัพธ์จาก "wc" มี n + 1 ศูนย์

Fortran II, IV, 66 หรือ 77, 231 bytes:

      N=2*10**9
      DO1I0=1,5**10
      DO1I=1,N
      DO1J=1,N
      DO1K=1,N
      DO1L=1,N
      DO1M=1,N
      DO1I1=1,N
      DO1J1=1,N
      DO1K1=1,N
      DO1L1=1,N
      DO1M1=1,N
1     PRINT2
2     FORMAT(X)
      END

พิมพ์ googol ของบรรทัดใหม่

โปรแกรมเหล่านี้ทั้งหมดจะทำงานบนเครื่อง 32- บิต; อันที่จริงเวอร์ชั่นเรียกซ้ำจะทำงานได้ดีบนเครื่อง 16 บิต เราสามารถใช้ลูปน้อยลงในเวอร์ชั่น brute-force โดยรันบน Cray เก่าด้วยจำนวนเต็ม 60 บิต ที่นี่สิบลูปซ้อนกัน 2 * 10 ^ 9 ในหนึ่งวงของ 5 ^ 10 (9765625) เท่ากับ 10 ^ 100 ซ้ำทั้งหมด

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

ตรวจสอบปัจจัยโดยการเปรียบเทียบ

bc<<<2000000000\^10*5\^10
bc<<<10\^100

3

ทัวริงเครื่องจำลองขนาด 1,082 ไบต์

0 * 6 r 1
1 * E r 2
2 * C r 3
3 * 1 r 4
4 * B r 5
5 * C r 6
6 * F r 7
7 * 4 r 8
8 * 6 r 9
9 * 8 r A
A * 8 r B
B * 3 r C
C * 0 r D
D * 9 r E
E * G r F
F * H r G
G * 8 r H
H * 0 r I
I * 6 r J
J * H r K
K * 9 r L
L * 3 r M
M * 2 r N
N * A r O
O * D r P
P * C r Q
Q * C r R
R * 4 r S
S * 4 r T
T * E r U
U * E r V
V * G r W
W * 6 r X
X * D r Y
Y * E r Z
Z * 0 r a
a * F r b
b * E r c
c * 9 r d
d * F r e
e * A r f
f * H r g
g * D r h
h * E r i
i * 6 r j
j * 6 r k
k * D r l
l * G r m
m * H r n
n * 1 r o
o * 0 r p
p * 8 r q
q * C r r
r * 9 r s
s * G r t
t * 3 r u
u * 6 r v
v * 2 r w
w * 3 r x
x * E r y
y * 0 r z
z * 4 r +
+ * 5 r /
/ * A r =
= * 0 r -
- * H r \
\ * 7 r !
! * A r @
@ * 9 r #
# * 5 r $
$ * A r %
% * B r ^
^ * 5 r &
& * 9 r ?
? * 4 r (
( * C r )
) * E r `
` * 9 r ~
~ * 9 r _
_ * A * .
. 0 I l *
. 1 0 r <
. 2 1 r <
. 3 2 r <
. 4 3 r <
. 5 4 r <
. 6 5 r <
. 7 6 r <
. 8 7 r <
. 9 8 r <
. A 9 r <
. B A r <
. C B r <
. D C r <
. E D r <
. F E r <
. G F r <
. H G r <
. I H r <
. _ * r ]
< _ * r >
< * * r *
> _ = l [
> * * r *
[ _ * l .
[ * * l *
] _ * * halt
] * _ r *

การจำลองเครื่องทัวริง

ฉันไม่ทราบว่าสิ่งนี้นับเป็นเอาท์พุทที่ถูกต้องหรือไม่เนื่องจากมีช่องว่างนำหน้า 82 ช่อง

ฉันไม่ทราบว่าสิ่งนี้เป็นไปตามขีด จำกัด 4 GB หรือไม่หากไม่เป็นเช่นนั้นก็ไม่ใช่การแข่งขันและเพื่อการแสดงเท่านั้น เอาต์พุตคือ 1e100 ไบต์ดังนั้นควรหักจากจำนวนหน่วยความจำไบต์ จำนวนไบต์สุดท้ายคือ 82 ไบต์

นี่คือคำอธิบาย:

80 บรรทัดแรกของรหัส 80 รัฐที่แตกต่างที่สร้างฐาน 19 16EC1BCF4688309GH806H932ADCC44EEG6DE0FE9FAHDE66DGH108C9G3623E045A0H7A95AB594CE99Aนับห่วง

โค้ด 19 บรรทัดถัดไปคือสถานะตัวนับซึ่งจะลดจำนวนทุกครั้งที่มีการพิมพ์อักขระ

ถัดไป 6 สายเป็นรัฐเครื่องพิมพ์ซึ่งผนวก=

สุดท้ายสุดท้าย 2 =====...=====สายคือรัฐทำความสะอาดที่มีความจำเป็นเพื่อให้แน่ใจว่าการส่งออกเพียงอย่างเดียวคือ ช่องว่างนำหน้า / ต่อท้ายจะไม่นับเป็นเอาท์พุทเนื่องจากเป็นผลข้างเคียงที่หลีกเลี่ยงไม่ได้

โปรแกรมจะหยุดทำงาน

1ฉันทำคณิตศาสตร์สำหรับสิ่งนั้น


2

Pyth, 7 ไบต์

ใหม่ (การแข่งขัน)

V^T*TTG

คำอธิบาย

G=The alphabet
Repeat 10^(10*10) times
    print(G)

เก่า (ไม่ใช่การแข่งขัน) 7 ไบต์

*G^T*TT

คำอธิบาย

G=The alphabet
G*(10^(10*10))==G*10^100

1
สิ่งนี้ไม่สอดคล้องกับขีด จำกัด ของหน่วยความจำ 4 GiB
เดนนิส

@Dennis ฉันแก้ไขแล้ว
Dignissimus - Spammy

ไม่ได้เป็นคำแนะนำการเล่นกอล์ฟ แต่ฉันไม่คิดว่า*TTใด ๆ 100ที่สั้นกว่าธรรมดา
Erik the Outgolfer

2

Python 3, 32 ไบต์

for i in range(10**100):print()

โซลูชันสำรอง 33 ไบต์:

[print()for i in range(10**100)]

ใน Python 2 นี่เป็นคำตอบที่ยอดเยี่ยมเป็นพิเศษ

1
ไม่มาก @ Lembik ในหลาม 2 range(10**100)สร้างรายการของตัวเลขซึ่งส่งผลให้[1, 2, 3, 4, ...] OverflowError: range() result has too many itemsสิ่งนี้จะทำงานใน Python 2 โดยมีการเรียกใช้xrange()แทนและทำงานใน Python 3 ตั้งแต่xrange()เปลี่ยนชื่อเป็นrange()และต้นฉบับrange()ที่สร้างรายการไม่ได้รับการสนับสนุน
James Murphy

2
@JamesMurphyb ใช่ฉันรู้แล้ว ฉันพยายามที่จะตลกเกี่ยวกับการตอบสนองของ codegolf ที่ทำไม่ได้

1
ขอโทษ ฉันมีปัญหาในการอ่านอารมณ์ขันในความคิดเห็น SE จำนวนมาก
James Murphy

2

Java, 198 179 155 ไบต์

import java.math.*;class a{void A(a[]x){for(BigInteger b=BigInteger.ZERO;!(b=b.add(BigInteger.ONE)).equals(BigInteger.TEN.pow(100));)System.out.print(x);}}

พิมพ์ ( x== null? null: สตริงที่เริ่มต้นด้วย[La;@หรือสิ่งที่ต้องการ) 10 100ครั้งใน O (ตลอดไป) เวลา


3
คุณมีclassแต่ไม่มีpublic static void main(String[]a)วิธี สำหรับเคล็ดลับการเล่นกอล์ฟ: คุณสามารถแทนที่new BigInteger("0"), new BigInteger("1")และnew BigInteger("10")ด้วยBigInteger.ZERO, BigInteger.ONEและBigInteger.TEN; คุณสามารถแทนที่ด้วยimport java.math.BigInteger; import java.math.*;
Kevin Cruijssen

1
ไม่จำเป็นต้องนำเข้า: สิ่งที่คล้ายกับสิ่งนี้ควรใช้งานได้:java.math.BigInteger b=null;for(b=b.ZERO;!(b=b.add(b.ONE)).equals(b.TEN.pow(100);)System.out.print(x);
Olivier Grégoire

@ OlivierGrégoireนั่นทำให้ฉันมี NullReferenceException ซึ่งอาจเป็นเพราะbnull
Xanderhall

@Xanderhall คุณอาจลองใช้ C # (เพราะคุณพูดว่า NRE ไม่ใช่ NPE) ฉันไม่สามารถทดสอบเวอร์ชัน Java ได้ในขณะนี้ดังนั้นฉันไม่สามารถบอกได้ว่ามีอะไรผิดปกติ ไม่ว่าในกรณีใดฉันพูดว่า "ควรจะทำงาน" ไม่ใช่ "จะทำงาน" ความคิดที่จะใช้คือคุณสามารถมีวิธีการคงที่เรียกร้องในการอ้างอิงเช่นแม้เป็นโมฆะ
Olivier Grégoire

@ OlivierGrégoireฉันลองใช้ Java แล้ว ฉันไม่ได้รหัสใน C #
Xanderhall

2

Java, 153 ไบต์

import java.math.*;interface M{static void main(String[]a){for(BigInteger i=BigInteger.ZERO;!i.add(i.ONE).equals(i.TEN.pow(100));)System.out.print(1);}}

ผลลัพธ์: 1e100 1 วินาที

ฉันรู้ว่ามีคำตอบ Java อื่นซึ่งใกล้สวย ของฉันมีหลักและยังคงสั้นกว่า

นี่คือรายการรหัสกอล์ฟครั้งแรกของฉัน เคล็ดลับชื่นชม


สิ่งนี้สามารถเล่นกอล์ฟได้ถึง 117 ไบต์โดยใช้แลมบ์ดา อย่างไรก็ตามคุณยังจำเป็นต้องรวมการนำเข้า import java.math.*;()->{for(BigInteger i=BigInteger.ZERO;!i.add(i.ONE).equals(i.TEN.pow(100));)System.out.print(1);};
Shaun Wild

@BasicallyAlanTuring จริง ๆ แล้วฉันjavacจะไม่ให้ฉันรวบรวมนี้
Niclas M

อัปเดต Java ของคุณแล้ว นอกจากนี้รหัสนี้ยังไม่สมบูรณ์ เพียงแค่ขั้นต่ำเปล่าอนุญาตให้เข้าได้
Shaun Wild

@BasicallyAlanTuring Got Java 8 ฉันเดาว่าฟังก์ชั่นไม่ได้รับอนุญาตจาก OP
Niclas M

รหัสที่ฉันให้แก่คุณไม่ใช่โปรแกรมที่สมบูรณ์ .. มันเป็นเพียงสิ่งที่จำเป็นสำหรับคำตอบ CG ที่ถูกต้อง
Shaun Wild

2

Pyth, 8 7 ไบต์

V^T100G

ลิงค์

โซลูชันทดสอบด้วยเอาต์พุตขนาดเล็ก แต่ควรพิมพ์abcdefghijklmnopqrstuvwxyz1e100 ครั้ง

ด้วยเหตุผลบางอย่างที่pเป็นที่ไม่จำเป็นเช่น 31343 (Maltysen) กล่าวว่า


ทำไมต้อง p?
Maltysen

@ Maltysen ฉันคิดว่าเพราะขีด จำกัด 4 GB
Erik the Outgolfer

ทำไม? cuz ของบัฟเฟอร์? นั่นไม่ได้ล้างโดยอัตโนมัติหรือไม่
Maltysen

@Maltysen ฉันไม่ทราบว่าล่ามออนไลน์ไม่มีฟังก์ชันส่งออกทันที มันอาจจะล้างออกมันอาจไม่ ...
Erik the Outgolfer

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