introduzione
Probabilmente hai familiarità con bombe zip , bombe XML , ecc. In parole povere, sono file (relativamente) piccoli che producono un output enorme quando interpretati da software ingenuo. La sfida qui è abusare di un compilatore allo stesso modo.
Sfida
Scrivi del codice sorgente che occupa 512 byte o meno e che si compila in un file che occupa lo spazio più possibile. Vince il file di output più grande!
Regole
OK, quindi ci sono alcuni importanti chiarimenti, definizioni e restrizioni;
- L'output della compilation deve essere un file ELF , un eseguibile portatile di Windows (.exe) o un bytecode virtuale per JVM o CLR di .Net (è probabile che anche altri tipi di bytecode virtuale siano OK se richiesto). Aggiornamento: anche l'output .pyc / .pyo di Python conta .
- Se la tua lingua preferita non può essere compilata direttamente in uno di quei formati, è consentita anche la transpilazione seguita dalla compilazione ( Aggiornamento: puoi traspilare più volte, purché non usi mai la stessa lingua più di una volta ).
- Il codice sorgente può essere costituito da più file e persino file di risorse, ma la dimensione sommata di tutti questi file non deve superare i 512 byte.
- Non è possibile utilizzare alcun input diverso dai file di origine e dalla libreria standard della lingua prescelta. Le librerie standard di collegamento statico sono OK quando sono supportate. In particolare, nessuna libreria di terze parti o librerie del sistema operativo.
- Deve essere possibile invocare la compilation usando un comando o una serie di comandi. Se durante la compilazione sono richiesti flag specifici, questi contano ai fini del limite di byte (ad es. Se la riga di compilazione è
gcc bomb.c -o bomb -O3 -lm
, la-O3 -lm
parte (7 byte) verrà conteggiata (notare che lo spazio iniziale iniziale non viene conteggiato). - I preprocessori sono consentiti solo se sono un'opzione di compilazione standard per la tua lingua.
- L'ambiente dipende da te, ma nell'interesse di renderlo verificabile, ti preghiamo di attenersi alle versioni recenti (cioè disponibili) del compilatore e ai sistemi operativi (e ovviamente specificare quale stai usando).
- Deve compilare senza errori (gli avvisi sono OK) e l'arresto anomalo del compilatore non conta nulla.
- Ciò che il tuo programma fa effettivamente è irrilevante, anche se non può essere nulla di dannoso. Non deve nemmeno essere in grado di iniziare.
Esempio 1
Il programma C.
main(){return 1;}
Compilato con Apple LLVM version 7.0.2 (clang-700.1.81)
su OS X 10.11 (64 bit):
clang bomb.c -o bomb -pg
Produce un file di 9228 byte. La dimensione totale della sorgente è 17 + 3 (per -pg
) = 20 byte, che è facilmente entro il limite della dimensione.
Esempio 2
Il programma Brainfuck:
++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.--
-[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-.
Traspilato con awib ac con:
./awib < bomb.bf > bomb.c
Quindi compilato con Apple LLVM version 7.0.2 (clang-700.1.81)
su OS X 10.11 (64 bit):
clang bomb.c
Produce un file di 8464 byte. L'input totale qui è di 143 byte (poiché @lang_c
è il valore predefinito per awib, non è stato necessario aggiungerlo al file sorgente e non ci sono flag speciali su entrambi i comandi).
Si noti inoltre che in questo caso, il file bomb.c temporaneo è di 802 byte, ma ciò non conta né per la dimensione di origine né per la dimensione di output.
Nota finale
Se si ottiene un output superiore a 4 GB (forse se qualcuno trova un preprocessore completo turing), la competizione sarà per la fonte più piccola che produce un file di almeno quella dimensione (non è pratico testare gli invii che diventano troppo grandi) .