Giới thiệu
Có lẽ bạn đã quen thuộc với bom zip , bom XML , v.v. Nói một cách đơn giản, chúng là những tệp nhỏ (tương đối) tạo ra sản lượng khổng lồ khi được giải thích bởi phần mềm ngây thơ. Thách thức ở đây là lạm dụng một trình biên dịch theo cùng một cách.
Thử thách
Viết một số mã nguồn chiếm 512 byte trở xuống và biên dịch thành một tệp chiếm dung lượng lớn nhất có thể. Tập tin đầu ra lớn nhất sẽ thắng!
Quy tắc
OK, vì vậy có một vài làm rõ, định nghĩa và hạn chế quan trọng;
- Đầu ra của quá trình biên dịch phải là tệp ELF , Windows Portable Executable (.exe) hoặc mã byte ảo cho JVM hoặc .Net's CLR (các loại mã byte ảo khác cũng có thể ổn nếu được yêu cầu). Cập nhật: Sản lượng .pyc / .pyo của Python cũng được tính .
- Nếu ngôn ngữ lựa chọn của bạn không thể được biên dịch trực tiếp thành một trong những định dạng đó, thì việc dịch mã theo sau là biên dịch cũng được cho phép ( Cập nhật: bạn có thể dịch mã nhiều lần, miễn là bạn không bao giờ sử dụng cùng một ngôn ngữ nhiều lần ).
- Mã nguồn của bạn có thể bao gồm nhiều tệp và thậm chí cả tệp tài nguyên, nhưng kích thước tổng của tất cả các tệp này không được vượt quá 512 byte.
- Bạn không thể sử dụng bất kỳ đầu vào nào khác ngoài (các) tệp nguồn và thư viện chuẩn của ngôn ngữ bạn chọn. Thư viện tiêu chuẩn liên kết tĩnh là OK khi được hỗ trợ. Cụ thể, không có thư viện bên thứ ba hoặc thư viện hệ điều hành.
- Nó phải có khả năng gọi trình biên dịch của bạn bằng cách sử dụng một lệnh hoặc một loạt các lệnh. Nếu bạn yêu cầu các cờ cụ thể khi biên dịch, các số này sẽ được tính vào giới hạn byte của bạn (ví dụ: nếu dòng biên dịch của bạn là
gcc bomb.c -o bomb -O3 -lm
,-O3 -lm
phần (7 byte) sẽ được tính (lưu ý không gian hàng đầu ban đầu không được tính). - Tiền xử lý chỉ được phép nếu chúng là một tùy chọn biên dịch chuẩn cho ngôn ngữ của bạn.
- Môi trường tùy thuộc vào bạn, nhưng vì lợi ích của việc xác minh điều này, vui lòng tuân theo các phiên bản trình biên dịch và hệ điều hành gần đây (có sẵn) (và rõ ràng chỉ định bạn đang sử dụng).
- Nó phải biên dịch mà không có lỗi (cảnh báo là OK) và sự cố trình biên dịch không được tính cho bất cứ điều gì.
- Những gì chương trình của bạn thực sự làm là không liên quan, mặc dù nó không thể là bất cứ điều gì độc hại. Nó thậm chí không phải bắt đầu.
ví dụ 1
Chương trình C
main(){return 1;}
Được biên dịch Apple LLVM version 7.0.2 (clang-700.1.81)
trên OS X 10.11 (64-bit):
clang bomb.c -o bomb -pg
Tạo một tệp 9228 byte. Tổng kích thước nguồn là 17 + 3 (đối với -pg
) = 20 byte, dễ dàng trong giới hạn kích thước.
Ví dụ 2
Chương trình Brainfuck:
++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.--
-[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-.
Được dịch với awib đến c với:
./awib < bomb.bf > bomb.c
Sau đó được biên dịch với Apple LLVM version 7.0.2 (clang-700.1.81)
trên OS X 10.11 (64-bit):
clang bomb.c
Tạo một tệp 8464 byte. Tổng đầu vào ở đây là 143 byte (vì đây @lang_c
là mặc định cho awib nên không cần thêm vào tệp nguồn và không có cờ đặc biệt nào trong cả hai lệnh).
Cũng lưu ý rằng trong trường hợp này, tệp bomb.c tạm thời là 802 byte, nhưng điều này không tính đến kích thước nguồn cũng như kích thước đầu ra.
Lưu ý cuối cùng
Nếu đạt được sản lượng hơn 4GB (có lẽ nếu ai đó tìm thấy bộ tiền xử lý hoàn chỉnh), thì sự cạnh tranh sẽ dành cho nguồn nhỏ nhất tạo ra một tệp có kích thước tối thiểu (không thực tế để kiểm tra các bài nộp quá lớn) .