- 20, Oct 2024
- #1
Введение
Вы, вероятно, знакомы с почтовые бомбы, XML-бомбыи т. д. Проще говоря, это (относительно) небольшие файлы, которые при интерпретации простым программным обеспечением выдают огромный результат. Задача здесь состоит в том, чтобы таким же образом злоупотребить компилятором.
Испытание
Напишите исходный код размером 512 байт или меньше, который компилируется в файл, занимающий максимально возможное пространство. Самый большой выходной файл побеждает!
Правила
Итак, есть несколько важных уточнений, определений и ограничений;
- Результатом компиляции должен быть ЭЛЬФ файл, переносимый исполняемый файл Windows (.exe) или виртуальный байт-код для JVM или CLR .Net (другие типы виртуального байт-кода также, вероятно, подойдут, если их об этом попросят). Обновление: вывод Python .pyc/.pyo также учитывается..
- Если выбранный вами язык не может быть скомпилирован непосредственно в один из этих форматов, также разрешена транспиляция с последующей компиляцией (Обновление: вы можете транспилировать несколько раз, при условии, что вы никогда не используете один и тот же язык более одного раза.).
- Ваш исходный код может состоять из нескольких файлов и даже файлов ресурсов, но общий размер всех этих файлов не должен превышать 512 байт.
- Вы не можете использовать какие-либо другие входные данные, кроме исходных файлов и стандартной библиотеки выбранного вами языка. Статическое связывание стандартных библиотек допустимо, если оно поддерживается. В частности, никаких сторонних библиотек или библиотек ОС.
- Должна быть возможность вызвать вашу компиляцию с помощью команды или серии команд. Если при компиляции вам требуются определенные флаги, эти засчитывайте свой лимит в байтах (например, если ваша строка компиляции
@lang_c
clang bomb.c
часть (7 байт) будет учтена (обратите внимание, что начальный пробел не учитывается). - Препроцессоры разрешены только если они являются стандартным вариантом компиляции для вашего языка.
- Среда зависит от вас, но чтобы сделать это проверяемым, придерживайтесь последних (т. е. доступных) версий компилятора и операционных систем (и, очевидно, укажите, какую вы используете).
- Он должен скомпилироваться без ошибок (предупреждения допустимы), а сбой компилятора ни к чему не приведет.
- Что на самом деле ваша программа делает не имеет значения, хотя это не может быть чем-то вредоносным. Его даже не обязательно начинать.
Пример 1
Программа С
Apple LLVM version 7.0.2 (clang-700.1.81)
Составлено с ./awib < bomb.bf > bomb.c
on OS X 10.11 (64-bit):
++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.--
-[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-.
Создает файл размером 9228 байт. Общий размер источника равен 17+3 (для -pg
) = 20 bytes, which is easily within size limit.
Пример 2
Программа Brainfuck:
clang bomb.c -o bomb -pg
Транспилируется с помощью авиб в c с:
Apple LLVM version 7.0.2 (clang-700.1.81)
Затем скомпилировано с помощью main(){return 1;}
on OS X 10.11 (64-bit):
-O3 -lm
Создает файл размером 8464 байта. Общий объем ввода здесь составляет 143 байта (поскольку gcc bomb.c -o bomb -O3 -lm
is the default for awib it didn't need to be added to the source file, and there are no special flags on either command).
Также обратите внимание, что в этом случае временный файл бомбы.c имеет размер 802 байта, но это не учитывается ни в исходном размере, ни в выходном размере.
Заключительное примечание
Если будет достигнут объем более 4 ГБ (возможно, если кто-нибудь найдет полный препроцессор Тьюринга), конкуренция будет за наименьший источник который создает файл как минимум такого размера (просто нецелесообразно тестировать материалы, которые получают слишком большой).
#code-challenge #busy-beaver #время компиляции