PPCG危险:强盗


18

您对网站的了解程度如何?让我们找出答案。

这是挑战。 警察的线

作为强盗,您需要:

  1. 查找与警察提交的内容相匹配的未删除,未关闭的挑战。挑战不能具有以下标记:。挑战必须对有效输出进行限制。
  2. 在此处发布挑战,并链接到您要破解的警察
  3. 在警察的帖子中添加“破裂”评论,并带有指向此答案的链接

您将获得1分,而提交的每24小时内将获得1分(最高7分)。决胜局是破解次要竞争的总数。

笔记:

  • 如果挑战需要的输出X,并且输出你XYYX地方Y是空白之外什么,提交无效这一挑战。
  • 不允许挑战2016-11-17之后的挑战。
  • 我保留禁止某些挑战(如果它们适用范围广)的权利(可以适用于所有提交的大多数作品)。
  • 确保添加一两个句子作为解释(这也有助于将提交的内容转换为评论)
  • 感谢Daniel的初衷!


Answers:


5

计算获得抛硬币一半头的概率。

警察入场(由Conor O'Brien发布):https : //codegolf.stackexchange.com/a/100521/8927

原始问题:计算获得抛硬币一半头的概率。


发布的解决方案应用了两种混淆技术,然后是同一混淆技术的多层。一旦摆脱了前几个技巧,提取实际功能就变成了一个简单的任务(如果很乏味!):

nCr(a,b) = a! / ((a-b)! * b!)
result = nCr(x, x/2) / 2^x

花了一段时间才意识到我在看什么(有一段时间我怀疑与熵有关),但是一旦它变了,我设法通过搜索“抛硬币的可能性”轻松地找到了问题。


由于Conor O'Brien质疑他的代码的深入解释,因此以下是一些更有趣的部分:

首先混淆一些内置函数调用。这是通过对函数名称进行base-32编码,然后将它们分配给单个字符的新全局命名空间名称来实现的。实际上仅使用“ atob”;其他2个只是红色鲱鱼(eval与atob具有相同的简写,只是被覆盖,而btoa根本没有使用)。

_=this;
[
    490837, // eval -> U="undefined"       -> u(x) = eval(x) (but overwritten below), y = eval
    358155, // atob -> U="function (M,..." -> u(x) = atob(x)
    390922  // btoa -> U="function (M,..." -> n(x) = btoa(x), U[10] = 'M'
].map(
    y=function(M,i){
        return _[(U=y+"")[i]] = _[M.toString(2<<2<<2)]
    }
);

接下来,有一些琐碎的字符串混淆来隐藏代码。这些很容易逆转:

u(["","GQ9ZygiYTwyPzE6YSpk","C0tYSki","SkoYSkvZChhLWIpL2QoYikg"].join("K"))
// becomes
'(d=g("a<2?1:a*d(--a)"))(a)/d(a-b)/d(b) '

u("KScpKWIsYShFLCliLGEoQyhEJyhnLGM9RSxiPUQsYT1D").split("").reverse().join("")
// becomes
"C=a,D=b,E=c,g('D(C(a,b),E(a,b))')"

混淆的主要是g函数的使用,该函数仅定义了新函数。这是递归应用的,函数返回新函数,或要求函数作为参数,但最终简化了操作。最有趣的功能是:

function e(a,b){ // a! / ((a-b)! * b!) = nCr
    d=function(a){return a<2?1:a*d(--a)} // Factorial
    return d(a)/d(a-b)/d(b)
}

这行还有一个最后的把戏:

U[10]+[![]+[]][+[]][++[+[]][+[]]]+[!+[]+[]][+[]][+[]]+17..toString(2<<2<<2)
// U = "function (M,i"..., so U[10] = 'M'. The rest just evaluates to "ath", so this just reads "Math"

尽管由于下一位是“ .pow(T,a)”,所以总是很有可能必须是“ Math”!

我沿功能扩展路线采取的步骤是:

// Minimal substitutions:
function g(s){return Function("a","b","c","return "+s)};
function e(a,b,c){return (d=g("a<2?1:a*d(--a)"))(a)/d(a-b)/d(b)}
function h(a,b,c){return A=a,B=b,g('A(a,B(a))')}
function j(a,b,c){return a/b}
function L(a,b,c){return Z=a,Y=b,g('Z(a,Y)')}
k=L(j,T=2);
function F(a,b,c){return C=a,D=b,E=c,g('D(C(a,b),E(a,b))')}
RESULT=F(
    h(e,k),
    j,
    function(a,b,c){return _['Math'].pow(T,a)}
);


// First pass
function e(a,b){
    d=function(a){return a<2?1:a*d(--a)}
    return d(a)/d(a-b)/d(b)
}
function h(a,b){
    A=a
    B=b
    return function(a){
        return A(a,B(a))
    }
}
function j(a,b){ // ratio function
    return a/b
}
function L(a,b){ // binding function (binds param b)
    Z=a
    Y=b
    return function(a){
        return Z(a,Y)
    }
}
T=2; // Number of states the coin can take
k=L(j,T); // function to calculate number of heads required for fairness
function F(a,b,c){
    C=a
    D=b
    E=c
    return function(a,b,c){return D(C(a,b),E(a,b))}
}
RESULT=F(
    h(e,k),
    j,
    function(a){return Math.pow(T,a)}
);


// Second pass
function e(a,b){...}
function k(a){
    return a/2
}
function F(a,b,c){
    C=a
    D=b
    E=c
    return function(a,b,c){return D(C(a,b),E(a,b))}
}
RESULT=F(
    function(a){
        return e(a,k(a))
    },
    function(a,b){
        return a/b
    },
    function(a){return Math.pow(2,a)}
);


// Third pass
function e(a,b) {...}
C=function(a){ // nCr(x,x/2) function
    return e(a,a/2)
}
D=function(a,b){ // ratio function
    return a/b
}
E=function(a){return Math.pow(2,a)} // 2^x function
RESULT=function(a,b,c){
    return D(C(a,b),E(a,b))
}

函数嵌套的结构基于实用程序。最外面的“ D” /“ j”函数计算比率,然后内部的“ C” /“ h”和“ E”(嵌入式)函数计算必要的硬币翻转计数。在第三遍中删除的“ F”功能负责将这些功能连接在一起成为一个可用的整体。同样,“ k”功能负责选择需要观察的磁头数量。通过参数绑定函数“ L”将其委派给比率函数“ D” /“ j”的任务;此处用于将参数固定bT(此处始终为2,即硬币可以采用的状态数)。

最后,我们得到:

function e(a,b){ // a! / ((a-b)! * b!)
    d=function(a){return a<2?1:a*d(--a)} // Factorial
    return d(a)/d(a-b)/d(b)
}
RESULT=function(a){
    return e(a, a/2) / Math.pow(2,a)
}

做得好!这有点不正确-eval设置为f。但是其余的都是正确的!另外,关于如何RESULT派生的一些详细说明可能是值得的;)
Conor O'Brien

