Pear Tree、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= .
説明
このプログラムは、3つの同じ部分で構成されています。(プログラムの複数の同一部分を連結することは、放射線硬化プログラムのテーマの1つです。)すべてのナシの木は、プログラムのどの部分を実行するかをインタプリタに知らせるためにどこかにチェックサムが必要です。チェックサムが実行される前に、チェックサムが開始に成功したプログラムの任意の部分を回転します(またはa partridge
、チェックサムが一致しない場合に出力します)。この場合、3つの部分のそれぞれにチェックサムがあるため、照射されていない部分は最初に移動します。したがって、プログラムは、変更されていない部分と、それに続く他の2つの部分(1つは変更されている可能性があります)で構成されていると想定できます。
各部分は改行で始まり、次のコードに続きます(以下に空白とコメントを追加しました)。
$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
その後、これまでプログラムで使用されていなかったすべてのオクテットのコピー(純粋にスコアを実行するため)と、最後にチェックサムが来ます。(末尾の改行はありません。パーツは改行で始まりますが、改行で終わらないでください。)
ここには3つの異なるケースがあります。
- 改行以外の文字が削除されました。この場合、2番目と3番目の部分に奇数回表示されます。つまり
%z
、奇数回追加または削除され、最終的にハッシュテーブルになります。実際、それはハッシュテーブル内の唯一のキーになります(2番目の部分の改行の後から3番目の部分の終わりまで文字列が実行され、ハッシュテーブルは1つの改行だけで開始されるため)そのまま印刷するだけです。
- 最初または3番目の改行が削除されました。この場合、プログラムは3番目の改行が欠落するように回転し、2番目と3番目の部分を1行に効果的にマージします。経由でアクセスされる文字列リテラルに
<DATA>
は、すべての文字が偶数回含まれているため、ハッシュテーブルには元のコンテンツと単一の改行が含まれ、印刷されます。
- 2番目の改行が削除されました。この場合、プログラムは(最初の部分に有効なチェックサムがあるため)回転されないため、2番目の部分は最初の部分と同じ行に移動します。
<DATA>
以下の行からのみ読み取りを開始する__DATA__
ため、3番目の部分のみが表示されます。これには奇数回出現する5文字以上があるため、改行を印刷する特別なケースがトリガーされます。
検証
耐放射線性が高いA Pear Treeプログラムについて確認する必要がある最後の1つは、削除によってコードの不要なセクションがランダムに正しくチェックサムされ、コードが間違った場所にローテーションされるかどうかです。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!";
検証スクリプトは、このプログラムが正しく機能することを確認します。