소개
압축 폭탄 , XML 폭탄 등에 익숙 할 것입니다 . 간단히 말해서, 이들은 순진한 소프트웨어로 해석 할 때 막대한 출력을 생성하는 (상대적으로) 작은 파일입니다. 여기서의 과제는 동일한 방식으로 컴파일러를 남용하는 것입니다.
도전
512 바이트 이하를 차지하고 가장 가능한 공간을 차지하는 파일로 컴파일되는 소스 코드를 작성하십시오. 가장 큰 출력 파일이 이깁니다!
규칙
따라서 몇 가지 중요한 설명, 정의 및 제한이 있습니다.
- 컴파일 결과는 ELF 파일, Windows Portable Executable (.exe) 또는 JVM 또는 .Net의 CLR에 대한 가상 바이트 코드 여야합니다 (요청하는 경우 다른 유형의 가상 바이트 코드도 가능함). 업데이트 : Python의 .pyc / .pyo 출력도 계산 됩니다.
- 선택 언어를 이러한 형식 중 하나로 직접 컴파일 할 수없는 경우, 코드 변환 후 컴파일도 허용됩니다 ( 업데이트 : 동일한 언어를 두 번 이상 사용하지 않는 한 여러 번 변환 할 수 있음 ).
- 소스 코드는 여러 파일과 리소스 파일로 구성 될 수 있지만 이러한 모든 파일의 합산 크기는 512 바이트를 초과하지 않아야합니다.
- 소스 파일 및 선택 언어의 표준 라이브러리 이외의 다른 입력은 사용할 수 없습니다. 정적 링크 표준 라이브러리는 지원 될 때 정상입니다. 특히 타사 라이브러리 나 OS 라이브러리가 없습니다.
- 명령 또는 일련의 명령을 사용하여 컴파일을 호출 할 수 있어야합니다. 컴파일 할 때 특정 플래그가 필요한 경우 바이트 제한으로 계산됩니다 (예 : 컴파일 라인이
gcc bomb.c -o bomb -O3 -lm
인 경우-O3 -lm
부분 (7 바이트)이 계산됩니다 (초기 선행 공백은 계산되지 않음). - 프리 프로세서는 사용자 언어에 대한 표준 컴파일 옵션 인 경우에만 허용 됩니다 .
- 환경은 귀하에게 달려 있지만,이를 검증 할 수 있도록하려면 최신 (즉, 사용 가능한) 컴파일러 버전과 운영 체제를 고수하십시오 (사용중인 시스템을 분명히 지정하십시오).
- 오류없이 컴파일해야합니다 (경고는 괜찮습니다). 컴파일러 충돌은 아무것도 계산하지 않습니다.
- 어떤 프로그램이 실제로 하는 일은 그것이 무엇이든 악성되지 않을 수 있지만, 관계가 없습니다. 시작할 필요조차 없습니다.
실시 예 1
C 프로그램
main(){return 1;}
Apple LLVM version 7.0.2 (clang-700.1.81)
OS X 10.11 (64 비트)에서 컴파일 :
clang bomb.c -o bomb -pg
9228 바이트의 파일을 생성합니다. 총 소스 크기는 17 + 3 (의 경우 -pg
) = 20 바이트이며 이는 크기 제한 내에 있습니다.
실시 예 2
Brainfuck 프로그램 :
++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.--
-[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-.
다음을 사용하여 awib 로 c로 변환했습니다.
./awib < bomb.bf > bomb.c
그런 다음 Apple LLVM version 7.0.2 (clang-700.1.81)
OS X 10.11 (64 비트)에서 컴파일됩니다 .
clang bomb.c
8464 바이트의 파일을 생성합니다. 여기에 총 입력은 143 바이트입니다 ( @lang_c
wipe의 기본값이므로 소스 파일에 추가 할 필요가 없으며 명령에 특별한 플래그가 없습니다).
이 경우 임시 bomb.c 파일은 802 바이트이지만 소스 크기 나 출력 크기에 포함되지 않습니다.
최종 노트
4GB 이상의 출력이 달성되면 (아마 누군가 튜링 완료 전처리기를 발견 한 경우) 경쟁은 최소 크기의 파일을 생성하는 가장 작은 소스에 대한 경쟁이 될 것입니다 ( 너무 큰 제출을 테스트하는 것은 실용적이지 않습니다 ) .