오류없이 종료되는 프로그램을 작성하십시오.
단일 바이트가 다른 바이트로 대체되면 프로그램은 출력해야합니다
CORRUPTED
- 파일에서 소스 코드를 읽지 마십시오
- 귀하의 프로그램은 다른 출력을 생성해서는 안됩니다
이것은 코드 골프 이므로 바이트 단위의 최단 답변이 이깁니다.
편집 : "NO CORRUPTED"요구 사항 제거
오류없이 종료되는 프로그램을 작성하십시오.
단일 바이트가 다른 바이트로 대체되면 프로그램은 출력해야합니다
CORRUPTED
이것은 코드 골프 이므로 바이트 단위의 최단 답변이 이깁니다.
편집 : "NO CORRUPTED"요구 사항 제거
답변:
$@='NOT ';print"$@CORRUPTED"__DATA__ =®®”print"$@CORRUPTED"__DATA__ =®®”Ê®›~
이 프로그램에는 유효한 UTF-8이 아닌 일부 부유 옥텟이 포함되어 있습니다. 따라서 Windows-1252와 같이 표시됩니다. (기본적으로 A Pear Tree가 문자열 리터럴 등에서 비 ASCII 옥텟을 보는 경우 불투명 오브젝트로 취급하고 문자 코드가 무엇인지 인식하는 것 이상으로 이해하려고 시도하지 않습니다.이 동작은 다음과 같습니다. 인코딩 선언을 통해 변경되었지만 프로그램에없는 경우 프로그램은 논리적으로 "지정되지 않은 ASCII 호환 문자 세트"에 있습니다. ASCII가 아닌 모든 8 진수는 주석으로 표시되므로 실제로 중요하지 않습니다.)
Pear Tree는 프로그램을 체크섬하여 CRC-32가 가장 긴 하위 문자열을 찾습니다 00000000
. (넥타이가있는 경우 먼저 옥텟으로 선택합니다.) 그러면 프로그램이 회전하여 시작 부분에 배치됩니다. 마지막으로, 프로그램은 파이썬으로 (그리고 몇 가지 사소한 변경, 예와 같은 방식으로 작동하는 Perl로 정의되지되는 몇 가지를 정의, 거의 펄의 상위 집합의 언어로 해석됩니다 print
배나무 트리 인쇄 최종 개행 그러나 Perl에는 없습니다). 이 메커니즘 (및 언어 전체)은 폴리 글 로트 및 방사선 경화 문제를 위해 설계되었습니다 . 이것은 전자가 아니지만 확실히 후자입니다.
이 프로그램에는 CRC-32에 주목할만한 두 개의 하위 문자열이 있습니다 00000000
. 전체 프로그램은 print"$@CORRUPTED"__DATA__ =®®
그 자체로 수행됩니다 (두 번 표시됨). 따라서 프로그램이 손상되지 않으면로 설정 $@
되어 NOT
인쇄됩니다 CORRUPTED
. 프로그램이 손상된 경우 프로그램의 CRC-32는 전체적으로 일치하지 않지만 짧은 섹션 중 하나는 손상되지 않습니다. null 문자열 CORRUPTED
과 마찬가지로 프로그램 시작 부분으로 회전하는 것이 인쇄 $@
됩니다.
문자열이 인쇄되면 __DATA__
나머지 프로그램이 실행되는 것을 막기 위해 사용됩니다. ( __END__
대신 2 바이트를 절약 할 수있는 이것을 쓸 수 있다고 생각합니다. 그러나이 버전을 확인하는 데 많은 시간을 소비했기 때문에이 버전을 게시 할 수도 있습니다. 수정 된 버전은 CRC 변경으로 인해 다시 확인되었으며 아직 "페이로드"를 골프화하는 데 많은 노력을 기울이지 않았으므로 동시에 통합 할 수있는 다른 의견이 있는지 확인하고 싶습니다. 주 #
캐릭터가 개행 문자로 손상된 상황에서 작동하지 않습니다.)
처음에 내 코드의 CRC-32를 어떻게 제어했는지 궁금 할 것입니다. 이것은 CRC-32가 정의 된 방식에 따라 상당히 간단한 수학적 트릭입니다. 코드의 CRC-32를 취하여 리틀 엔디안 순서 (일반적으로 CRC-32 계산에 사용되는 바이트 순서의 역순)로 작성하십시오. 프로그램) 및 XOR with 9D 0A D9 6D
. 그런 다음 프로그램에 추가하면 CRC-32가 0 인 프로그램이 만들어집니다. (가장 간단한 예로, null 문자열의 CRC-32는 0이므로 9D 0A D9 6D
CRC-32도 0입니다. .)
배나무는 대부분의 돌연변이를 처리 할 수 있지만, "변경된"은 "임의의 옥텟으로 대체"를 의미한다고 가정합니다. 이론 상으로는 (이 짧은 프로그램에서는 그렇지 않을 수도 있지만) 어딘가에 잘못된 프로그램이 실행될 수있는 해시 충돌이있을 수 있으므로 가능한 모든 옥텟 대체로 인해 프로그램이 올바르게 작동하는지 잔인한 힘으로 확인해야했습니다. 내가 사용한 확인 스크립트 (Perl로 작성)는 다음과 같습니다.
use 5.010;
use IPC::Run qw/run/;
use warnings;
use strict;
undef $/;
$| = 1;
my $program = <>;
for my $x (0 .. (length $program - 1)) {
for my $a (0 .. 255) {
print "$x $a \r";
my $p = $program;
substr $p, $x, 1, chr $a;
$p eq $program and next;
alarm 4;
run [$^X, '-M5.010', 'apeartree.pl'], '<', \$p, '>', \my $out, '2>', \my $err;
if ($out ne "CORRUPTED\n") {
print "Failed mutating $x to $a\n";
print "Output: {{{\n$out}}}\n";
print "Errors: {{{\n$err}}}\n";
exit;
}
}
}
say "All OK! ";