骑士留在棋s上的概率是多少?


16

给定棋盘的大小和骑士的初始位置,计算出k骑士移动后进入棋盘内部的可能性。

注意:

  • 骑士以相等的概率进行所有8个可能的动作。

  • 骑士一旦离开棋盘,便无法再回到里面。

在此处输入图片说明

输入值

输入以逗号分隔,形式为:

l,k,x,y

其中l国际象棋棋盘的长与宽k是,骑士将要移动的次数,是骑士x初始位置的x位置,以及y的y位置。请注意,这0,0是板的l-1,l-1左下角,也是板的右上角。

算法:

从骑士的初始坐标开始。对该位置进行所有可能的移动,并将这些移动与其概率相乘,对于每个移动以递归方式调用该函数,请继续执行此过程,直到满足终止条件为止。终止条件是骑士在国际象棋棋盘外面,在这种情况下返回0,或者在完成所需的移动次数后返回1。

如我们所见,递归的当前状态仅取决于当前坐标和到目前为止完成的步骤数。因此,我们可以以表格形式存储此信息。

信用

这项挑战最初来自根据CC BY-NC-ND 2.5 IN许可发布的crazyforcode.com博客。对其进行了少许修改,使其更具挑战性。


14
为什么要开一个精确的算法?我不确定是否确实有更优雅的替代方法,但是要求使用特定算法可能会阻止其他聪明方法。另外,我认为您无需指定太多的坐标系-根本不影响概率。
马丁·恩德

2
“输入以逗号分隔,形式为:l,k,x,y” -那么输入是我们必须解析的字符串吗?编写带有4个参数的函数是否可以接受?
克里斯蒂安·卢帕斯库

3
@Edi如果没有时间尝试其他人,请不要将答案标记为“接受”-将某事物标记为接受,因此基本上是在说“挑战已经结束”-尽管世界上大多数人可能没有甚至没有时间去看它!
桑契斯2015年

3
@Edi请停止发布您在网络上发现的随机挑战。community窃被我们的社区所反对。正在进行的编程竞赛带来的挑战在这里根本没有意义,因为它们可以帮助赢得这场竞赛的人。在博客中讨论的挑战,例如象棋挑战(原始资料),在这里不会被很好地接受。原因之一是原始来源可能具有某种版权。
2015年

2
@Edi例如,此挑战的来源允许复制和重新分发,但前提是您具有适当的信誉。
2015年

Answers:


10

Pyth,38个字节

M?smcgtGd8fq5sm^-Fk2C,TH^UhQ2G1g@Q1>Q2

在线试用:演示

说明:

                                        implicit: Q = evaluated input
M                                       define a function g(G,H): //G=depth, H=current cell
                         UhQ              the list [0,1,...,Q[0]-1]
                        ^   2             Cartesian product, gives all cells
          f                               filter for numbers numbers T, which satisfy:
                    C,TH                    zip(T,H)
              m                             map the two pairs k to:
                -Fk                           their difference
               ^   2                          squared
             s                              sum (distance squared)
           q5                               == 5           
   m                                      map each valid cell d to:
     gtHd                                   g(G-1,d)
    c    8                                  divided by 8
  s                                       return sum
 ?                           G          if G > 0 else
                              1           return 1

                               g@Q1>Q2  call g(Q[1],Q[2:]) and print

在我看来,如果仅出于打高尔夫球的目的而创建超简洁的语言,我们不妨将所需的算法实现为原始语言。
mc0e

3
@ mc0e不,那是一个标准的禁止漏洞。看这里
2015年

我们可以得到非高尔夫代码吗?
YaSh Chaudhary

1
@YaShChaudhary您的意思是39字节的版本还是40字节的版本。:-P恐怕从来没有一个真正的非高尔夫版本。我直接在Pyth中编写了此代码,Pyth程序总是很短。
雅库布

@Jakube ohk np :)
YaSh Chaudhary

8

红宝石134

->l,m,x,y{!((r=0...l)===x&&r===y)?0:m<1?1:(0..7).map{|i|a,b=[1,2].rotate i[2]
P[l,m-1,x+a*(i[0]*2-1),y+b*(i[1]*2-1)]/8.0}.inject(:+)}

在线尝试:http//ideone.com/ZIjOmP

等效的非高尔夫代码:

def probability_to_stay_on_board(board_size, move_count, x, y)
  range = 0...board_size
  return 0 unless range===x && range===y
  return 1 if move_count < 1

  possible_new_locations = (0..7).map do |i|
    dx, dy = [1,2].rotate i[2]
    dx *= i[0]*2-1
    dy *= i[1]*2-1

    [x+dx, y+dy]
  end

  possible_new_locations.map do |new_x, new_y| 
    probability_to_stay_on_board(board_size, move_count-1, new_x, new_y) / 8.0 
  end.inject :+
