สร้างคอมไพเลอร์ระเบิด


372

บทนำ

คุณอาจคุ้นเคยกับzip bombs , XML bombsและอื่น ๆ กล่าวง่ายๆคือมันเป็นไฟล์ขนาดเล็ก (ค่อนข้าง) ซึ่งให้ผลลัพธ์มหาศาลเมื่อตีความโดยซอฟต์แวร์ไร้เดียงสา ความท้าทายที่นี่คือการใช้คอมไพเลอร์ในทางที่ผิด

ท้าทาย

เขียนซอร์สโค้ดที่มีขนาด 512 ไบต์หรือน้อยกว่าและคอมไพล์ลงในไฟล์ที่มีพื้นที่ว่างมากที่สุด ไฟล์ที่ส่งออกที่ใหญ่ที่สุดชนะ!

กฎระเบียบ

ตกลงดังนั้นจึงมีคำอธิบายคำจำกัดความและข้อ จำกัด ที่สำคัญบางประการ

  • ผลลัพธ์ของการคอมไพล์ต้องเป็นไฟล์ELF , Windows Portable Executable (.exe), หรือ bytecode เสมือนสำหรับ JVM หรือ CLR ของ. Net (CLTC เสมือนจริงประเภทอื่น ๆ ก็น่าจะตกลงถ้าถาม) อัปเดต: เอาต์พุตของ Python .pyc / .pyo ก็มีผลเช่นกัน
  • หากภาษาที่คุณเลือกไม่สามารถรวบรวมได้โดยตรงในรูปแบบใดรูปแบบหนึ่งก็อนุญาตให้ทำการ transpilation ตามด้วยการคอมไพล์ได้ด้วย ( อัปเดต: คุณสามารถ transpile ได้หลายครั้งตราบใดที่คุณไม่เคยใช้ภาษาเดียวกันมากกว่าหนึ่งครั้ง )
  • ซอร์สโค้ดของคุณอาจประกอบด้วยไฟล์หลายไฟล์และแม้แต่ไฟล์ทรัพยากร แต่ขนาดรวมของไฟล์เหล่านี้ต้องไม่เกิน 512 ไบต์
  • คุณไม่สามารถใช้อินพุตอื่นนอกเหนือจากไฟล์ต้นฉบับและไลบรารี่มาตรฐานของภาษาที่คุณเลือก การเชื่อมโยงคงที่ห้องสมุดมาตรฐานก็โอเคเมื่อได้รับการสนับสนุน ไม่มีไลบรารีบุคคลที่สามหรือไลบรารี OS
  • ต้องเป็นไปได้ที่จะเรียกใช้การคอมไพล์ของคุณโดยใช้คำสั่งหรือชุดคำสั่ง หากคุณต้องการที่เฉพาะเจาะจงธงเมื่อรวบรวมเหล่านี้นับรวมในวงเงินไบต์ของคุณ (เช่นหากสายการคอมไพล์ของคุณคือgcc bomb.c -o bomb -O3 -lmการ-O3 -lmมีส่วนร่วม (7 bytes) จะถูกนับ (หมายเหตุพื้นที่ชั้นนำเริ่มต้นจะไม่นับ)
  • ตัวประมวลผลล่วงหน้าอนุญาตเฉพาะในกรณีที่เป็นตัวเลือกการรวบรวมมาตรฐานสำหรับภาษาของคุณ
  • สภาพแวดล้อมขึ้นอยู่กับคุณ แต่เพื่อประโยชน์ในการตรวจสอบนี้โปรดยึดตามเวอร์ชั่นล่าสุดของคอมไพเลอร์และระบบปฏิบัติการ (และมีการระบุอย่างชัดเจนว่าคุณกำลังใช้)
  • มันจะต้องรวบรวมโดยไม่มีข้อผิดพลาด (คำเตือนก็โอเค) และการล่มของคอมไพเลอร์จะไม่นับรวมทุกอย่าง
  • สิ่งที่โปรแกรมของคุณทำไม่เกี่ยวข้องจริง ๆแม้ว่ามันจะไม่เป็นอันตรายอะไรก็ตาม มันไม่จำเป็นต้องเริ่มด้วยซ้ำ

ตัวอย่างที่ 1

โปรแกรม C

main(){return 1;}

คอมไพล์ด้วยApple LLVM version 7.0.2 (clang-700.1.81)บน OS X 10.11 (64 บิต):

clang bomb.c -o bomb -pg

สร้างไฟล์ขนาด 9228 ไบต์ ขนาดแหล่งที่มาทั้งหมดคือ 17 +3 (สำหรับ-pg) = 20 ไบต์ซึ่งเป็นขนาดที่ จำกัด ได้ง่าย

ตัวอย่างที่ 2

โปรแกรม Brainfuck:

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

transpiled ด้วยawibถึง c ด้วย:

./awib < bomb.bf > bomb.c

คอมไพล์แล้วด้วยApple LLVM version 7.0.2 (clang-700.1.81)บน OS X 10.11 (64 บิต):

clang bomb.c

สร้างไฟล์ 8464 ไบต์ อินพุตทั้งหมดที่นี่คือ 143 ไบต์ (เนื่องจาก@lang_cเป็นค่าเริ่มต้นสำหรับ awib ซึ่งไม่จำเป็นต้องเพิ่มลงในไฟล์ต้นฉบับและไม่มีแฟล็กพิเศษสำหรับคำสั่งใดคำสั่งหนึ่ง)

โปรดทราบว่าในกรณีนี้ไฟล์ bomb.c ชั่วคราวคือ 802 ไบต์ แต่สิ่งนี้นับรวมทั้งขนาดแหล่งข้อมูลและขนาดเอาต์พุต

หมายเหตุสุดท้าย

หากการส่งออกมากกว่า 4GB จะประสบความสำเร็จ (บางทีถ้าใครพบทัวริง preprocessor สมบูรณ์) การแข่งขันก็จะเป็นแหล่งที่มีขนาดเล็กที่สุดซึ่งเป็นผู้ผลิตไฟล์อย่างน้อยขนาดว่า (มันเป็นเพียงไม่ปฏิบัติเพื่อทดสอบการส่งที่ได้รับมากเกินไปขนาดใหญ่) .


หากใช้ transpiler ซอร์สโค้ดจำเป็นต้องมีขนาดไม่เกิน 512 ไบต์และรหัสแหล่งอินพุตหรือไม่?
trichoplax

3
อนุญาตให้ทำซ้ำการถ่ายซ้ำได้หรือไม่
orlp

3
@ LegionMammal978 ใช่มีการสร้างหนึ่งในประเภทไฟล์ที่ฉันระบุ แต่ถ้าคุณคิดว่าคุณพบบางสิ่งที่เป็นเครื่องเสมือนมากกว่าการตีความภาษาให้ถามเกี่ยวกับมันโดยเฉพาะและเป็นไปได้ว่าฉันจะยอมให้มัน (มันเป็นอัตนัยเล็กน้อย ของการเปิดมันขึ้นมา)
เดฟ

3
@trichoplax ฉันไม่ทราบว่า แต่จากการอ่านบางอย่างดูเหมือนว่าใช่; การคอมไพล์ไปยัง Python bytecode มีความสำคัญอย่างยิ่ง ดังนั้นสำหรับไพ ธ อนขนาดเอาต์พุตจะเป็นขนาดผลรวมรวมของไฟล์ pyc / pyo ทั้งหมดของคุณ ฉันจะอัปเดตคำถามในไม่ช้าด้วยการอัปเดตตามความคิดเห็นเหล่านี้
Dave

2
@MartinRosenau - WGroleau ได้ถามคำถามที่คล้ายกัน เป็นมาตรฐานในการเขียนโปรแกรมความท้าทายที่คุณสามารถใช้สิ่งที่มีอยู่แล้วเมื่อความท้าทายเริ่มต้นขึ้น
เดฟ

คำตอบ:


441

C, (14 + 15) = 29 ไบต์, 17,179,875,837 (16 GB) ปฏิบัติการได้ไบต์

ขอบคุณ @viraptor สำหรับการปิด 6 ไบต์

ขอบคุณ @hvd สำหรับ 2 ไบต์และขนาด x4 ที่สามารถเรียกใช้งานได้

สิ่งนี้นิยามmainฟังก์ชันเป็นอาร์เรย์ขนาดใหญ่และเริ่มต้นองค์ประกอบแรก สิ่งนี้ทำให้ GCC เก็บอาร์เรย์ทั้งหมดในการปฏิบัติการที่เกิดขึ้น

เนื่องจากอาร์เรย์นี้มีขนาดใหญ่กว่า 2GB เราจึงต้องระบุการ-mcmodel=mediumตั้งค่าสถานะให้กับ GCC 15 ไบต์พิเศษเพิ่มเติมจะรวมอยู่ในคะแนนตามกฎ

main[-1u]={1};

อย่าคาดหวังว่ารหัสนี้จะทำสิ่งที่ดีเมื่อทำงาน

รวบรวมกับ:

gcc -mcmodel=medium cbomb.c -o cbomb

ฉันใช้เวลาสักครู่เพื่อทดสอบการแนะนำของ @ hvd - และหาเครื่องที่มีน้ำผลไม้เพียงพอที่จะจัดการกับมัน ในที่สุดฉันก็พบ RedHat 5.6 ที่ไม่ใช่การผลิตแบบเก่ากับ VM 10GB RAM, 12GB swap และ / tmp ถูกตั้งค่าเป็นพาร์ติชั่นโลคัลขนาดใหญ่ รุ่น GCC คือ 4.1.2 เวลาในการรวบรวมทั้งหมดประมาณ 27 นาที

เนื่องจาก CPU และโหลด RAM, ฉันแนะนำต่อการทำเช่นนี้รวบรวมบนเครื่องการผลิตที่เกี่ยวข้องใด



13
ฉันเล่นกับวิธีการแก้ปัญหาของฉันที่นี่ แต่ ... aคุณไม่จำเป็นต้อง คุณสามารถใช้main[1<<30]={1};
viraptor

38
พุทโธ่. นี่คือความชั่วร้าย X แช่แข็งเป็นเวลาหลายนาทีเพื่อพยายามรวบรวมรหัสนั้น ฉันเริ่มมองหาคอมพิวเตอร์เครื่องอื่นที่อาจจะกลับไปที่ ssh และฆ่ากระบวนการ gcc ก่อนที่มันจะกลับมามีชีวิตอีกครั้ง Btw หากคุณต้องการค่าที่มากกว่า1<<30นั้น7<<28อาจเป็นตัวเลือก
kasperd

33
> 4GB? ที่เพิ่มขึ้นอย่างรวดเร็ว
Wayne Werner

18
ในกรณีที่คนอื่นสงสัยว่าทำไมการรวบรวมนี้: stackoverflow.com/questions/34764796/…
TC

206

C # ประมาณ 1 นาทีในการคอมไพล์ไบนารีเอาต์พุต 28MB:

class X<A,B,C,D,E>{class Y:X<Y,Y,Y,Y,Y>{Y.Y.Y.Y.Y.Y.Y.Y.Y y;}}

การเพิ่ม Y มากขึ้นจะเป็นการเพิ่มขนาดแบบเอ็กซ์โพเนนเชียล

คำอธิบายโดย Pharap ตามคำขอของ @Odomontois:

คำตอบนี้เป็นการเหยียดหยามการสืบทอดและพารามิเตอร์ชนิดเพื่อสร้างการเรียกซ้ำ เพื่อให้เข้าใจถึงสิ่งที่เกิดขึ้นง่ายขึ้นในการทำให้ปัญหาง่ายขึ้น พิจารณาclass X<A> { class Y : X<Y> { Y y; } }ซึ่งจะสร้างชั้นทั่วไปซึ่งมีระดับชั้นX<A> สืบทอดจึงยังมีระดับชั้นซึ่งเป็นแล้ว สิ่งนี้ยังมีคลาสภายในและคลาสภายในนั้นมีคลาสชั้นในฯลฯ ซึ่งหมายความว่าคุณสามารถใช้การแก้ปัญหาขอบเขต ( ) infinitum โฆษณาและทุกครั้งที่คุณใช้คอมไพเลอร์จะต้องอนุมานอีกระดับของการสืบทอดและพารามิเตอร์ประเภท .YX<A>.YX<Y>X<A>.YYX<A>.Y.YYYY.

โดยการเพิ่มพารามิเตอร์ประเภทเพิ่มเติมงานที่คอมไพเลอร์ต้องทำในแต่ละขั้นตอนจะเพิ่มขึ้นอีก

พิจารณากรณีต่อไปนี้
ในclass X<A> { class Y : X<Y> { Y y;} }ประเภทพระรามมีประเภทของA ในประเภทพระรามมีประเภทของ ในประเภทพระรามมีประเภทของ ในประเภทพระรามเป็นและเป็น ในประเภทพระรามเป็นและเป็น ในประเภทพระรามเป็นและเป็นX<A>.Y
class X<A> { class Y : X<Y> { Y.Y y;} }AX<X<A>.Y>.Y
class X<A> { class Y : X<Y> { Y.Y.Y y;} }AX<X<X<A>.Y>.Y>.Y
class X<A,B> { class Y : X<Y,Y> { Y y;} }AX<A,B>.YBX<A,B>.Y
class X<A> { class Y : X<Y> { Y.Y y;} }AX<X<A,B>.Y, X<A,B>.Y>.YBX<X<A,B>.Y, X<A,B>.Y>.Y
class X<A> { class Y : X<Y> { Y.Y.Y y;} }AX<X<X<A,B>.Y, X<A,B>.Y>.Y, X<X<A,B>.Y, X<A,B>.Y>.Y>.YBX<X<X<A,B>.Y, X<A,B>.Y>.Y, X<X<A,B>.Y, X<A,B>.Y>.Y>.Y

ต่อไปนี้รูปแบบนี้เพียงคนเดียวที่สามารถจินตนาการ1การทำงานของคอมไพเลอร์จะต้องทำอย่างไรเพื่อที่จะอนุมานสิ่งAที่จะEอยู่ในในความหมายY.Y.Y.Y.Y.Y.Y.Y.Yclass X<A,B,C,D,E>{class Y:X<Y,Y,Y,Y,Y>{Y.Y.Y.Y.Y.Y.Y.Y.Y y;}}

1คุณสามารถหาคำตอบได้ แต่คุณต้องใช้ความอดทนเป็นอย่างมากและ Intellisense จะไม่ช่วยคุณที่นี่


14
นี่เป็นเหมือนความบ้าที่ฉันคาดไว้! ดูเหมือนว่าฉันจะออกไปติดตั้งโมโน…
เดฟ

31
คุณสามารถให้คำอธิบายเกี่ยวกับผลกระทบที่มีชื่อเสียงดังกล่าวได้หรือไม่?
Odomontois

16
+1 สำหรับการทำมากกว่าการเริ่มต้นอาร์เรย์ขนาดใหญ่
เฮมเมอร์

6
นี่คือตัวอย่างการใช้ลองโรสลินและเพียงแค่ 3Yวินาที
Kobi

10
ฉันเห็นคำถามนี้และคิดถึงคุณทันที ดี!
Eric Lippert

154

Python 3, 13 byte source, 9,057,900,463 byte (8.5GiB) .pyc-file

(1<<19**8,)*2

แก้ไข : เปลี่ยนรหัสเป็นเวอร์ชันด้านบนหลังจากที่ฉันรู้ว่ากฎบอกว่าขนาดเอาต์พุตเกิน 4GiB ไม่สำคัญและรหัสสำหรับขนาดนี้จะสั้นกว่านี้เล็กน้อย รหัสก่อนหน้า - และที่สำคัญกว่านั้นคือคำอธิบายสามารถดูได้ที่ด้านล่าง


Python 3, 16 byte source,> 32TB .pyc-file (หากคุณมีหน่วยความจำเพียงพอ, พื้นที่ดิสก์และความอดทน)

(1<<19**8,)*4**7

คำอธิบาย: Python 3 ทำการพับอย่างต่อเนื่องและคุณจะได้ตัวเลขจำนวนมากอย่างรวดเร็วด้วยการยกกำลัง รูปแบบที่ใช้โดยไฟล์. pyc เก็บความยาวของการแทนค่าจำนวนเต็มโดยใช้ 4 ไบต์และในความเป็นจริงแล้วขีด จำกัด ดูเหมือนจะเป็นเช่น2**31นั้นดังนั้นการใช้เลขชี้กำลังเพื่อสร้างเลขจำนวนมากจะมีขีด จำกัด ที่ดูเหมือนว่าจะสร้าง 2GB ไฟล์ pyc จากแหล่งที่มา 8 ไบต์ ( 19**8ค่อนข้างขี้อาย8*2**31ดังนั้น1<<19**8มีการแสดงไบนารีเพียงแค่ภายใต้ 2GB; การคูณด้วยแปดเป็นเพราะเราต้องการไบต์ไม่ใช่บิต)

อย่างไรก็ตามสิ่งอันดับยังไม่เปลี่ยนรูปและคูณ tuple ยังคงพับเพื่อให้เราสามารถทำซ้ำที่ 2GB หยดหลายครั้งตามที่เราต้องการที่เพิ่มขึ้นอย่างน้อย2**31ครั้งอาจ การ4**7ได้รับไปที่ 32TB นั้นถูกเลือกเพียงเพราะมันเป็นเลขชี้กำลังแรกที่ฉันพบว่าเอาชนะคำตอบ 16TB ก่อนหน้านี้

โชคไม่ดีที่ฉันมีหน่วยความจำในคอมพิวเตอร์ของฉันเองฉันสามารถทดสอบได้เพียง 2 ตัวคูณเท่านั้นนั่นคือ (1<<19**8,)*2ซึ่งสร้างไฟล์ 8.5GB ซึ่งฉันหวังว่าจะแสดงให้เห็นว่าคำตอบนั้นเป็นจริง (เช่นขนาดไฟล์ไม่ จำกัด ที่ 2 ** 32 = 4GB)

นอกจากนี้ฉันไม่รู้ว่าทำไมขนาดไฟล์ที่ฉันได้รับเมื่อทำการทดสอบคือ 8.5GB แทนที่จะเป็น 4GB-ish ที่ฉันคาดไว้และไฟล์มีขนาดใหญ่พอที่ฉันไม่รู้สึกอยากจะแหย่มันในตอนนี้


2
+1 แต่ทำไม(1<<19**8,)*2ล่ะ 4GB ก็เพียงพอแล้ว
Akangka

2
@ChristianIrwan: ใช่ฉันลืมกฎนั้นเพิ่งรู้เมื่อไม่กี่นาทีที่ผ่านมาและยังไม่ได้คิดว่าฉันควรจะแก้ไขอะไร :-)
Aleksi Torhamo

