Cheapo Enigma机(警察)


15

对于强盗帖子,Cheapo Enigma机器(Robbers)

警察的提交将包含一个程序/函数,该程序/函数接受一个字节的数据并返回一个字节的数据。每个可能的输入都必须产生唯一的输出。(换句话说,您的函数必须是双射的)

强盗将尝试使用尽可能短的代码来创建您的逆函数。因此,您的目标是使函数难以反转。

您不能使用仅用于哈希或加密目的的内置程序。

您的字节数不能超过64个字节。0字节的解决方案不符合获胜条件。

输入/输出格式

8位(0或1),或1-256、0-255或-128至127范围内的10进制整数。可以使用标准I / O或文件I / O。函数也可以返回一个值作为输出。输入和输出应属于同一范围(二进制,1-256、0-255或-128至127)。强盗也将需要使用此范围进行输入和输出。

计分

您的字节数与最强盗对您的尝试次数之比。最低分获胜。

仅当强盗试图击败您时,您才有资格赢得(作为警察)。(这个强盗可能是你)

C ++,使用0-255范围,31个字节

int x;
cin>>x;
cout<<(x+1)%256;

C ++中可能的强盗提交,32字节

int f(int x)
{return x?x-1:255;}

不需要使用相同的语言或类似的算法

这给警察和强盗的得分都是31/32 = 0.97。


1
警察提交的内容包括什么?语言,大小和完整的程序/功能代码?
Arnauld

1
如果警察能制造出任意大的东西,这有点破损吗?
破坏的柠檬

1
这个强盗可能是你我张贴如果一个64字节的警察回答映射N至N和强盗的答案,做在一个字节是一回事吗?
Arnauld

1
您可能想指定在强盗回答时是否/如何更新警察提交的文件。(我想,通常的“破解”更新不适用于此处。至少不是唯一和确定的破解。)
Arnauld

3
再次考虑,您可能希望完全删除该规则。通过在Jelly中发布强盗,我可以销毁大多数答案。
丹尼斯

Answers:


7

Javascript,11 8个字节,得分:8/5

x=>x^x/2

格雷码的简单实现。通常,解码需要一个完整的循环。让我们看看谁提出的最小,甚至没有循环!


我想x^x/4会更难,因为不应该为此而建...
Christoph


1
这种双射如何?
Leaky Nun

1
@LeakyNun Uhm不知道您希望得到什么样的答案,但是我会尝试:格雷码是表示数字的另一种形式,其中每个连续的数字仅变化1位(汉米格距离始终为1)。对于每个数字,只有一个灰度编码和一个二进制编码,因此它们形成了双射。例如,二进制7是0111,灰色是0100,下一个数字8是二进制1000和灰色1100。格雷编码基本上是二进制的边缘编码。
Christoph'Apr

1
@LeakyNun ^是按位异或,而不是求幂。反正它看起来魔术
ЕвгенийНовиков

7

C,64字节,得分64/71 = 0.901

T[256];f(x){srand(x&&f(x-1));for(;T[x=rand()%256]++;);return x;}

输入范围为[0 255]的输入。

在线尝试!—在TIO(使用GCC)上,将产生:

103,198,105,115,081,255,074,236,041,205,186,171,242,251,227,070,
124,194,084,248,027,232,231,141,118,090,046,099,051,159,201,154,
102,050,013,183,049,088,163,037,093,005,023,233,094,212,178,155,
180,017,014,130,116,065,033,061,220,135,112,062,161,225,252,001,
126,151,234,107,150,143,056,092,042,176,059,175,060,024,219,002,
026,254,067,250,170,058,209,230,148,117,216,190,097,137,249,187,
168,153,015,149,177,235,241,179,239,247,000,229,202,011,203,208,
072,071,100,189,031,035,030,028,123,197,020,075,121,036,158,009,
172,016,080,021,111,034,025,125,245,127,164,019,181,078,152,224,
077,052,188,095,119,108,134,043,085,162,004,211,054,226,240,228,
079,073,253,169,008,138,010,213,068,091,243,142,076,215,045,066,
006,196,132,173,222,048,246,032,133,007,244,185,195,217,160,120,
218,106,083,144,087,238,207,096,210,053,101,063,098,128,165,089,
140,012,192,131,047,039,022,147,184,109,182,193,199,237,018,069,
057,157,174,104,122,166,055,110,003,040,139,086,145,114,129,113,
206,167,191,214,146,221,136,038,156,082,200,029,044,204,223,064