@ ConorO'Brien当然;在折叠全部注释之前,我添加了注释和每个功能的实用性的说明。
戴夫

@ ConorO'Brien感谢您的赏赐!
戴夫

总是很高兴:)
Conor O'Brien

3

MATL,Luis Mendo计算2个数字之间的高小数位数

&:"@FYAYm7>vs

我通过玩输入来弄清楚了它的作用,但是我无法弄清楚您要计算一个总和大于7位数的范围内的整数数所面临的挑战。阅读了MATL文档之后,我对它的作用进行了粗略的解释:

&    % Change default input format
:    % Implictly input two integers, create inclusive range
"    % For each item in this range:
  @    % Push the item
  F    % Push false
  YA   % Convert to base N digits; N is false, so this produces base-10 digits
  Ym   % Calculate arithmetic mean
  7>   % Push 1 if this is greater than 7, 0 otherwise
  v    % Concatenate result into array with previous result
  s    % Sum
     % Implicitly end loop and output

然后,我从搜索“大于7倍长度的数字总和”切换为“大于7的平均数字”,这带来了我一直在寻找的挑战。





2

Perl,Gabriel Benamy便捷的回文检查器

该代码显然是某种回文。一旦我挑出y- - -结构并注意到正在被音译的内容,我就知道这是什么挑战。


您击败了我几秒钟……但是下载perl花费了很长时间。
Laikoni '16

@Laikoni老实说,在一对夫妇尝试使用Ideone之后,我放弃了运行代码,而是尝试读取它。;)
DLosc



1

MATL,Luis Mendo用低汉明重量计算汉明重量

dP7EGn:q^1J2/h)ts_hX=Gs[BE]Wd=~>~GBz*

我测试了数字,发现OEIS上有重量的东西。

然后,我搜索了PPCG,并尝试将其放入字符串,然后它起作用了。


正如我在警察挑战中评论的那样,这实际上并没有破解我的意见。不幸的是,我想这个答案需要删除
Luis Mendo


1

Ruby,历史学家实现真理机器

该代码定义了一个迭代的功能系统f(n) = n*(3*n-1)/2,该功能系统一直运行到nmod 7为0 为止。0因此,其输入立即终止(在打印0一次之后)。输入Gives 11导致打印无限循环1。如果初始n值与0、2、3、5或6 mod 7一致,则其他输入将在1-3个步骤后终止,或者如果与1或4 mod 7一致,则其他输入将永远增长。但这无关紧要。




0

Python 3,https://codegolf.stackexchange.com/a/100381/31343

使用xkcd的公式来近似世界人口

我只是搜索了涉及leap年的挑战(因为四位检查员对除数进行了解码)并且没有输入任何信息。


是的 我知道这是显而易见的,因为%4和都可以strftime,但是可以很好地发现代码的重要部分(大部分都是乱码)
FlipTack

啊,我也很近。我发现这与日期有关,即将到2005年和2016/2017年。不错的工作。
Yodle

令人惊讶的是,你们俩都没有简单地运行代码,该代码生成输出7.3 328并进行搜索。挑战马上就来了。
FlipTack



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.