1
ดี เนื่องจากนี่เป็นเพียง 13 ไบต์ในที่สุดเราก็มีผู้ท้าชิงคำตอบแรก! ฉันสามารถยืนยัน1<<18บนเครื่องของฉันเท่านั้น (1.5GB) แต่ฉันจะทดสอบบน linux ในภายหลังซึ่งฉันคาดว่ามันจะทำงานกับ 8GB เต็มรูปแบบ (จะไม่ลองรุ่น 32TB!)
เดฟ

1
@Dave: ขนาดที่แน่นอนอาจขึ้นอยู่กับรุ่น (1.5GB ฟังดูแปลก ๆ ไม่ว่าจะเป็นอะไร) ฉันใช้ Python 3.3.5 และใช้python -m py_compile asd.pyในการสร้างไฟล์. pyc
Aleksi Torhamo

3
IIRC, python ใช้ 30 บิตต่อคำ 32- บิตในการแทนจำนวนเต็ม

130

หากการส่งออกมากกว่า 4GB ประสบความสำเร็จ (อาจจะมีใครบางคนพบว่าตัวประมวลผลสมบูรณ์ก่อน) การแข่งขันจะเป็นแหล่งที่เล็กที่สุดซึ่งสร้างไฟล์ที่มีขนาดอย่างน้อยที่สุดนั้น .

