挑战
我向您介绍了另一种间谍对抗间谍挑战,点刺混淆器与饼干。但是,在这种情况下,要保护的数据不是输入而是输出。
挑战的规则很简单。编写具有以下规范的例程:
- 该例程可以用任何语言编写,但不能超过320个字节。
- 该例程必须接受三个32位带符号整数作为输入。它可以采用接受3个参数的函数,接受单个3元素数组的函数或从任何标准输入读取3个整数的完整程序的形式。
- 该例程必须输出一个带符号的32位整数。
- 在所有可能的输入中,例程必须输出2到1000(含)之间的唯一值。例程可以输出的唯一值的数量称为其键。
例如,C程序
int foo( int i1, int i2, int i3 ) {
return 20 + (i1^i2^i3) %5;
}
具有9的关键,因为它(希望)只能输出的九个值16
,17
,18
,19
,20
,21
,22
,23
,和24
。
其他一些限制如下:
- 该例程必须是完全确定性的并且是时不变的,对于相同的输入返回相同的输出。该例程不应调用伪随机数生成器。
- 该例程可能不依赖于“隐藏变量”,例如文件中的数据,系统变量或深奥的语言功能。例如,例程通常不应引用常量,除非常量在代码本身中明确定义。强烈建议不要使用依赖于编译器怪癖的例程,数学上未定义的操作的输出,算术错误等。如有疑问,请询问。
- 您(编码人员)必须精确知道例程可以产生多少个唯一输出,并且应该能够提供至少一个产生每个输出的输入序列。(由于可能有成百上千的唯一输出,因此只有在您的密钥被争用的情况下才需要此集合。)
由于此问题与经典加密几乎没有相似之处,因此,我希望它将为更多的读者所熟悉。
越有创意,就越好。
计分
每字节计数最短的未破解提交将被宣布为获胜者。
如果有任何混淆,请随时提出或评论。
反挑战
鼓励所有读者,包括那些已提交自己例程的读者,“破解”提交的内容。当提交的密钥发布在关联的注释部分中时,该提交将被破解。如果提交的内容持续存在72小时而不被修改或破解,则被认为是“安全的”,随后在破解方面的任何成功都将被视为比赛的原因。
每个读者每次提交只能进行一次破解尝试。例如,如果我向用户X提交:“您的密钥是20”,但我错了,用户X将拒绝我的猜测为错误,并且我将不再能够为该提交提交其他猜测。
破解的提交将被排除在争用之外(前提是它们不安全)。不应对其进行编辑。如果读者希望提交新的例程,则应在单独的答案中提交。
破解者的分数是破解者提交的内容(符合或不符合)的数量。对于计数相同的饼干,排名由所有破解提交中的总字节数决定(越高越好)。
得分最高的饼干将与获胜常规的开发者一起宣布为获胜者。
请不要破解您自己的提交。
祝你好运。:)
排行榜
上次更新时间:9月2日,美国东部标准时间上午10:45
不可逾越的壁垒(非破解提交):
- CJam,105 [丹尼斯]
不可阻挡的力量(爆竹):
- 丹尼斯[ Java,269 ; C,58;Mathematica,29 ]
- 马丁·布特纳[ Java,245 ]
return
等...