introduction
Vous êtes probablement familiarisé avec les bombes zip , XML , etc. Le défi ici est d'abuser d'un compilateur de la même manière.
Défi
Ecrivez du code source qui occupe 512 octets ou moins et qui se compile dans un fichier qui occupe le plus d’espace possible. Le plus grand fichier de sortie gagne!
Règles
OK, il y a donc quelques clarifications, définitions et restrictions importantes;
- La sortie de la compilation doit être un fichier ELF , un exécutable portable Windows (.exe) ou un bytecode virtuel pour la JVM ou le CLR de .Net (d'autres types de bytecode virtuel sont également susceptibles de convenir, le cas échéant). Mise à jour: la sortie .pyc / .pyo de Python compte également .
- Si votre langue de choix ne peut pas être compilée directement dans l'un de ces formats, la transpilation suivie de la compilation est également autorisée ( Mise à jour: vous pouvez transpiler plusieurs fois, du moment que vous n'utilisez jamais la même langue plus d'une fois ).
- Votre code source peut comprendre plusieurs fichiers, voire des fichiers de ressources, mais la taille totale de tous ces fichiers ne doit pas dépasser 512 octets.
- Vous ne pouvez utiliser aucune autre entrée que vos fichiers source et la bibliothèque standard de votre langue de choix. La liaison statique des bibliothèques standard est acceptable si elle est prise en charge. Plus précisément, pas de bibliothèques tierces ni de bibliothèques de système d'exploitation.
- Il doit être possible d'appeler votre compilation à l'aide d'une commande ou d'une série de commandes. Si vous avez besoin d'indicateurs spécifiques lors de la compilation, ceux-ci sont pris en compte dans votre limite d'octets (par exemple, si votre ligne de compilation est
gcc bomb.c -o bomb -O3 -lm
, la-O3 -lm
partie (7 octets) sera comptée (notez que l'espace initial initial n'est pas compté). - Les préprocesseurs ne sont autorisés que s’ils constituent une option de compilation standard pour votre langue.
- L’environnement vous appartient, mais dans l’intérêt de rendre ceci vérifiable, veuillez vous en tenir aux versions récentes du compilateur (disponibles) et aux systèmes d’exploitation (et bien sûr spécifier celui que vous utilisez).
- Il doit compiler sans erreurs (les avertissements sont OK), et planter le compilateur ne compte pour rien.
- Ce que votre programme fait en réalité n’a aucune importance, même s’il ne peut s'agir de rien de malicieux. Il n'est même pas nécessaire de pouvoir commencer.
Exemple 1
Le programme C
main(){return 1;}
Compilé avec Apple LLVM version 7.0.2 (clang-700.1.81)
OS X 10.11 (64 bits):
clang bomb.c -o bomb -pg
Produit un fichier de 9228 octets. La taille totale de la source est de 17 + 3 (pour le -pg
) = 20 octets, ce qui est facilement dans la limite de taille.
Exemple 2
Le programme Brainfuck:
++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.--
-[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-.
Transpilé avec awib à c avec:
./awib < bomb.bf > bomb.c
Puis compilé Apple LLVM version 7.0.2 (clang-700.1.81)
sous OS X 10.11 (64 bits):
clang bomb.c
Produit un fichier de 8464 octets. Le total des entrées ici est de 143 octets ( @lang_c
étant la valeur par défaut pour awib, il n’a pas besoin de l’ajouter au fichier source, et il n’ya pas d’indicateur spécial sur ces commandes).
Notez également que dans ce cas, le fichier temporaire bomb.c fait 802 octets, mais cela ne compte ni dans la taille de la source ni dans la taille de la sortie.
Note finale
Si vous obtenez une sortie de plus de 4 Go (peut-être si quelqu'un trouve un préprocesseur complet), le concours s'adressera à la plus petite source produisant un fichier d'au moins cette taille (il n'est tout simplement pas pratique de tester des soumissions trop volumineuses). .