"เทมเพลต Haskell" อนุญาตให้สร้างรหัส Haskell ในเวลาคอมไพล์โดยใช้ Haskell ดังนั้นจึงเป็นตัวประมวลผลล่วงหน้าที่สมบูรณ์

นี่คือความพยายามของฉันซึ่งแปรตามนิพจน์ตัวเลขโดยพลการFOO:

import Language.Haskell.TH;main=print $(ListE .replicate FOO<$>[|0|])

ความมหัศจรรย์คือรหัสภายใน $(...)"ประกบ" สิ่งนี้จะถูกดำเนินการในเวลาคอมไพล์เพื่อสร้าง Haskell AST ซึ่งจะถูกต่อกิ่งเข้ากับ AST ของโปรแกรมแทนการประกบกัน

ในกรณีนี้เราทำให้ AST ง่ายเป็นตัวแทนของตัวอักษร0ที่เราทำซ้ำFOOครั้งที่จะทำรายการแล้วเราใช้ListEจากLanguage.Haskell.THโมดูลที่จะเปิดรายการนี้ลงใน asts AST [0, 0, 0, 0, 0, ...]ขนาดใหญ่ที่เป็นตัวแทนของตัวอักษร

โปรแกรมดังกล่าวเทียบเท่ากับmain = print [0, 0, 0, ...]กับการเกิดซ้ำของFOO0

