编写一个无错误终止的程序。
如果任何单个字节被任何其他字节替换,则程序应输出
CORRUPTED
- 不要从文件中读取源代码
- 您的程序不应产生任何其他输出
这是代码高尔夫球,因此最短的答案以字节为单位。
编辑:删除了“不损坏”要求
编写一个无错误终止的程序。
如果任何单个字节被任何其他字节替换,则程序应输出
CORRUPTED
这是代码高尔夫球,因此最短的答案以字节为单位。
编辑:删除了“不损坏”要求
Answers:
$@='NOT ';print"$@CORRUPTED"__DATA__ =®®”print"$@CORRUPTED"__DATA__ =®®”Ê®›~
该程序包含一些无效的UTF-8杂散八位字节。因此,它显示为Windows-1252中的样子。(默认情况下,如果“梨树”在字符串文字或类似文字中看到非ASCII八位位组,则会将其视为不透明对象,并且在不了解其字符代码的情况下就不会试图理解它;这种行为可以是通过编码声明进行了更改,但该程序没有一个。因此,该程序在逻辑上处于“未指定ASCII兼容字符集”。无论如何,所有非ASCII八位字节都在注释中,因此,这并不重要。)
梨树校验和程序,查找具有CRC-32的最长子串 00000000
。(如果有平局,它将首先按八位字母顺序进行选择。)然后旋转程序以将其放在开始位置。最后,该程序被解释为几乎是Perl的超集的语言,定义了Perl中未定义的一些内容,以与Python中相同的方式工作(并做了一些小的更改,例如,print
在A Pear Tree中打印最终换行符)但不是在Perl中)。这种机制(以及整个语言)是为解决多声和辐射硬化问题而设计的;这不是前者,但绝对是后者。
在此程序中,我们有两个值得注意的子字符串,CRC-32分别为00000000
; 整个程序都会这样做,而它print"$@CORRUPTED"__DATA__ =®®
本身也会这样做(出现两次)。这样,如果程序没有损坏,它将设置$@
为NOT
,然后打印,然后再打印CORRUPTED
。如果程序损坏,则整个程序的CRC-32将无法匹配,但较短的部分之一将保持不变。旋转到程序开始处的任何一个都将仅打印CORRUPTED
,如$@
空字符串一样。
字符串打印完成后, __DATA__
将用于防止程序其余部分运行。(我想写这样的代码__END__
可以用它代替,这显然可以节省两个字节。但是我现在最好发布这个版本,因为我花了很多时间来验证它,而修改后的版本必须是由于CRC的更改而重新验证了;并且我还没有为“有效载荷”打高尔夫而付出大量的努力,所以我想看看是否有人在我可以同时纳入的注释方面有其他改进。请注意,#
这在字符损坏到换行符的情况下不起作用。)
您可能想知道我是如何首先控制代码的CRC-32的。这是一个非常简单的数学技巧,它基于CRC-32的定义方式:您将代码的CRC-32写入,以低位字节序写入(与CRC-32计算通常使用的字节顺序相反)程序),并与9D 0A D9 6D
。然后将其附加到程序中,您将拥有一个CRC-32为0的程序。(作为最简单的示例,空字符串的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! ";