배나무, 256 개의 고유 바이트, 975 바이트
불행히도,이 질문에는 어딘가에 NUL 바이트를 포함하는 최적의 솔루션이 필요합니다 (어딘가에 256 바이트를 모두 포함해야하기 때문에). 이것은 a) TIO 링크를 제공 할 수 없다는 것을 의미합니다 (TIO는 프로그램에서 NUL을 싫어하기 때문에 또는 적어도 내 브라우저가 대처할 수있는 타이핑 방법을 찾지 못했기 때문에) b) 프로그램을 문자 그대로 Stack Exchange에 붙여 넣을 수 없습니다. 대신, xxd
아래의 "코드 스 니펫"링크 뒤에 숨겨진 가역 16 진수 덤프를 배치했습니다 .
00000000: 0a24 7a7b 242f 7d2b 2b3b 242f 3d24 5c3d .$z{$/}++;$/=$\=
00000010: 2440 3b21 247a 7b24 5f7d 3f24 7a7b 245f $@;!$z{$_}?$z{$_
00000020: 7d3d 313a 6465 6c65 7465 247a 7b24 5f7d }=1:delete$z{$_}
00000030: 666f 7220 7370 6c69 742f 2f2c 3c44 4154 for split//,<DAT
00000040: 413e 3b70 7269 6e74 206b 6579 7325 7a3e A>;print keys%z>
00000050: 353f 225c 6e22 3a6b 6579 7325 7a3b 5f5f 5?"\n":keys%z;__
00000060: 4441 5441 5f5f 2000 0102 0304 0506 0708 DATA__ .........
00000070: 090b 0c0d 0e0f 1011 1213 1415 1617 1819 ................
00000080: 1a1b 1c1d 1e1f 2326 2728 292a 2b2d 2e30 ......#&'()*+-.0
00000090: 3334 3536 3738 3942 4345 4647 4849 4a4b 3456789BCEFGHIJK
000000a0: 4c4d 4e4f 5051 5253 5556 5758 595a 5b5d LMNOPQRSUVWXYZ[]
000000b0: 5e60 6162 6367 686a 6d71 7576 7778 7c7e ^`abcghjmquvwx|~
000000c0: 7f80 8182 8384 8586 8788 898a 8b8c 8d8e ................
000000d0: 8f90 9192 9394 9596 9798 999a 9b9c 9d9e ................
000000e0: 9fa0 a1a2 a3a4 a5a6 a7a8 a9aa abac adae ................
000000f0: afb0 b1b2 b3b4 b5b6 b7b8 b9ba bbbc bdbe ................
00000100: bfc0 c1c2 c3c4 c5c6 c7c8 c9ca cbcc cdce ................
00000110: cfd0 d1d2 d3d4 d5d6 d7d8 d9da dbdc ddde ................
00000120: dfe0 e1e2 e3e4 e5e6 e7e8 e9ea ebec edee ................
00000130: eff0 f1f2 f3f4 f5f6 f7f8 f9fa fbfc fdfe ................
00000140: ff4b 3d20 ab0a 247a 7b24 2f7d 2b2b 3b24 .K= ..$z{$/}++;$
00000150: 2f3d 245c 3d24 403b 2124 7a7b 245f 7d3f /=$\=$@;!$z{$_}?
00000160: 247a 7b24 5f7d 3d31 3a64 656c 6574 6524 $z{$_}=1:delete$
00000170: 7a7b 245f 7d66 6f72 2073 706c 6974 2f2f z{$_}for split//
00000180: 2c3c 4441 5441 3e3b 7072 696e 7420 6b65 ,<DATA>;print ke
00000190: 7973 257a 3e35 3f22 5c6e 223a 6b65 7973 ys%z>5?"\n":keys
000001a0: 257a 3b5f 5f44 4154 415f 5f20 0001 0203 %z;__DATA__ ....
000001b0: 0405 0607 0809 0b0c 0d0e 0f10 1112 1314 ................
000001c0: 1516 1718 191a 1b1c 1d1e 1f23 2627 2829 ...........#&'()
000001d0: 2a2b 2d2e 3033 3435 3637 3839 4243 4546 *+-.03456789BCEF
000001e0: 4748 494a 4b4c 4d4e 4f50 5152 5355 5657 GHIJKLMNOPQRSUVW
000001f0: 5859 5a5b 5d5e 6061 6263 6768 6a6d 7175 XYZ[]^`abcghjmqu
00000200: 7677 787c 7e7f 8081 8283 8485 8687 8889 vwx|~...........
00000210: 8a8b 8c8d 8e8f 9091 9293 9495 9697 9899 ................
00000220: 9a9b 9c9d 9e9f a0a1 a2a3 a4a5 a6a7 a8a9 ................
00000230: aaab acad aeaf b0b1 b2b3 b4b5 b6b7 b8b9 ................
00000240: babb bcbd bebf c0c1 c2c3 c4c5 c6c7 c8c9 ................
00000250: cacb cccd cecf d0d1 d2d3 d4d5 d6d7 d8d9 ................
00000260: dadb dcdd dedf e0e1 e2e3 e4e5 e6e7 e8e9 ................
00000270: eaeb eced eeef f0f1 f2f3 f4f5 f6f7 f8f9 ................
00000280: fafb fcfd feff 4b3d 20ab 0a24 7a7b 242f ......K= ..$z{$/
00000290: 7d2b 2b3b 242f 3d24 5c3d 2440 3b21 247a }++;$/=$\=$@;!$z
000002a0: 7b24 5f7d 3f24 7a7b 245f 7d3d 313a 6465 {$_}?$z{$_}=1:de
000002b0: 6c65 7465 247a 7b24 5f7d 666f 7220 7370 lete$z{$_}for sp
000002c0: 6c69 742f 2f2c 3c44 4154 413e 3b70 7269 lit//,<DATA>;pri
000002d0: 6e74 206b 6579 7325 7a3e 353f 225c 6e22 nt keys%z>5?"\n"
000002e0: 3a6b 6579 7325 7a3b 5f5f 4441 5441 5f5f :keys%z;__DATA__
000002f0: 2000 0102 0304 0506 0708 090b 0c0d 0e0f ...............
00000300: 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f ................
00000310: 2326 2728 292a 2b2d 2e30 3334 3536 3738 #&'()*+-.0345678
00000320: 3942 4345 4647 4849 4a4b 4c4d 4e4f 5051 9BCEFGHIJKLMNOPQ
00000330: 5253 5556 5758 595a 5b5d 5e60 6162 6367 RSUVWXYZ[]^`abcg
00000340: 686a 6d71 7576 7778 7c7e 7f80 8182 8384 hjmquvwx|~......
00000350: 8586 8788 898a 8b8c 8d8e 8f90 9192 9394 ................
00000360: 9596 9798 999a 9b9c 9d9e 9fa0 a1a2 a3a4 ................
00000370: a5a6 a7a8 a9aa abac adae afb0 b1b2 b3b4 ................
00000380: b5b6 b7b8 b9ba bbbc bdbe bfc0 c1c2 c3c4 ................
00000390: c5c6 c7c8 c9ca cbcc cdce cfd0 d1d2 d3d4 ................
000003a0: d5d6 d7d8 d9da dbdc ddde dfe0 e1e2 e3e4 ................
000003b0: e5e6 e7e8 e9ea ebec edee eff0 f1f2 f3f4 ................
000003c0: f5f6 f7f8 f9fa fbfc fdfe ff4b 3d20 ab ...........K= .
설명
이 프로그램은 세 개의 동일한 부분으로 구성됩니다. ( 복사 프로그램에서 여러 개의 동일한 부분을 연결하는 것은 저에게있어 주제입니다 .) 모든 Pear Tree는 통역사에게 프로그램의 어느 부분을 실행할지 알려주는 체크섬이 필요합니다. 체크섬을 실행하기 전에 체크섬이 시작된 프로그램의 일부를 회전 시키거나 인쇄합니다.a partridge
체크섬이 일치하지 않으면 합니다). 이 경우 세 부분 각각에 체크섬이 있으므로 조사되지 않은 부분이 시작 부분으로 이동합니다. 따라서 프로그램이 수정되지 않은 부분으로 구성되고 그 다음에 두 개의 다른 부분 (하나가 수정되었을 수 있음)으로 구성되어 있다고 가정 할 수 있습니다.
각 부분은 개행으로 시작한 후 다음 코드로 계속 진행합니다 (아래에 공백과 주석을 추가했습니다).
$z{$/}++; # In the hash table %z, set the key "\n" to 1
$/=$\=$@; # Turn off newline handling when reading ($/ = undef);
# Also don't add newlines when printing ($\ = undef)
# $@ is set to undef by default
!$z{$_}? # If the current character is not in the hash table %z
$z{$_}=1: # place it in the hash table %z
delete$z{$_} # else remove it from the hash table %z
for split//, # for each character in
<DATA>; # the text appearing from the line beneath __DATA__ to EOF
print # Print the following (no newline because $\ was undefined):
keys%z>5? # if the hash table %z contains more than 5 elements:
"\n": # a newline; otherwise
keys%z; # every key of %z, separated by spaces
__DATA__ # Start a string literal running from after this line to EOF
그 후에는 지금까지 프로그램에서 사용되지 않은 모든 옥텟 (순수하게 점수를 매기기 위해)의 사본과 체크섬이 나온다. (후행 줄 바꿈이 없습니다. 부분은 줄 바꿈으로 시작하지만 줄 바꿈으로 끝나지 않습니다.)
여기에는 세 가지 경우가 있습니다.
- 개행 문자 이외의 문자가 삭제되었습니다 . 이 경우 두 번째와 세 번째 부분에 홀수 번 표시됩니다. 즉
%z
, 홀수 횟수 에서 추가 및 / 또는 제거되어 최종적으로 해시 테이블로 끝납니다. 사실, 해시 테이블 의 유일한 키가 될 것입니다 (두 번째 부분의 개행 이후부터 세 번째 부분의 끝까지 문자열이 실행되고 해시 테이블은 단일 개행으로 시작됨) 그냥 저절로 인쇄됩니다.
- 첫 번째 또는 세 번째 줄 바꿈이 삭제되었습니다 . 이 경우 프로그램이 누락 된 줄 바꿈의 세 번째 줄이되도록 회전하여 두 번째 및 세 번째 부분을 한 줄로 효과적으로 병합합니다. 통해 액세스되는 문자열 리터럴
<DATA>
에는 모든 문자가 여러 번 포함되므로 해시 테이블에는 원래 내용과 단일 줄 바꿈이 포함되어 인쇄됩니다.
- 두 번째 줄 바꿈이 삭제되었습니다 . 이 경우, 프로그램은 회전하지 않으며 (첫 번째 파트에는 유효한 체크섬이 있으므로) 두 번째 파트는 첫 번째 파트와 같은 줄로 이동합니다.
<DATA>
아래 행에서만 읽기 시작 __DATA__
하므로 세 번째 부분 만 표시됩니다. 여기에는 홀수 번 표시되는 5 개 이상의 문자가 있으므로 개행을 인쇄하는 특수한 경우를 트리거합니다.
확인
방사선으로 강화 된 거의 모든 항목을 검사해야하는 마지막 한 가지 배나무 프로그램은 삭제로 인해 코드의 원하지 않는 부분이 무작위로 올바르게 체크섬되고 코드가 잘못된 위치로 회전하는지 여부가 발생합니다. 우리가 32 비트 체크섬을 사용하고 있다고 가정하면, 이것은 불가능하지만 불가능하지는 않습니다. 다음과 같은 무차별 대입 스크립트를 사용하여 삭제가 발생하지 않도록했습니다.
use 5.010;
use IPC::Run qw/run/;
use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Useqq=1;
$Data::Dumper::Terse=1;
$Data::Dumper::Indent=0;
undef $/;
$| = 1;
my $program = <>;
for my $x (0 .. (length($program) - 1)) {
my $p = $program;
my $removed = substr $p, $x, 1, "";
alarm 4;
say Dumper($p);
run [$^X, '-M5.010', 'apeartree.pl'], '<', \$p, '>', \my $out, '2>', \my $err;
if ($out ne $removed) {
print "Unexpected output deleting character $x ($removed)\n";
print "Output: {{{\n$out}}}\n";
print "Errors: {{{\n$err}}}\n";
exit;
}
}
say $program;
run [$^X, '-M5.010', 'apeartree.pl'], '<', \$program, '>', \my $out, '2>', \my $err;
if ($out ne '') {
print "Unexpected output not mutating\n";
print "Output: {{{\n$out}}}\n";
print "Errors: {{{\n$err}}}\n";
exit;
}
say "All OK!";
확인 스크립트는이 프로그램이 올바르게 작동하는지 확인합니다.