วิธีรวบรวม ELF:

$ ghc -XTemplateHaskell big.hs
[1 of 1] Compiling Main             ( big.hs, big.o )
Linking big ...
$ file big
big: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /nix/store/mibabdfiaznqaxqiy4bqhj3m9gaj45km-glibc-2.21/lib/ld-linux.so.2, for GNU/Linux 2.6.32, not stripped

นี้น้ำหนักในที่ 83 ไบต์ (66 สำหรับรหัส Haskell และ 17 สำหรับ-XTemplateHaskellอาร์กิวเมนต์) FOOบวกความยาวของ

เราสามารถหลีกเลี่ยงข้อโต้แย้งของคอมไพเลอร์และเรียบเรียงด้วยghcแต่เราต้องใส่{-# LANGUAGE TemplateHaskell#-}จุดเริ่มต้นซึ่งกระแทกรหัสได้ถึง 97 ไบต์

นี่คือตัวอย่างของนิพจน์FOOและขนาดของไบนารีผลลัพธ์:

FOO         FOO size    Total size    Binary size
-------------------------------------------------
(2^10)      6B          89B           1.1MB
(2^15)      6B          89B           3.6MB
(2^17)      6B          89B           12MB
(2^18)      6B          89B           23MB
(2^19)      6B          89B           44MB

ฉันใช้ RAM ที่คอมไพล์(2^20)แล้ว

นอกจากนี้เรายังสามารถสร้างรายการที่ไม่มีที่สิ้นสุดใช้repeatแทนreplicate FOOแต่นั่นทำให้คอมไพเลอร์หยุดทำงาน;)


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

3
@ wizzwizz4: ใช่มันเป็นคำตอบที่ยอดเยี่ยม โดยพื้นฐานแล้วมันเหมือนกับของฉันยกเว้นว่าใน Haskell ต้องมีคำสั่งคอมไพเลอร์พิเศษเพื่อให้การทำงานของโปรแกรม ;)
Mason Wheeler

2
เมื่อฉันรวบรวม GHC 7.8.3 ฉันได้รับ "ไม่อยู่ในขอบเขต: '<$>'" (ฉันตั้งรหัสเป็น[...].replicate (2^10)<$>[|0|])) ฉันไม่เคยมีประสบการณ์กับ Haskell มีคำแนะนำในการทำคอมไพล์นี้อย่างไร?
เดฟ

38
เทมเพลตที่แย่มาก Haskell นั้นไม่ได้ขี้เกียจพอที่จะสตรีมไฟล์ที่เรียกใช้งานได้ไม่ จำกัด
PyRulez

1
สวัสดี @Dave <$>ฟังก์ชั่นที่ใช้กันอย่างแพร่หลายใน Haskell แต่ถูกย้ายไปที่ "โหมโรง" (ชุดของฟังก์ชั่นที่มีอยู่เป็นค่าเริ่มต้น) ใน GHC 7.10 สำหรับรุ่นก่อนหน้าคุณจะต้องเพิ่มimport Control.Applicative;หลังจากimportคำสั่งที่มีอยู่ ฉันเพิ่งลองกับ GHC 7.8.4 และใช้งานได้
Warbo

80

C ++, 250 + 26 = 276 ไบต์

template<int A,int B>struct a{static const int n;};
template<int A,int B>const int a<A,B>::n=a<A-1,a<A,B-1>::n>::n;
template<int A>struct a<A,0>{static const int n=a<A-1,1>::n;};
template<int B>struct a<0,B>{static const int n=B+1;};
int h=a<4,2>::n;

นี่คือฟังก์ชัน Ackermann ที่ใช้ในเทมเพลต ฉันไม่สามารถคอมไพล์ด้วยเครื่องh=a<4,2>::n;เล็ก ๆ (6GB) ของฉันได้ แต่ฉันจัดการh=a<3,14>ไฟล์เอาต์พุต 26M คุณสามารถปรับค่าคงที่เพื่อให้ถึงขีด จำกัด ของแพลตฟอร์มของคุณ - ดูบทความ Wikipedia ที่เชื่อมโยงเพื่อขอคำแนะนำ

