该程序充满了不可打印的字符,因此这是一个十六进制转储:
00000000: 2573 dc01 7e13 dcb6 1f %s..~....
注意:这使用了不能输入负数的数字输入例程,因此此提交仅限于非负整数。
警察和强盗挑战的一个问题是您不编写代码说明(以使其难以破解)。另一方面,这意味着我不必在这里麻烦。
我之所以选择7作为语言,是因为,尤其是它的压缩表示法,它很难阅读,而且我不明白为什么只有我一个人才需要麻烦去处理用8位代码编写的程序块3位编码。祝好运!
说明
既然程序已被破解(不幸的是,被暴力破解;在这些简短的解决方案中,这始终是一种危险),我也可以解释一下我的意思。通过阅读程序,这实际上可以解决。我本来可以使难度变得更大,但是当存在蛮力裂缝时,那感觉真是个坏主意。
我们将以更自然的编码表示程序。与往常一样,粗体的数字指示的是立即运行(不是所有这些都在一个程序中的可表示;命令6
和7
是但2
以5
不),不用粗体数字表示它们的转义当量(0
到5
,所有这些都是在原始程序中的可表示;注这0
是逃脱的6
,1
也是逃脱的7
):
112 7 1 7 34002 77 023 67 13303
在7个程序源代码中可用的命令集意味着它基本上只是表示原始堆栈的文字(仅对转义的命令6
和,您无能为力7
)。因此,程序要做的第一件事就是将一堆东西压入堆栈。这是程序运行后堆栈的外观(|
按7中的常规分隔堆栈元素):
772 | 7 | 34662 | 023 | 73363
然后,最后的堆栈元素被复制以成为要运行的代码(同时保留在堆栈中)。碰巧的是,这是程序唯一的代码部分。其他一切都只是数据。它的意思是:
73363
7将 一个空元素推到堆栈上
3 输出顶部堆栈元素,丢弃下面的元素
73的 组合效果:丢弃顶部堆栈元素
3 输出顶部堆栈元素,丢弃下面的元素
6 转义顶部堆栈元素,然后将其附加到下面的元素
3 输出顶部堆栈元素,放弃下面的元素
换句话说,这几乎只是一堆I / O指令。让我们详细分析一下:
73
丢弃73363
仍在堆栈顶部的那一个。
3
输出023
,并丢弃34662
。因此可以看出,34662
是注释,它用于存储程序其他版本中所需的字节。至于023
输出时的操作,它选择I / O格式0(整数),然后23
是一个指令,要求实现输入整数(在7中,您通过输出请求输入的特定代码来完成输入)。通过在下面复制堆栈元素来完成输入,例如,如果输入整数为10,则下一个堆栈元素(当前为7
)将变为7777777777
。因此,我们接受来自用户的十进制输入,但将其存储为一元。
6
转义顶部的堆栈元素(将的每个实例更改7
为1
;这是7
转义完全由s 组成的字符串的方式),然后将其附加到(772
)之前的堆栈元素中。因此,我们的数据现在类似于7721111111111
。
- 最后,
3
输出有问题的堆栈元素(并弹出默认初始堆栈一部分的空白堆栈元素)。它的值是通过取数计算1
S和7
S,并且减去的数0
S和6
秒。(2
在大多数情况下,中间的会被忽略;如果它在字符串的末尾,它将成为尾随的换行符而不是被忽略,但是PPCG规则对此并不在意。)因此,输出是原始的输入加2。
此时,堆栈上没有任何有用的东西,程序中也没有任何东西,因此程序退出。
我们如何扭转这种情况?只需将11
to 更改为一个简单的问题00
,这样我们就可以在输入的字符前面加上使其变低2而不是变高2的输入。程序中还有一个00
方便隐藏的8个八进制数字(以便八进制数字和字节彼此对齐),因此我们可以11
在开始时简单地将其与交换。