บทนำ
คุณอาจคุ้นเคยกับ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 สมบูรณ์) การแข่งขันก็จะเป็นแหล่งที่มีขนาดเล็กที่สุดซึ่งเป็นผู้ผลิตไฟล์อย่างน้อยขนาดว่า (มันเป็นเพียงไม่ปฏิบัติเพื่อทดสอบการส่งที่ได้รับมากเกินไปขนาดใหญ่) .