ต้อง-gตั้งค่าสถานะเพื่อ GCC (เพราะเป็นสัญลักษณ์การแก้ปัญหาทั้งหมดที่ใช้พื้นที่จริง ๆ ) และความลึกของแม่แบบที่ใหญ่กว่าค่าเริ่มต้น บรรทัดการคอมไพล์ของฉันสิ้นสุดลงเมื่อ

g++ -ftemplate-depth=999999 -g -c -o 69189.o 69189.cpp

ข้อมูลแพลตฟอร์ม

g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Linux 3.13.0-46-generic #79-Ubuntu SMP x86_64 GNU/Linux

ฉันชอบอันนี้จริงๆ แต่ฉันไม่แน่ใจว่าฉันสามารถรับเอาท์พุท. o เนื่องจากฉันพูดว่า ELF / .exe / etc (และการรวบรวมสิ่งนี้จะทำให้ทุกอย่างเต็มประสิทธิภาพ!) ยัง +1 (และยืนยัน)
เดฟ

4
อัปเดต: เนื่องจาก Ben Voigt ชี้ให้เห็นคำตอบของเขา GCC บน Linux จะสร้างไฟล์ ELF เป็นเอาต์พุต. o และฉันสามารถยืนยันตัวแปร <3,14> ด้วยดังนั้นจึงอัปโหลดได้ถูกต้อง
เดฟ

17
ฉันคาดหวังบางสิ่งที่ไร้สาระที่จะออกมาจากเทมเพลต C ++ ฉันไม่ได้คาดหวังว่าฟังก์ชั่น Ackermann
ทำเครื่องหมาย

ฟีโบนัชชีจะไม่ให้รหัสขนาดเล็กลงและควบคุมขนาดผลงานได้ดีขึ้นหรือไม่
Will Ness

1
แต่เราต้องการโค้ดที่ใหญ่กว่า! ฟีโบนักชีให้ขนาดใกล้เคียงกับโค้ดเชิงเส้นล้วนๆ (แต่ต้องใช้เวลาในการคอมไพล์อีกต่อไป) แน่นอนคุณสามารถมีความสนุกสนานกับอาร์เรย์แบบคงที่ขนาดA+Bในแต่ละชั้นเรียนตอนนี้ผมคิดว่ามัน ...
Toby Speight

65

ASM, 61 ไบต์ (ซอร์ส 29 ไบต์, 32 ไบต์สำหรับแฟล็ก), 4,294,975,320 ไบต์

.globl main
main:
.zero 1<<32

รวบรวมกับ gcc the_file.s -mcmodel=large -Wl,-fuse-ld=gold


5
1<<30ดีพอสำหรับ C. เนื่องจากนี่คือแอสเซมเบลอร์ขนาดเป็นไบต์
viraptor

2
@viraptor ระบบของฉันมี RAM 32GB และเตะฉันพยายามสร้างรหัสของคุณ asการบริหารจัดการที่จะถึงมือออกไปldแต่ldล้มเหลวด้วยนี้ ไม่ได้-mcmodel=mediumดูเหมือนว่าจะช่วย
Iwillnotexist Idonotexist

2
ลองบังคับใช้goldlinker: gcc -fuse-ld=gold ...คอมไพล์ / ลิงค์ ... eek! เสร็จสิ้นใน 1:29 (89 วินาที) และขนาด 1,073,748,000 ไบต์
lornix

2
ในที่สุดฉันก็ได้สิ่งนี้มาประกอบบน Ubuntu 15.10 แบบ 64 บิตพร้อมการเรียกgcc -o g g.s -mcmodel=large -Wl,-fuse-ld=goldใช้ นับครั้งสุดท้าย: 4,294,975,320 bytes32 -mcmodel=large -Wl,-fuse-ld=goldกับไบต์พิเศษที่เพิ่มความยาวโปรแกรมสำหรับ น่าสังเกตว่าส่วนหัวไม่ถูกต้อง แหล่งที่มาคือ 29 ไบต์ (โดยไม่ต้องเพิ่มธงพิเศษ)
Mego

3
ด้วยการชนการจัดสรรถึง1<<33ฉันจบลงด้วยการ8,589,942,616ปฏิบัติการไบต์
Mego

60

นี่คือคำตอบ C ของฉันจากปี 2005 จะสร้างไบนารี 16TB หากคุณมี RAM ขนาด 16TB (คุณไม่มี)

struct indblock{
   uint32_t blocks[4096];
};

struct dindblock {
    struct indblock blocks[4096];
};

struct tindblock {
    struct dindblock blocks[4096];
};

struct inode {
    char data[52]; /* not bothering to retype the details */
    struct indblock ind;
    struct dindblock dint;
    struct tindblock tind;
};

struct inode bbtinode;

int main(){}

19
"จะสร้างไบนารี 16TB หากคุณมี RAM ขนาด 16TB (คุณไม่มี)" - ฉันไม่มีฮาร์ดไดรฟ์ขนาด 16TB! ฉันไม่สามารถยืนยันสิ่งนี้ได้จริง ๆ แต่มันก็เจ๋ง
เดฟ

5
ฉันค้นพบอันนี้โดยบังเอิญและดูคอมไพเลอร์โค่นล้มเมื่อมันหมดพื้นที่ที่อยู่
Joshua

8
โปรดอย่าพยายามตีกอล์ฟรายการนี้; การตีกอล์ฟเป็นการเอาชนะเจตนาของตัวอย่างรหัสและไม่มีประโยชน์ที่จะทำเช่นนั้น รหัสนี้เป็น GPL จากนั้นในปี 2005
Joshua

6
@BenVoigt ไม่ว่าการแก้ไขรหัสของคนอื่นจะไม่ได้รับการยอมรับที่นี่ แสดงความคิดเห็นหากมีปัญหา โพสต์ meta ที่เกี่ยวข้อง: meta.codegolf.stackexchange.com/questions/1615/…
Mego

2
@Joshua: ตรวจสอบ markdown diff Mego เพิ่มคำใบ้ที่เน้นไว้เท่านั้น
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

25

ตัวประมวลผลล่วงหน้า C แบบธรรมดาธรรมดา: อินพุต 214 ไบต์, เอาต์พุต 5MB

