梨树,256个不同的字节,975个字节
不幸的是,这个问题几乎需要一个最佳解决方案才能在某个位置包含一个NUL字节(因为它需要在某个位置包含所有256个字节)。这意味着a)我不能给您一个TIO链接(因为TIO不喜欢程序中的NUL,或者至少我还没有找到一种可以让我的浏览器处理的方式),并且b)我无法从字面上将程序粘贴到Stack Exchange。相反,我将一个xxd
可逆的十六进制转储放置在下面的“代码片段”链接的后面。
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= .
说明
该程序包括三个相同的部分。(在辐射加固程序中,将程序的多个相同部分连接起来对我来说是一个主题。)每棵梨树都需要在某处加一个校验和,以使解释器知道要运行程序的哪些部分。它会在运行程序之前将其校验和成功的程序的任何部分旋转到启动位置(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__
,因此仅会看到第三部分。它有五个以上的字符出现奇数次,因此会触发特殊情况以打印换行符。
验证
几乎所有经过辐射增强的“梨树”程序都必须检查的最后一件事是,删除操作是否偶然导致代码的不需要部分正确地进行校验和并将代码旋转到错误的位置;鉴于我们使用的是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!";
验证脚本确认该程序正常运行。