请注意,在其他系统上,由于C没有强制rand执行特定的实现,因此它可能会产生不同的(但仍然有效)输出。我提交的内容专门是在TIO上运行的版本(链接)。


对于我无法获得像我的原始(f(x){return rand(srand(x*229))/229%256;})版本可以在TIO上使用的版本,我感到非常失望,因为我认为这要优雅得多。由于这仅适用于在OS X上运行的Clang,因此在竞争中不公平。这个人仍然很难扭转,所以我猜就足够了。


好吧..这很有趣!
马修·罗

解决方案在这里,但是您与我的工作有些困难srand(),因此您必须确定这种形式是否可以接受。
Appleshell

我看不到该程序如何满足Bijection的要求,因为输出是随机的,并不是每个输入都有唯一的输出。
发布Rock Garf Hunter,

2
问题不在于实施。问题在于它缺乏我认为是挑战的所有关键思想:找到一种平凡的算法(因此仅限于64字节且独立于语言)是不可逆转的。您的提交“容易”陷入漏洞:语言独立性,通过外包给内置的未知实现(rand不取决于语言,而是本地stdlib)和哈希/加密规则,限制了64个字节。它在PPCG的规则之内,但肯定不符合ghosts_in_the_code的规则意图。
Christoph'Apr

1
@ghosts_in_the_code良好的RNG和散列函数均设计为几乎不可逆。因此,我认为应该将它们包括在该规则中(即使实际的实现可能不是以此方式设计的)。无论如何,我不建议在此阶段更改规则。
克里斯多夫(Christoph)


2

JavaScript,44字节22/3

x=>a.sort()[x]
for(a=[],i=0;i<256;)a[i]=i++;

使用字典排序方式(Javascript默认值)重新排列0-255之间的所有数字

在线尝试!


1
22/3-即使有些奇怪,也可以接受其他语言。我以为我有5个,但有256个妨碍了我:)。
乔纳森·艾伦


1

Javascript,11/8字节

x=>x**5%257

域/范围是1到256。


嗯,使用大量指数的JavaScript不好吗?这部作品在红宝石:repl.it/HXvZ/0
histocrat

JavaScript仅具有双精度浮点数,因此任何超过53位的内容都无法准确表示。x**3并且x**5应该工作。
丹尼斯

好吧,为我服务是正确的假设。我会改变语言。
histocrat

考虑到规则更倾向于简短的语言,或者执行丹尼斯的建议。:) 谢谢!
histocrat

不幸的是,目前这些规则有些混乱,我可以用另一种语言来反转它。正是由于精度的限制,使用JS进行反转会相当冗长。
丹尼斯


1

Javascript,27/29字节

x=>x-6?x*95%127+x*98%131:65

编辑:范围/域是1..256。通过蛮力或多或少地产生。


可悲的是,它是双射的,但不在[0,256]范围内:永远不会输出130的值,但会输出256的值(不适合8位int)。
Christoph'Apr

得分27/29。我喜欢 !
Christoph'Apr

1
谢谢!这些规则允许我指定[1,256]的范围,并且在该范围内是双射的。
histocrat



1

Ruby,23个字节

->x{('228'*x).to_i%257}

范围和域是0..255。将228连接到自身x次,然后将结果取模257(0映射为0)。228是9之后的第一个幻数,适用于此范围(给出不包含256的不同值)。


0

Python 3,55个字节

y=lambda x,i=3:x if i==0 else pow(3,y(5*x,i-1),257)-1

域/范围是0-255。



0

Mathematica,13个字节

Mod[#^7,257]&

使用范围[1..256],尽管在范围[0..255]上同样有效。要查看整个表,请将以下代码行之一复制/粘贴到Wolfram沙箱中

Array[ Mod[#^7,257]&, 256]   (for a list of values in order)
Array[ Rule[#,Mod[#^7,257]]&, 256]   (for a list of input-output rules)

0

brainfuck11分之37

,+++++[>+++++++<-]>++[<+++++++++>-]<.

在线尝试!

不太好,但范围为0-255



@丹尼斯干得好!我不应该使用这种冗长的语言。
Christopher

3
顺便说一句,审查语言名称不是一个好主意。是的,这种特殊的语言有一个普通而幼稚的名称,但是每个人都知道星号代表什么,并且搜索引擎无法以其当前形式找到它。
丹尼斯

@丹尼斯终于解决了这个问题
克里斯托弗·克里斯托弗(Christopher)
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.