แรงบันดาลใจจาก preprocessor โลกแห่งความจริงของฉันล้มเหลวที่นี่

#define A B+B+B+B+B+B+B+B+B+B
#define B C+C+C+C+C+C+C+C+C+C
#define C D+D+D+D+D+D+D+D+D+D
#define D E+E+E+E+E+E+E+E+E+E
#define E F+F+F+F+F+F+F+F+F+F
#define F x+x+x+x+x+x+x+x+x+x

int main(void) { int x, y = A; }

การทดลองแสดงให้เห็นว่าแต่ละระดับของความ#defineประสงค์ (ตามที่คาดไว้) ทำให้การส่งออกมีขนาดใหญ่ขึ้นประมาณสิบเท่า แต่เนื่องจากตัวอย่างนี้ใช้เวลามากกว่าหนึ่งชั่วโมงในการรวบรวมฉันจึงไม่เคยไปที่ "G"


9
นี่เป็นเหมือนระเบิด xml
เอิร์ก

9
โดยเฉพาะอย่างยิ่งมันคือการดำเนินการตามเดิม "พันล้านหัวเราะ"
mınxomaτ

นี่มันบ้า แต่ก็ง่าย
Vahid Amiri

2
ว้าวสิ่งนี้ทำให้เกิด segfault ใน GCC 4.9 และ Clang คอมไพเลอร์ใดที่คุณใช้?
เดฟ

1
@Dave: แปลก เมื่อฉันคอมไพล์โดยใช้ make มันคอมไพล์ แต่ถ้าฉันพิมพ์ในคำสั่งเดียวกันที่ทำให้การใช้มันล้มเหลว และดูเหมือนจะไม่เกี่ยวข้องกับตัวแปรสภาพแวดล้อม
Thomas Padron-McCarthy

24

Java, 450 + 22 = 472 ไบต์แหล่งไฟล์คลาส ~ 1GB

B.java (เวอร์ชั่นนักกอล์ฟเตือนระหว่างการรวบรวม)

import javax.annotation.processing.*;@SupportedAnnotationTypes("java.lang.Override")public class B extends AbstractProcessor{@Override public boolean process(java.util.Set a,RoundEnvironment r){if(a.size()>0){try(java.io.Writer w=processingEnv.getFiler().createSourceFile("C").openWriter()){w.write("class C{int ");for(int i=0;i<16380;++i){for(int j=0;j<65500;++j){w.write("i");}w.write(i+";int ");}w.write("i;}");}catch(Exception e){}}return true;}}

B.java (เวอร์ชั่นที่ไม่ดี)

import java.io.Writer;
import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;

@SupportedAnnotationTypes("java.lang.Override")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class B extends AbstractProcessor {
    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        if (annotations.size() > 0) {
            try (Writer writer = processingEnv.getFiler().createSourceFile("C").openWriter()) {
                writer.write("class C{int ");
                for (int i = 0; i < 16380; ++i) {
                    for (int j = 0; j < 65500; ++j) {
                        writer.write("i");
                    }
                    writer.write(i + ";int ");
                }
                writer.write("i;}");
            } catch (Exception e) {
            }
        }
        return true;
    }
}

การรวบรวม

javac B.java
javac -J-Xmx16G -processor B B.java

คำอธิบาย

ระเบิดนี้ใช้ตัวประมวลผลคำอธิบายประกอบ มันต้องการคอมไพล์พาส 2 ครั้ง Bครั้งแรกผ่านการสร้างระดับการประมวลผล ในระหว่างการส่งครั้งที่สองตัวประมวลผลจะสร้างไฟล์ต้นฉบับใหม่C.javaและคอมไพล์ไฟล์นั้นC.classด้วยขนาดของ1,073,141,162ไบต์

มีข้อ จำกัด หลายประการเมื่อพยายามสร้างไฟล์คลาสใหญ่:

  • การสร้างตัวระบุนานกว่าประมาณ 64k error: UTF8 representation for string "iiiiiiiiiiiiiiiiiiii..." is too long for the constant poolผลลัพธ์ใน:
  • การสร้างตัวแปร / ฟังก์ชั่นที่มากกว่า 64k ผลลัพธ์: error: too many constants
  • นอกจากนี้ยังมีข้อ จำกัด ประมาณ 64k สำหรับขนาดรหัสของฟังก์ชัน
  • ดูเหมือนว่าจะมีข้อ จำกัด ทั่วไป (ข้อผิดพลาด?) ในคอมไพเลอร์ java ประมาณ 1GB สำหรับ.classไฟล์ ถ้าผมเพิ่ม16380ไป16390ในโค้ดข้างต้นคอมไพเลอร์ไม่เคยส่งกลับ
  • นอกจากนี้ยังมีข้อ จำกัด เกี่ยวกับ.javaไฟล์1GB เพิ่มขึ้น16380ไป16400ในผลโค้ดข้างต้นใน: ตามมาด้วยAn exception has occurred in the compiler (1.8.0_66). Please file a bug ...java.lang.IllegalArgumentException

10
เรียบร้อย; โดยพื้นฐานแล้วคุณได้สร้างตัวประมวลผลล่วงหน้าของคุณเองภายในขนาด จำกัด ในภาษาที่มีคอมไพเลอร์ซึ่งสนับสนุนตัวประมวลผลล่วงหน้าที่กำหนดเอง มันอยู่ในกฎ คลาสสุดท้ายเป็นเพียง 0.5GB สำหรับฉัน แต่ฉันสามารถยืนยันวิธีการได้
เดฟ

อีกตัวอย่างหนึ่งใน Java habrahabr.ru/post/245333 - มันใช้ซ้อนกันtry..finally(โค้ดในที่สุดบล็อกจะถูกทำซ้ำสำหรับกรณีปกติและพิเศษ) และบล็อก initializer (รหัสจากบล็อก initializer ถูกผนวกเข้ากับตัวสร้างแต่ละตัว)
Victor

ฉันแทนที่äด้วยiและปรับตัวเลข ตอนนี้ระเบิดควรสร้างคลาส 1GB ในระบบใด ๆ โดยไม่มีปัญหาการเข้ารหัส อย่างไรก็ตามตอนนี้มันต้องการหน่วยความจำมากขึ้น
Sleafar

? ขยาย TypeElement?!?
แมว

1
@cat ดูที่นี่: angelikalanger.com/GenericsFAQ/FAQSections/…
Sleafar

22

