雷区上的礼貌近视醉酒机器人


11

正如标题所示,此问题是@NP 礼貌的近视醉酒机器人的半启发

我们的可怜机器人在原点放置在笛卡尔网格上,每分钟之后,它会在四个方向(上,下,左,右)中的一个方向上移动1个单位。

之后ñ分钟,所有对电网活化潜在的地雷,杀死任何僵尸差可能会发现自己在他们。地雷位于满足等式| y | = | x |的所有整数坐标处。

挑战

作为输入,作为输出,您将获得n,即地雷爆炸发生前的分钟数n,您必须找到机器人死亡的可能性。

输入:代表n的自然数。

输出:让僵尸死亡的概率为p / q,其中p和q是相对质数(q不能为0,但p可以)。输出p。

规则

  • 您的算法不得以指数或更高的时间运行。理想情况下,它应在多项式时间内或更短的时间内运行。
  • 您的算法必须能够n在合理的时间内处理<20的输入(如果太难的话可以调整)。
  • 这是一个挑战。
  • 对于给定的n遍历所有可能性,绝对不会被视为答案。

测试用例

1->0

2->3

4->39

6->135

8->7735

10->28287

n = 6的示例计算

我们有4种可能的移动方式:U,D,R和L。可采用的路径总数为4 ^ 6或4096。有4种可能的情况沿y = x着陆:x,y = ±1; x,y =±2; x,y =±3; 或x = y =0。我们将计算出以(1,1),(2,2)和(3,3)结束的方法数量,将它们乘以4即可得出其他象限,然后相加这就是最终以(0,0)结束的方式数量。

情况1:机器人在(3,3)处结束。为了使机器人在这里结束,它必须进行3次正确的动作,以及3次向上的动作。换句话说,到达此处的总方法是重新排列序列RROUUU中的字母的方法,即6选择3 = 20。

情况2:机器人在(2,2)结束。为了使机器人在此处结束,它可以进行2次向上移动,3次向右移动和1次向左移动;或2个向右移动,3个向上移动和1个向下移动。因此,到达此处的方法总数是重新排列序列RRRLUU和UUUDRR中的字母的方法的总和,二者均为(6选择1)*(5选择2)= 60,总共有120种可能性。

情况3:机器人在(1,1)结束。为了使机器人在此处结束,可能需要执行以下操作:1个向右移动,3个向上移动和2个向下移动。在这种情况下,重新排列RUUUDD序列中字母的方式为(6选择1)*(5选择2)= 60。

1个向上移动,3个向右移动和2个向左移动。在这种情况下,按顺序URRRLL重新排列字母的方式为(6选择1)*(5选择2)= 60。

向右移动2个,向左移动1个,向上移动2个,向下移动1个。在这种情况下,重新排列序列UUDRRL中的字母的方式为(6选择1)*(5选择1)*(4选择2)= 180。

因此,最终以(1,1)结束的方式总数为300。

情况4:机器人在(0,0)结束。为了使该机器人最终能够在这里运行,它可能需要:

3个向右移动和3个向左移动。在这种情况下,重新排列序列RRLLLL中的字母的方式为(6选择3)= 20。

3个上移和3个下移。在这种情况下,重新排列序列UUUDDD中的字母的方式为(6选择3)= 20。

1个右移,1个左移,2个上移和2个下移。在这种情况下,重新排列序列RLUUDD中的字母的方式为(6选择1)*(5选择1)*(4选择2)= 180。

1个上移,1个下移,2个右移和2个左移。在这种情况下,重新排列序列RRLLUD中的字母的方式为(6选择1)*(5选择1)*(4选择2)= 180。

因此,最终以(0,0)结束的方式总数为400。

将这些情况加在一起,我们得出以| y |结尾的方法总数 = | x | 是4(20 + 120 + 300)+ 400 =2160。因此,我们的概率是2160/4096。当该分数完全减小时,它是135/256,因此我们的答案是135


我喜欢这个挑战,但是我认为,为一个很小的测试用例(2或3)之一提供一个有效的示例会有所帮助。
Xcoder先生18年

@ Mr.Xcoder我有空的时候会加一个。
Don Thousand

2
有趣的挑战。请注意,在规则中使用“理想地”一词使其成为非规则。明确地说出一种方式会很有用。
trichoplax

1
但是没有人谈论第一代学习算法吗?
Redwolf节目

1
@RedwolfPrograms啊哈,是的,但是这个机器人的名字更酷
Don Thousand

Answers:


17

Python 2,65个字节

def p(n):b=2**n;r=b*b-((~b)**n/b**(n/2)%-b)**2;print~n%2*r/(r&-r)

在线尝试!

机器人死亡的概率可以表示为:

f(n)=2ss2, where s=12n(nn/2)

当不完整时,将二项式理解为等于。0n/2

我们可以这样推理。机器人到达线的机率是多少?如果向上和向左移动的总数等于向下和向右移动的总数,则会发生这种情况。假设您掷硬币次并获得与正面一样多的尾巴,这是相同的概率。您必须选择翻转为翻转的头部,这可以以方式完成,总共可能的序列,从而给出概率y=xnn/2n(nn/2)2n

s=12n(nn/2)

着陆线的概率也为。因此,任一行着陆的概率是这些乘积或的总和,除了我们要重复计算两行中着陆的概率,并且必须减去它以进行补偿。y=xs2sx=y=0

事实证明,降落在上的概率仅为,即降落在每条线上的概率的乘积。我们可以说事件是独立的,如下所示:如果我们选择相等数目的“上或左”和“下或右”的随机序列落在并且同样使用“上或右”和“下或左”对于,我们可以通过获取每个位置的方向对的交点,将它们唯一地组合为上,下,左,右的序列。x=y=0s2x=yx=y

因此,降落在或上的概率为。x=yx=y2ss2

代码计算二项式使用此表达式作为用碱。为了从概率分数中提取分子,我们注意到分母是2的幂,因此我们使用表达式将2的最大幂除以,即经典位把戏。(nn/2)(b+1)**n/b**(n/2)%bb=2**nr/(r&-r)rr&-r

通过将写为来求解该解决方案,以便仅被引用一次,并且不使用分数来保持整数。即使使用二项式计算的时髦方式,该计算也是多项式时间。2ss21(1s)2s1/2nn


在写出机器人死亡可能性的证明之后,我发现了一种可能更干净的方式来证明它并提出。

在机器人每次移动后,让我们跟踪和的值。向上,向下,向左和向右四个方向中的每均可递增或递减和,四个方向分别对应于四个组合。a=x+yb=xyab

因此,随机移动等效于将随机添加到并独立地将加到。这等效于对和进行单独的随机游动。±1a±1bab

现在,当或时,机器人恰好在或线上结束。因此,以结尾的概率为,同样对于。由于游走是独立的,因此和的概率为,因此至少一个为零的概率为补数。x=yx=ya=0b=0a=0s=12n(nn/2)b=0a0b0(1s)21(1s)2


3
太棒了!我在等待有人推论这一点。我没想到它会这么快。现在的缺点是,大多数其他答案都不必考虑太多:(。优秀+1
Don Thousand

享受小额赏金(没有太多可惜的地方)
Don Thousand

1
@RushabhMehta谢谢你,你真好!你的赏金促使我写出我后来想到的更清晰的证明。
xnor18年

该问题的真正灵感来自AIME I 2014问题11,如果您想检查一下的话。
Don Thousand
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.