Introducción
Probablemente esté familiarizado con las bombas zip , las bombas XML , etc. En pocas palabras, son archivos (relativamente) pequeños que producen un enorme rendimiento cuando son interpretados por software ingenuo. El desafío aquí es abusar de un compilador de la misma manera.
Desafío
Escriba un código fuente que ocupa 512 bytes o menos y que se compila en un archivo que ocupa el mayor espacio posible. ¡El archivo de salida más grande gana!
Reglas
OK, entonces hay algunas aclaraciones importantes, definiciones y restricciones;
- La salida de la compilación debe ser un archivo ELF , un ejecutable portátil de Windows (.exe) o un código de bytes virtual para JVM o CLR de .Net (es probable que otros tipos de códigos de bytes virtuales también estén bien si se solicitan). Actualización: la salida .pyc / .pyo de Python también cuenta .
- Si su idioma de elección no puede compilarse directamente en uno de esos formatos, también se permite la transpilación seguida de la compilación ( Actualización: puede transpilar varias veces, siempre y cuando nunca use el mismo idioma más de una vez ).
- Su código fuente puede consistir en múltiples archivos, e incluso archivos de recursos, pero el tamaño sumado de todos estos archivos no debe exceder los 512 bytes.
- No puede utilizar ninguna otra entrada que no sea su (s) archivo (s) de origen y la biblioteca estándar de su idioma de elección. La vinculación estática de bibliotecas estándar está bien cuando es compatible. Específicamente, no hay bibliotecas de terceros o bibliotecas del sistema operativo.
- Debe ser posible invocar su compilación utilizando un comando o una serie de comandos. Si necesita indicadores específicos al compilar, estos cuentan para su límite de bytes (por ejemplo, si su línea de compilación es
gcc bomb.c -o bomb -O3 -lm
, se-O3 -lm
contará la parte (7 bytes) (tenga en cuenta que el espacio inicial no se cuenta). - Los preprocesadores solo están permitidos si son una opción de compilación estándar para su idioma.
- El entorno depende de usted, pero en aras de hacer que esto sea verificable, respete las versiones de compilador y los sistemas operativos recientes (es decir, disponibles) (y, obviamente, especifique cuál está utilizando).
- Debe compilarse sin errores (las advertencias están bien), y el bloqueo del compilador no cuenta para nada.
- Lo que su programa realmente hace es irrelevante, aunque no puede ser nada malicioso. Ni siquiera tiene que poder comenzar.
Ejemplo 1
El programa C
main(){return 1;}
Compilado con Apple LLVM version 7.0.2 (clang-700.1.81)
OS X 10.11 (64 bits):
clang bomb.c -o bomb -pg
Produce un archivo de 9228 bytes. El tamaño total de la fuente es 17 + 3 (para el -pg
) = 20 bytes, que está fácilmente dentro del límite de tamaño.
Ejemplo 2
El programa Brainfuck:
++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.--
-[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-.
Transpilado con awib a c con:
./awib < bomb.bf > bomb.c
Luego compilado con Apple LLVM version 7.0.2 (clang-700.1.81)
OS X 10.11 (64 bits):
clang bomb.c
Produce un archivo de 8464 bytes. La entrada total aquí es de 143 bytes (dado que @lang_c
es el valor predeterminado para awib, no era necesario agregarlo al archivo de origen, y no hay indicadores especiales en ninguno de los comandos).
También tenga en cuenta que, en este caso, el archivo temporal bomb.c tiene 802 bytes, pero esto no tiene en cuenta ni el tamaño de origen ni el tamaño de salida.
Nota final
Si se logra una salida de más de 4 GB (tal vez si alguien encuentra un preprocesador completo), la competencia será por la fuente más pequeña que produzca un archivo de al menos ese tamaño (simplemente no es práctico probar envíos que son demasiado grandes) .