首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在草堆里找到针(强盗)

在草堆里找到针(强盗)
EN

Code Golf用户
提问于 2017-10-07 14:14:40
回答 16查看 2.3K关注 0票数 19

--这是警察和强盗挑战的一部分。到这里来是警察的一部分,

,强盗的挑战,

cop的答案可以通过从Haystack程序中删除任何字符子集来破解,这样它就可以输出Needle而不是Haystack (同时仍然是同一语言中的有效提交)。只要您的解决方案符合上述约束条件,您就不必找到与cop所期望的完全相同的解决方案。

如果你能做到这一点,就把答案与解决方案联系起来,链接到缔约方会议的答案,并对缔约方会议的答复留下评论,链接回你的答案。

警察回答最多的抢劫犯赢了。领带被破解的警察回答的大小之和打破(有利于强盗谁破解更长的提交)。

每个警察的答案只能破解一次,当然,你也不允许自己破解答案。如果警察的回答在被破解之前或之后都是无效的,则不计入强盗的分数。

示例

以下是几种不同语言的简单示例:

代码语言:javascript
运行
复制
Ruby

Haystack: puts 1>0?"Haystack":"Needle"
Delete:        XXXXXXXXXXXXXXX
Needle:   puts "Needle"

Python 2

Haystack: print "kcatsyaHeldeeN"[-7::-1]
Delete:          XXXXXXXX        XX
Needle:   print "eldeeN"[::-1]

注意,移除字符的子集不一定是连续的。

EN

回答 16

Code Golf用户

发布于 2017-10-07 19:15:15

JavaScript,85字节(ES6)

裂纹阿纳尔德的回答

代码语言:javascript
运行
复制
f=(k=b=x=35)=>x--?f(k*4853461&268435455):k&2?'N'+(k^12408877).toString(b):'Haystack'

“针”演示

代码语言:javascript
运行
复制
f=(k=b=x=35)=>x--?f(k*4853461&268435455):k&2?'N'+(k^12408877).toString(b):'Haystack'

console.log(f())

解释

最初的职能是:

代码语言:javascript
运行
复制
f=(k=b=x=35)=>x--?f(k*74837258394056219&268435455):k&2?'N'+(k^124038877).toString(b):'Haystack'

其可读性更强,如:

代码语言:javascript
运行
复制
f = (k=b=x=35) => {
    if (x--) {
        return f(k*74837258394056219&268435455);
    } else {
        if (k&2) {
            return 'N'+(k^124038877).toString(b);
        } else {
            return 'Haystack';
        }
    }
}

注意,当n=21625674时,n.toString(35)就是'eedle'

输入中的35可能不能被更改为子集(因为我们需要一个足够大的基来包含所有的字母'del',所以我们需要一个至少22的基。因此,要更改的数字是74837258394056219268435455124038877。我们想用数字a,b,c替换它们,每个数字由原始数字的一个子集组成,这样函数g(k) = (k * a & b),从k=35开始,迭代35次,然后XORed用c,给出21625674

对于这个问题,考虑一下后,由于长度很小(最大a的长度为17,bc的长度为9),我刚刚使用了蛮力:-)编写了一个C++程序来生成作为原始数字子集的所有可能的数字abc,遍历所有ab,并检查所需的c是否在集合中。运行时间约为15秒,唯一的输出是a=4853461b=268435455c=12408877 (原来不需要更改数字b )。我不确定是否有一种更聪明的方法来反演这个函数。

票数 11
EN

Code Golf用户

发布于 2017-10-07 16:27:03

干草堆,82字节

裂纹超中微子的回答

代码语言:javascript
运行
复制
0\1-c\
/    
?10F17+c8F+4+cd8F+3+c6-c1+c,c2+c8+c|
 0   \1++c,c|
F/c++2F8
c\8F+2+cd

在网上试试!

票数 5
EN

Code Golf用户

发布于 2017-10-09 11:32:24

Python 2,123个字节

裂纹阿加托弗的回答

代码语言:javascript
运行
复制
import numpy
print "".join([dir(numpy)[int(i)][0] for i in numpy.poly1d([-143/2e1,-31,14,131,61,184])(numpy.arange(-3,3))])

repl.it

比较:

代码语言:javascript
运行
复制
print "".join([dir(numpy)[int(i)][1-0] for i in numpy.poly1d([-1*1433/252e1,-3232/1920.,4026./72/2/3.,613/(6*4.)*1,-4723./1.8e2,-9763/120.,-2689/(-1+5*17.),1+138*.4*2])(numpy.arange(-12/3,13%9))])
print "".join([dir(numpy)[int(i)][  0] for i in numpy.poly1d([-1  43 /2  e1,-3    1    ,               1     4    ,       1         3 1   ,  6     1       ,1   8  4  ])(numpy.arange(-   3, 3  ))])

我找到了很多有趣的解决方案,通过将多项式拟合到以Meedle中的每个字母开头的numpy符号的索引的中位数,从而打印出NeedleNeedlf。然后,我试图用手工找到与原始程序子集相似的系数,但最后不得不用蛮力强迫一个人找到一个有效的解决方案。

票数 4
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/144601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档