騎士がチェスボードにとどまる確率は何ですか?


16

チェス盤のサイズと騎士の初期位置を考慮して、k移動後に騎士がチェス盤の内側になる確率を計算します。

注意:

  • 騎士は、等しい確率で8つの可能なすべての動きをします。

  • 騎士がチェス盤の外に出ると、内部に戻ることはできません。

ここに画像の説明を入力してください

入力

入力は次の形式のカンマ区切りです:

l,k,x,y

ここlで、チェス盤の長さと幅k、ナイトの移動数、ナイトxの初期位置のx位置、ナイトの初期位置のyy位置です。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他の人が試してみる時間がなかった場合、答えを「受け入れられた」とマークしないでください-受け入れられたものとしてマークするので、基本的に「挑戦は終わった」と言っています-ほとんどの世界はそうではありませんそれを見る時間さえありました!
Sanchises

3
@Edi Webで見つけたランダムなチャレンジの投稿を停止してください。盗作はコミュニティによって嫌われています。進行中のプログラミング競技からの挑戦は、この競技に勝つ誰かを助けるかもしれないので、ここではまったくビジネスがありません。また、このチェスチャレンジ(元のソース)のように、ブログ投稿で説明されているチャレンジは、ここでは受け入れられません。理由の1つは、元のソースに何らかの著作権がある可能性があることです。
ジャクベ

2
@Ediたとえば、このチャレンジのソースはコピーと再配布を許可しますが、それは適切なクレジットを与えた場合のみです。
ジャクベ

回答:


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いいえ、それは標準的な禁止された抜け穴です。こちらをご覧ください
ジャクベ

ゴルフされていないコードplsを取得できますか?
ヤシュショーダリー

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(:));

1つのヒント:sMATLABによって初期化されますs(l,l)=0。残念なことに、MATLABには組み込み関数としてfibonnaciがありませんm。これはの最適な最適化になります。
-Sanchises

それは非常に素晴らしいトリックです、ありがとう!私はまだmマトリックス分解によって作成するより短い方法を見つけようとしています
...-flawr

ええ、私もしばらく見ていました。おそらくいくつかのスマートな論理インデックス付けが、私は何も考えることができません。m+m'+fliplr(m+m')バイト数が増えているようです。他のすべてのオプションも同様です。
Sanchises

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;

試してみる

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.