辐射探测器!


26

防辐射程序是一种程序,其中如果删除了代码中的任何字符,该程序仍将起作用。对于这个问题,我们将编写一个程序来检测何时被照射。

编写一个程序或函数,当删除任何单个字节时,结果程序将输出该字节,并且仅输出该字节。(您可以多次输出该字节,只要不输出其他字节

规则:

  • 该程序必须包含至少2个不同的字节。(没有仅0的解决方案;)
  • 原始程序做什么都没关系
  • 无需阅读自己的源代码。
  • 该代码将以最大字节数获胜的不同字节数计分。例如,abc= 3分,ababba= 2分,abc获胜。
    • 决胜局是较小的字节数,其后是较早的提交时间

祝好运!



我错过了那条线。真可惜!
Mego

5
“代码将根据不同字符的数量进行评分,其中最高的字符获胜。” 我希望大多数(如果不是全部)解决方案在某处都具有某种形式的字符串,它们可以用任意字符填充而无需实际更改解决方案(所以这取决于您的语言是限于ASCII,扩展ASCII还是Unicode) 。
马丁·恩德

3
...沙盒并不完美。:( / /您可以只测量“不同的字节”而不是“不同的字符”,因为字符与编码和其他问题有关
。– user202729

1
程序可以接受任何输入吗?
gggg

Answers:


15

05AB1E9 7个字节(3分)

22'''rr

在线尝试!

卸下 '

'删除所有内容后,22''rr结果22将成为堆栈中的第一件事,而成为堆栈'中的最后一件事,当反转两次时,结果为'

卸下 r

r删除任何内容后,22'''r结果22将成为堆栈中的第一件事,成为堆栈'中的第二件事,并且成为堆栈r中的最后一件事情。r但是,此前缀以a开头',使它成为隐式打印的文字字符串"r"(与command相对reverse stack)。

卸下 2

2除去任何内容,2'''rr将导致2成为堆栈上的第一件事,成为堆栈'上的第二件事,最后r成为堆栈上的最后一件事情,一旦反转,结果为2

因此,此答案是有效的。没有删除任何内容',它就输出无关紧要的。这对于除2以外的任何数字也适用。


创建了有效性检查器,您可以使用它来竞争05AB1E *。

*我不是100%不确定05AB1E中可能有多少解决方案...


更有效或更糟的解决方案

  • 1点(无效)
  • 2点
    • '''''''VV'''''''XX'''''''<any command that pops a without pushing>x2
    • '大于3的任何奇数,后跟s大于1 的任何偶数(EG '''''''''ssss)。
    • '''..周期数大于1且奇数'大于2。
  • 3点
    • '\\'''rr-同样的想法22'''rr,但\被“删除最后一个堆项目”。

'如您所说,规则的正常输出是无关紧要的。但这确实使检测异常的名义目标无效,这有点可笑。
gggg

1
@gggg我相当确定至少我的一个替代品不会打印任何内容。
魔术章鱼缸

1
@MagicOctopusUrn不客气。只是以为我最好还是编辑而不是发表评论。
boboquack

@boboquack的原始标签(@boboquack)是否起作用,还是您通过再次查看该帖子找到了它?我试图弄清楚当用户从未发表评论时标签如何工作。
魔术章鱼缸

@boboquack我的意思是您收到我“谢谢”的通知吗?另外,我们可能应该删除此线程,直到我为您的“不客气” +1。
魔术章鱼缸

9

Brainfuck,得分3

可能没有竞争,因为只能通过内存转储看到输出。

+++++++++++++++++++++++++++++++++++++++++++++,-

假设输入为空,并且EOF保持单元不变。使用将内存转储到输出(例如this)的解释器。

删除一个加号,内存是“ +”的unicode值,否则是“,”的unicode值。虽然它更像是个规则弯腰而不是答案。与“-”几乎相同。滥用了这三个字符在unicode-字符集中是一个接一个的事实。


老实说,聪明,不要认为这是一个漏洞。
魔术章鱼缸

您假设EOF保持单元不变,是吗?
Jo King

是啊,只要没有输入,它应该是罚款😊
哈佛尼加德

我很想允许这样做,但是您是否一个具有内存转储的解释器,该转储仅输出已更改的单元并在EOF上保持单元不变?
Jo King

1
copy.sh/brainfuck这应该可以正常工作。只需运行它,然后点击“查看内存”即可。
哈瓦德·尼格德

9

梨树,256个不同的字节,975个字节

不幸的是,这个问题几乎需要一个最佳解决方案才能在某个位置包含一个NUL字节(因为它需要在某个位置包含所有256个字节)。这意味着a)我不能给您一个TIO链接(因为TIO不喜欢程序中的NUL,或者至少我还没有找到一种可以让我的浏览器处理的方式),并且b)我无法从字面上将程序粘贴到Stack Exchange。相反,我将一个xxd可逆的十六进制转储放置在下面的“代码片段”链接的后面。

说明

该程序包括三个相同的部分。(在程序中,将程序的多个相同部分连接起来对我来说是一个主题。)每棵梨树都需要在某处加一个校验和,以使解释器知道要运行程序的哪些部分。它会在运行程序之前将其校验和成功的程序的任何部分旋转到启动位置(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!";

验证脚本确认该程序正常运行。


7

Stax,11个字节(4分)

'''cc'~~'dd

在线运行和调试!

我很荣幸能够以分数(大于或等于4)的分数(按时间顺序)对这一挑战做出第一个答案。也许分数可能更高。

在Stax中,由单个字符组成的字符串文字用编写''', 'c, 'd, '~所有字符串文字也是如此。用于c d和的相应命令分别~复制主堆栈的顶部,弹出主堆栈的顶部和弹出主堆栈的顶部并压入输入堆栈。对于这个挑战,输入堆栈不会影响输出,也不重要,因此可以说d并且~是相同的。

说明

最好将代码分为几部分,并分别考虑。

当不被篡改时,'''cc将一个字面量'和一个字面量推c入主堆栈,并复制顶部,因此堆栈将是(从下至下)c,c,'

如果不加以篡改,则'~~推入文字~,然后将其弹出(并推入输入堆栈),这对于主堆栈基本上是无操作的。

当不被篡改时,压'dd入立即数d,然后将其弹出,这是主堆栈的另一个禁止操作。

在程序结束时,由于未执行任何显式输出,因此将隐式打印出主堆栈的顶部。

如果程序按原样运行,则最终堆栈将保持不变c,c,'并将输出c

如果第一部分变为''cc,则我们有一个文字'和两个复制指令,最后一个堆栈为',','。假设其他两个部分均为无操作,则结果将为'

如果第一部分变为'''c,则结果与未篡改的部分基本相同,但c不会重复。因此堆栈将是c,'。在两次无操作之后,堆栈的顶部是c

因此,我们可以在第一部分中检测辐射。

第二部分和第三部分以完全相同的方式工作。我将以第三部分为例。

如果对第三部分进行了篡改,则前两个部分将保持不变,并且在运行第三部分之前的堆栈将保持不变。 c,c,'

如果第三部分变为'd,则将文字d推入主堆栈的顶部,并且不再进行其他操作。现在d将输出主堆栈的顶部。

如果第三部分变为dd,则从主堆栈中弹出两个元素,现在'并输出堆栈的顶部。

因此,我们可以在第三部分中检测辐射。出于相同的原因,我们可以在第二部分中检测辐射。


5

05AB1E,得分2,6字节

„"""„„

有时会打印两倍于删除的字符。不包含'

怎么运行的:

删除第一个

"""„„

在线尝试!

首先,我们将空字符串文字压入堆栈。然后我们推送„„,它会隐式打印。

卸下 "

„""„„

在线尝试!

首先,我们""使用2-char string指令将堆栈压入堆栈。然后,我们尝试获取另一个2个字符的字符串,但这被中止(我不确定原因),并且将""打印出来。

卸下第二个或第三个

„"""„

在线尝试!

首先,我们""使用2-char string指令将堆栈压入堆栈。然后我们推送,它会隐式打印。


5

果冻,5个字节,得分2

”””ḷḷ

在线尝试!

删除任何内容:

””ḷḷ

在线尝试!

字符以一字节字符字面量开头。该程序以””产生字符串开始。该对子采取它的左参数。该字符串仅通过的两个实例传递

删除任何内容:

”””ḷ

在线尝试!

在此程序中,””产生字符,然后”ḷ产生字符,仅此字符被输出。


其他解决方案

  • 许多其他字符(例如ao可以代替此提交)。
  • ⁾⁾⁾⁾FFF。这以类似的方式工作。就像,但是它开始一个两个字节的字符串文字。“辐照”程序输出两次删除的字节,该字节在注释中被认为是有效的。

是Magic Octopus Urn的有效性检查器的果冻版本(少得多)。输出的左列是删除的字符,右列是结果程序的输出。


我的有效性检查器不符合要求。对于发布的其他解决方案,它失败;)。
魔术章鱼缸
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.