pengantar
Anda mungkin akrab dengan bom ritsleting , bom XML , dll. Sederhananya, mereka adalah (relatif) file kecil yang menghasilkan output yang sangat besar ketika ditafsirkan oleh perangkat lunak naif. Tantangannya di sini adalah menyalahgunakan kompiler dengan cara yang sama.
Tantangan
Tulis beberapa kode sumber yang menempati 512 byte atau kurang dan yang dikompilasi menjadi file yang menempati ruang paling mungkin. File output terbesar menang!
Aturan
OK, jadi ada beberapa klarifikasi, definisi, dan batasan penting;
- Output dari kompilasi harus berupa file ELF , Windows Portable Executable (.exe), atau bytecode virtual untuk JVM atau .Net's CLR (jenis bytecode virtual lain juga cenderung OK jika diminta). Pembaruan: Output .pyc / .pyo Python juga diperhitungkan .
- Jika bahasa pilihan Anda tidak dapat dikompilasi secara langsung ke dalam salah satu format tersebut, transpilasi diikuti oleh kompilasi juga diperbolehkan ( Perbarui: Anda dapat mentranspilasikan beberapa kali, asalkan Anda tidak pernah menggunakan bahasa yang sama lebih dari sekali ).
- Kode sumber Anda dapat terdiri dari beberapa file, dan bahkan file sumber daya, tetapi ukuran total semua file ini tidak boleh melebihi 512 byte.
- Anda tidak dapat menggunakan input selain dari file sumber Anda dan perpustakaan standar bahasa pilihan Anda. Menghubungkan statis perpustakaan standar adalah OK jika didukung. Secara khusus, tidak ada perpustakaan pihak ketiga atau perpustakaan OS.
- Harus dimungkinkan untuk menjalankan kompilasi Anda menggunakan perintah atau serangkaian perintah. Jika Anda memerlukan tanda tertentu saat dikompilasi, ini dihitung menuju batas byte Anda (mis. Jika garis kompilasi Anda
gcc bomb.c -o bomb -O3 -lm
,-O3 -lm
bagian (7 byte) akan dihitung (perhatikan ruang awal awal tidak dihitung). - Pra-prosesor hanya diizinkan jika mereka merupakan opsi kompilasi standar untuk bahasa Anda.
- Lingkungan terserah pada Anda, tetapi demi kepentingan membuat hal ini dapat diverifikasi, patuhi versi kompiler dan sistem operasi terbaru (yaitu yang tersedia) (dan jelas tentukan yang Anda gunakan).
- Itu harus dikompilasi tanpa kesalahan (peringatan OK), dan menabrak kompiler tidak menghitung apa pun.
- Apa yang sebenarnya dilakukan oleh program Anda tidak relevan, meskipun tidak bisa berupa apa pun yang berbahaya. Bahkan tidak harus bisa memulai.
Contoh 1
Program C.
main(){return 1;}
Dikompilasi dengan Apple LLVM version 7.0.2 (clang-700.1.81)
pada OS X 10.11 (64-bit):
clang bomb.c -o bomb -pg
Menghasilkan file sebesar 9228 byte. Ukuran sumber total adalah 17 + 3 (untuk -pg
) = 20 byte, yang mudah dalam batas ukuran.
Contoh 2
Program Brainfuck:
++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.--
-[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-.
Diubah dengan awib ke c dengan:
./awib < bomb.bf > bomb.c
Kemudian dikompilasi dengan Apple LLVM version 7.0.2 (clang-700.1.81)
pada OS X 10.11 (64-bit):
clang bomb.c
Menghasilkan file 8464 byte. Input total di sini adalah 143 byte (karena @lang_c
merupakan default untuk awib, ia tidak perlu ditambahkan ke file sumber, dan tidak ada flag khusus pada kedua perintah).
Juga perhatikan bahwa dalam kasus ini, file bomb.c sementara adalah 802 byte, tetapi ini tidak memperhitungkan ukuran sumber maupun ukuran output.
Catatan Akhir
Jika output lebih dari 4GB tercapai (mungkin jika seseorang menemukan preprocessor lengkap turing), kompetisi akan menjadi sumber terkecil yang menghasilkan file sekurang-kurangnya sebesar itu (tidak praktis untuk menguji pengiriman yang terlalu besar) .