C, ซอร์ส 26 ไบต์, 2,139,103,367 ไบต์เอาต์พุต, โปรแกรมที่ถูกต้อง

const main[255<<21]={195};

รวบรวมโดยใช้: gcc cbomb.c -o cbomb(รุ่น gcc 4.6.3, Ubuntu 12.04, ~ 77 วินาที)

ฉันคิดว่าฉันจะลองดูว่าฉันสามารถสร้างโปรแกรมที่ถูกต้องได้โดยไม่ต้องใช้ตัวเลือกบรรทัดคำสั่งใด ๆ ฉันได้แนวคิดจากคำตอบนี้: https://codegolf.stackexchange.com/a/69193/44946โดย Digital Trauma ดูความคิดเห็นที่นั่นเป็นสาเหตุที่รวบรวมนี้

วิธีการทำงาน: การconstลบการตั้งค่าสถานะการเขียนออกจากหน้าในกลุ่มเพื่อให้สามารถดำเนินการหลัก นี่195คือรหัสเครื่อง Intel สำหรับการส่งคืน และเนื่องจากสถาปัตยกรรมของ Intel นั้นมีขนาดเล็กมากจึงเป็นไบต์แรก โปรแกรมจะออกจากสิ่งที่รหัสเริ่มต้นใส่ใน eax register น่าจะเป็น 0

เพียงประมาณ 2 กิ๊กเนื่องจากตัวเชื่อมโยงใช้ค่าที่เซ็นชื่อ 32 บิตสำหรับการออฟเซ็ต มันมีขนาดเล็กกว่า 2 เมกะไบต์ 8 กิกะไบต์เนื่องจากคอมไพเลอร์ / ลิงเกอร์ต้องการพื้นที่ในการทำงานและนี่คือขนาดที่ใหญ่ที่สุดที่ฉันสามารถรับได้โดยไม่มีข้อผิดพลาดตัวลิงก์ - ymmv


3
สิ่งที่น่าสนใจคือเอาต์พุตคือ 2,078,451 ไบต์ gziped พร้อมการบีบอัดสูงสุด = 1029: 1 อัตราส่วนการบีบอัด
Zakipu

20

Boo , 71 ไบต์ เวลารวบรวม: 9 นาที 134,222,236 ไบต์ปฏิบัติการได้

macro R(e as int):
 for i in range(2**e):yield R.Body
x = 0
R 25:++x

ใช้มาโครR(สำหรับการทำซ้ำ) เพื่อทำให้คอมไพเลอร์เพิ่มจำนวนคำสั่งที่เพิ่มขึ้นเป็นจำนวนครั้งโดยพลการ ไม่ต้องการแฟล็กคอมไพเลอร์พิเศษ เพียงบันทึกไฟล์เป็นbomb.booและเรียกคอมไพเลอร์ด้วยbooc bomb.booเพื่อสร้าง


2**e-นี่คืออะไร? ลอง9**e!
wchargin

1
@WChargin: สิ่งที่สนุกเกี่ยวกับ metaprogramming นั้นง่ายแค่ไหนที่คุณสามารถปรับแต่งมันได้!
Mason Wheeler

ฉันมีปัญหาเล็กน้อยในการติดตั้งบู ... ฉันจะยืนยันอันนี้เมื่อฉันจัดการเพื่อติดตั้ง!
เดฟ

@Dave คุณมีปัญหาอะไรกับมัน?
Mason Wheeler

16

Kotlin , แหล่ง 90 ไบต์, 177416 ไบต์ (173 KB) ที่รวบรวม JVM ไบนารี

inline fun a(x:(Int)->Any){x(0);x(1)}
fun b()=a{a{a{a{a{a{a{a{a{a{a{println(it)}}}}}}}}}}}

ในทางเทคนิคคุณสามารถทำสิ่งนี้ได้นานขึ้นโดยการซ้อนการแสดงออกเพิ่มเติม อย่างไรก็ตามคอมไพเลอร์ล้มเหลวด้วยStackOverflowข้อผิดพลาดถ้าคุณเพิ่มการสอบถามซ้ำ


คำนำหน้า SI ของคุณไม่เห็นด้วย นั่นคือ 177416 กิโลไบต์ = 173 MB หรือ 177416 ไบต์ = 173 kB?
Ben Voigt

1
@BenVoigt ขอขอบคุณที่ชี้ให้เห็นว่า: D
TheNumberOne

น่าประทับใจมี +1
J Atkin

สำหรับ Kotlin 1.2.20 เพื่อรวบรวมเราจำเป็นต้องลบความลึกหนึ่งส่วนและมันคือ ~ 104kB คุณใช้รุ่นไหนในตอนแรก?
TWiStErRob

15

C ++, 214 ไบต์ (ไม่จำเป็นต้องมีตัวเลือกการรวบรวมพิเศษ)

#define Z struct X
#define T template<int N
T,int M=N>Z;struct Y{static int f(){return 0;}};T>Z<N,0>:Y{};T>Z<0,N>:Y{};T,int M>Z{static int f(){static int x[99999]={X<N-1,M>::f()+X<N,M-1>::f()};}};int x=X<80>::f();

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

ไฟล์อ็อบเจ็กต์ที่สร้างด้วยg++ 4.9.3 x86_64-pc-cygwin2567355421 ไบต์ (2.4GiB)

การเพิ่มค่าเริ่มต้นที่สูงกว่า 80 จะทำให้ตัวแบ่ง cygwin gcc (มีเซกเมนต์มากเกินไป)

นอกจากนี้ยัง99999สามารถถูกแทนที่ด้วย9<<19หรือคล้ายกันสำหรับขนาดที่เพิ่มขึ้นโดยไม่ต้องเปลี่ยนซอร์สโค้ด ... แต่ฉันไม่คิดว่าฉันต้องใช้พื้นที่ดิสก์มากกว่าที่ฉันเป็นอยู่แล้ว)


ยืนยัน (ที่จริงแล้วคือ 2.56GB พร้อมเสียงดังกราว) แต่ต้องการ-cแฟล็กคอมไพล์เพื่อหยุดตัวลิงก์ (2 ไบต์พิเศษ) และฉันไม่แน่ใจว่าฉันสามารถรับเอาท์พุท. o (ไม่ใช่หนึ่งในรายการที่ฉันระบุ) ยังฉันชอบมันดังนั้น +1
เดฟ

@Dave: ไฟล์ gcc .o เป็นรูปแบบ ELF ใช่ไหม
Ben Voigt

