Введение
Вы, вероятно, знакомы с zip-бомбами , XML-бомбами и т. Д. Проще говоря, это (относительно) небольшие файлы, которые дают огромный результат при интерпретации наивным программным обеспечением. Задача здесь заключается в том, чтобы так же злоупотреблять компилятором.
Вызов
Напишите некоторый исходный код, который занимает 512 байт или меньше и который компилируется в файл, который занимает максимально возможное пространство. Самый большой выходной файл выигрывает!
правила
Итак, есть несколько важных уточнений, определений и ограничений;
- Выходными данными компиляции должны быть файл ELF , исполняемый файл Windows (.exe) или виртуальный байт-код для JVM или CLR .Net (другие типы виртуальных байт-кодов также могут быть в порядке, если их попросить). Обновление: вывод Python в .pyc / .pyo также имеет значение .
- Если выбранный вами язык не может быть скомпилирован непосредственно в один из этих форматов, то также разрешена транспиляция с последующей компиляцией ( Обновление: вы можете переносить несколько раз, только если вы никогда не используете один и тот же язык более одного раза ).
- Ваш исходный код может состоять из нескольких файлов и даже файлов ресурсов, но суммарный размер всех этих файлов не должен превышать 512 байт.
- Вы не можете использовать другие входные данные, кроме вашего исходного файла (ов) и стандартной библиотеки вашего языка по вашему выбору. Статическое связывание стандартных библиотек в порядке, если оно поддерживается. В частности, нет сторонних библиотек или библиотек ОС.
- Должна быть возможность вызвать компиляцию с помощью команды или серии команд. Если при компиляции вам требуются определенные флаги, они учитываются в пределах вашего байтового предела (например, если у вас есть строка компиляции
gcc bomb.c -o bomb -O3 -lm
,-O3 -lm
будет подсчитана часть (7 байт) (обратите внимание, что начальный пробел не учитывается). - Препроцессоры разрешены, только если они являются стандартным вариантом компиляции для вашего языка.
- Окружение зависит от вас, но в интересах обеспечения возможности проверки этого, пожалуйста, придерживайтесь последних (то есть доступных) версий компилятора и операционных систем (и, очевидно, укажите, что вы используете).
- Он должен компилироваться без ошибок (с предупреждениями все в порядке), и сбой компилятора ничего не значит.
- То, что на самом деле делает ваша программа, не имеет значения, хотя и не может быть вредоносным. Это даже не должно быть в состоянии начать.
Пример 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:
++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.--
-[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-.
Транспортируется с помощью 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 байта, но это не учитывает ни исходный размер, ни выходной размер.
Финальная нота
Если будет получен вывод более 4 ГБ (возможно, если кто-то найдет полный препроцессор Тьюринга), конкуренция будет за самый маленький источник, который создает файл, по крайней мере, такого размера (просто непрактично проверять представления, которые становятся слишком большими) ,