Wprowadzenie
Jesteś prawdopodobnie zna bomby zip , bomb XML itp Mówiąc prościej, są (względnie) to małe pliki, które produkują ogromne wyjście kiedy interpretowane przez naiwnego oprogramowania. Wyzwaniem jest nadużycie kompilatora w ten sam sposób.
Wyzwanie
Napisz kod źródłowy, który zajmuje 512 bajtów lub mniej i który kompiluje się w plik, który zajmuje najwięcej możliwej przestrzeni. Największy plik wyjściowy wygrywa!
Zasady
OK, więc jest kilka ważnych wyjaśnień, definicji i ograniczeń;
- Dane wyjściowe kompilacji muszą być plikiem ELF , przenośnym plikiem wykonywalnym systemu Windows (.exe) lub wirtualnym kodem bajtowym dla JVM lub CLR .Net (inne typy wirtualnego kodu bajtowego również prawdopodobnie będą OK, jeśli zostaną o to poproszone). Aktualizacja: Dane wyjściowe .pyc / .pyo Pythona również się liczą .
- Jeśli wybranego języka nie można skompilować bezpośrednio w jednym z tych formatów, dozwolona jest również transpilacja, a następnie kompilacja ( Aktualizacja: możesz transpilować wiele razy, o ile nigdy nie używasz tego samego języka więcej niż jeden raz ).
- Kod źródłowy może składać się z wielu plików, a nawet plików zasobów, ale suma wszystkich tych plików nie może przekraczać 512 bajtów.
- Nie można używać innych danych wejściowych niż pliki źródłowe i standardowa biblioteka wybranego języka. Łączenie statyczne bibliotek standardowych jest OK, jeśli jest obsługiwane. W szczególności nie ma bibliotek stron trzecich ani bibliotek systemu operacyjnego.
- Musi istnieć możliwość wywołania kompilacji za pomocą polecenia lub szeregu poleceń. Jeśli potrzebujesz specyficznych flag podczas kompilacji, liczą się one do limitu bajtów (np. Jeśli twoja linia kompilacji jest
gcc bomb.c -o bomb -O3 -lm
,-O3 -lm
część (7 bajtów) zostanie policzona (zwróć uwagę, że początkowa spacja nie jest liczona). - Preprocesory są dozwolone tylko wtedy, gdy są standardową opcją kompilacji dla twojego języka.
- Środowisko zależy od ciebie, ale aby uczynić to weryfikowalnym, trzymaj się najnowszych (tj. Dostępnych) wersji kompilatora i systemów operacyjnych (i oczywiście określ, którego używasz).
- Musi się kompilować bez błędów (ostrzeżenia są OK), a awaria kompilatora nie ma znaczenia.
- To, co faktycznie robi twój program , jest nieistotne, chociaż nie może być niczym złośliwym. Nie musi nawet być w stanie się uruchomić.
Przykład 1
Program C.
main(){return 1;}
Kompilowany z Apple LLVM version 7.0.2 (clang-700.1.81)
OS X 10.11 (64-bit):
clang bomb.c -o bomb -pg
Tworzy plik 9228 bajtów. Całkowity rozmiar źródła to 17 + 3 (dla -pg
) = 20 bajtów, co łatwo mieści się w limicie rozmiaru.
Przykład 2
Program Brainfuck:
++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.--
-[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-.
Przeniesione z awib do c z:
./awib < bomb.bf > bomb.c
Następnie skompilowany z Apple LLVM version 7.0.2 (clang-700.1.81)
OS X 10.11 (64-bit):
clang bomb.c
Tworzy plik 8464 bajtów. Łączna ilość danych wejściowych wynosi 143 bajty (ponieważ @lang_c
jest domyślną opcją awib, nie trzeba jej dodawać do pliku źródłowego, a żadne polecenie nie ma specjalnych flag).
Należy również pamiętać, że w tym przypadku plik tymczasowy bomb.c ma 802 bajtów, ale nie ma to wpływu na rozmiar źródła ani rozmiar wyjściowy.
Ostatnia uwaga
Jeśli zostanie uzyskana moc wyjściowa większa niż 4 GB (być może jeśli ktoś znajdzie kompletny preprocesor Turinga), konkurencja będzie dotyczyć najmniejszego źródła, które tworzy plik o co najmniej takiej wielkości (po prostu nie jest praktyczne testowanie zgłoszeń, które stają się zbyt duże) .