ไม่แน่ใจ. พวกเขาไม่ได้เริ่มต้นด้วยหมายเลขเวทมนต์ของเอลฟ์เมื่อฉันสร้างพวกเขา…ฉันจะตรวจสอบในภายหลัง
เดฟ

@Dave: cygwin gcc ไม่ได้สร้างไฟล์ ELF ลินุกซ์ GCC ดูเหมือนว่าจะ (แม้ว่าฉันกำลังมองหาที่หนึ่งจากชิ้นส่วนที่แตกต่างกันของโค้ด)
เบนยต์

ใช่ GCC 5.2.1 บน Kubuntu กำลังสร้างไฟล์ ELF แต่มันมีขนาดเพียง 9MB เท่านั้น! ไม่แน่ใจว่ามันบีบอัดได้อย่างไรเมื่อเปรียบเทียบกับคอมไพเลอร์ตัวอื่น บางที GCC 4.9 จะสร้างไฟล์ 2GB ELF
เดฟ

6

Scala - 70 ไบต์แหล่ง 22980842 ผลไบต์ (หลังจาก jar)

import scala.{specialized => s}
class X[@s A, @s B, @s C, @s D, @s E]

สิ่งนี้จะสร้างไฟล์คลาสพิเศษ9 5 (ประมาณ 59,000) ซึ่งบรรจุลงในขวดขนาดประมาณ 23 MB ในหลักการคุณสามารถทำต่อไปได้หากคุณมีระบบไฟล์ที่สามารถจัดการกับไฟล์จำนวนมากและหน่วยความจำที่เพียงพอ

(หากคำสั่ง jar ต้องถูกรวมไว้มันคือ 82 ไบต์)


ฉันไม่สามารถรวบรวมได้: error: java.lang.OutOfMemoryError: GC overhead limit exceeded. คุณสามารถบันทึกคำสั่งที่จำเป็นสำหรับการรวบรวมได้หรือไม่
P.Péter

@ P.Péter - คุณต้องให้หน่วยความจำคอมไพเลอร์มากขึ้นเช่นscalac -J-Xmx12G X.scalaสิ่งที่ฉันใช้ ฉันไม่ได้ทดสอบว่ามันต้องการจริงๆแค่ไหน
Rex Kerr

ยังไม่ได้รวบรวมเศร้า :( error: error while loading AnnotatedElement, class file '/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar(java/lang/reflect/AnnotatedElement.class)' is broken (bad constant pool tag 18 at byte 76) one error foundคุณสามารถระบุรุ่นสกาล่าและจาวา (อาจเป็นแพลตฟอร์มด้วย) ฉันใช้ scalac 2.9.2 และ OpenJDK 1.8.0_66-internal-b17 บนเดเบียน 8 x86-64
P.Péter

อูบุนตู 15.10, java version "1.8.0_72-ea" Java(TM) SE Runtime Environment (build 1.8.0_72-ea-b05) Java HotSpot(TM) 64-Bit Server VM (build 25.72-b05, mixed mode) ,$ scala -version Scala code runner version 2.11.7 -- Copyright 2002-2013, LAMP/EPFL
เร็กซ์เคอร์

2

C, 284 ไบต์ +2 สำหรับ-cin gcc bomb.c -o bomb.o -c; เอาต์พุต: 2 147 484 052 ไบต์

#define a 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
#define b a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
#define c b,b,b,b,b,b,b,b,b,b,b,b,b,b,b,b
#define d c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c
#define e d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
#define f e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e
__int128 x[]={f,f,f,f,f,f,f,f};

0

Boo มากกว่าที่คุณคาดหวังจากสิ่งนี้

macro R(e as int):for i in range(9**e):yield R.Body
x = 0
R 99:++x

ดูเหมือนว่าคำตอบของ Mason Wheeler ที่มีการเปลี่ยนแปลงเล็กน้อย (??) คุณได้คำตอบเดียวกันอย่างเป็นอิสระหรือมีสิ่งที่สำคัญในค่าที่คุณเปลี่ยนแปลง (ถ้าเป็นเช่นนั้นโปรดแก้ไขคำตอบเพื่ออธิบายว่าทำไมถึงมีความสำคัญ)
เดฟ

0

Python 3:

9**9**9**9**9

ระเบิด Tetration


2
คุณควรระบุจำนวนไบต์ที่ส่งออกเพื่อดูว่ารายการของคุณเปรียบเทียบกับผู้อื่น
Sanchises

ยินดีต้อนรับสู่ PPCG! ดูเหมือนว่าคุณสร้างสองบัญชีโดยไม่ตั้งใจและโพสต์คำตอบนี้สองครั้ง ฉันลบคำตอบอื่นแล้ว ในฐานะที่เป็น Sanchises กล่าวว่าความท้าทายนี้เป็นคะแนนโดยขนาดของโปรแกรมรวบรวม ดังนั้นคุณควรรวมขนาดนั้นไว้ในคำตอบของคุณเนื่องจากเป็นคะแนนหลัก นอกจากนี้โปรดทราบว่าโปรแกรมจริงจะไม่ใหญ่มากเพียงนิพจน์ที่คุณสร้างในหน่วยความจำดังนั้นคุณอาจต้องการคิดถึงวิธีอื่น
Martin Ender

1
@MartinEnder เนื่องจาก Python ประเมินนิพจน์บางอย่างในเวลาคอมไพล์และเก็บตัวเลขด้วยความแม่นยำโดยพลการสิ่งนี้ (ในทางทฤษฎี) จะมีความสามารถในการประมวลผลที่ค่อนข้างใหญ่ แต่ดังที่ Aleksi Torhamo (ซึ่งใช้เทคนิคเดียวกันกับคำตอบของเขา) ข้อ จำกัด นี้อยู่ที่ประมาณ 2GB ดังนั้นฉันคาดว่ารหัสนี้อาจเขียนไม่ได้ (แม้ว่าฉันจะยังไม่ได้ตรวจสอบ ) ถ้า OP สามารถทำให้คอมไพล์และโพสต์ขนาดที่คอมไพล์แล้ว (พร้อมกับคำสั่งที่จำเป็นในการสร้าง), แสดงว่ามันถูกต้อง ความคล้ายคลึงกับคำตอบที่มีอยู่ของ Aleksi ดูเหมือนจะเป็นเรื่องบังเอิญสำหรับฉัน
เดฟ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.