end

5

哈斯克尔-235

f用参数实现一个功能l k x y

import Data.List
g[]=[]
g((a,b):r)=[(a+c,b+d)|(c,d)<-zip[-2,-1,1,2,-2,-1,1,2][1,2,-2,-1,-1,-2,2,1]]++g r
h _ 0 a=a
h l a b=h l(a-1)$filter(\(a,b)->(elem a[0..l])&&(elem b[0..l]))$g b
f l k x y=(sum$map(\x->1.0) (h l k [(x,y)]))/(8**k)

5

MATLAB,124 119

确切地实现所描述的算法。

在@sanchises的帮助下,我能够将其缩短5个字节,谢谢!

function s=c(l,k,x,y);m=zeros(5);m([2,4,10,20])=1/8;s(l,l)=0;s(l-y,x+1)=1;for i=1:k;s=conv2(s,m+m','s');end;s=sum(s(:))

展开:

function s=c(l,k,x,y);
    m=zeros(5);
    m([2,4,10,20])=1/8;
    s(l,l)=0;s(l-y,x+1)=1;
    for i=1:k;
        s=conv2(s,m+m','s');
    end;
    s=sum(s(:))

旧版本

function s=c(l,k,x,y);
    m =zeros(5);m([1:3,5,8,10:12]*2)=1/8;
    s=zeros(l);
    s(l-y,x+1)=1;
    for i=1:k
        s=conv2(s,m,'s');
    end
    s=sum(s(:));

一个提示:s是由MATLAB初始化的,因此您可以执行s(l,l)=0; 太糟糕了,MATLAB没有内置fibonnaci函数,对于来说这将是一个很好的优化m
桑契斯2015年

这是一个很棒的技巧,谢谢!我仍在尝试寻找一种m通过矩阵分解来创建的更短方法……
更加模糊的

是的,我也看了一段时间。也许有些智能逻辑索引,但是我什么也没想到。m+m'+fliplr(m+m')似乎增加了字节数,其他所有选项也是如此。
桑契斯2015年

5

Mathematica-137

q = # {1, 2} & /@ Tuples[{-1, 1}, 2]
q = Reverse /@ q~Union~q
g[l_, k_, x_, y_] :=

 Which[
  k < 1,
  1,

  !0 <= x < l || ! 0 <= y < l,
  0,

  0<1,
  Mean[g[l, k - 1, x + #[[1]], y + #[[2]]] & /@ q]
]

用法:

g[5,5,1,2]

输出:

9/64

2

MATLAB-106

function s=c(l,k,x,y);m(5,5)=0;m([2,4,10,20])=1/8;s=ones(l);for i=1:k;s=conv2(s,m+m','s');end;s=s(l-y,x+1)

通过更多的MATLAB-y改进@flawr的解决方案。

展开:

function s=c(l,k,x,y)
    m(5,5)=0;
    m([2,4,10,20])=1/8;
    s=ones(l);
    for i=1:k
        s=conv2(s,m+m','s');
    end
    s=s(l-y,x+1)

1

> <>-620(不计空格)

初始堆栈应为 l,k,x,y

{:a2*0p   v
vp0*3a*}:{<
>{1+&a3*0g}v                   >          >       >          >~~01-01-v             >          >       >          >~~01-01-v             >          >       >          >~~01-01-v             >          >       >          >~~01-01-v
           >&1-:&?!v>:@@:@@:0(?^:a2*0g1-)?^2-$:0(?^:a2*0g1-)?^1-      >}}$:@@:@@:0(?^:a2*0g1-)?^2-$:0(?^:a2*0g1-)?^1+      >}}$:@@:@@:0(?^:a2*0g1-)?^2+$:0(?^:a2*0g1-)?^1-      >}}$:@@:@@:0(?^:a2*0g1-)?^2+$:0(?^:a2*0g1-)?^1+      >}}$:@@:@v
v1         ^}       ^!?=g0*3a:~~}}<      +2v?)-1g0*2a:v?(0:$+1v?)-1g0*2a:v?(0:@@:@@:$}}<      -2v?)-1g0*2a:v?(0:$+1v?)-1g0*2a:v?(0:@@:@@:$}}<      +2v?)-1g0*2a:v?(0:$-1v?)-1g0*2a:v?(0:@@:@@:$}}<-2      v?)-1g0*2a:v?(0:$-1v?)-1g0*2a:v?(0:@<
>a3*0g=   ?^\      &              ^-10-10~~<          <       <          <             ^-10-10~~<          <       <          <             ^-10-10~~<          <       <          <             ^-10-10~~<          <       <          <
\         :{/      
v                  >~{~l2,&0
>@:0(?v:a2*0g1-)?v$:0(?v:a2*0g1-)?v1>@~~+l1=?v
      >          >     >          >0^        >&,n;

测试一下

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.