Bir Şövalyenin Satranç Tahtasında Kalma Olasılığı Nedir?


16

Satranç tahtasının büyüklüğü ve şövalyenin başlangıç ​​pozisyonu göz önüne alındığında, kşövalyelerin satranç tahtasının içinde olma olasılığını hesaplayın .

Not:

  • Şövalye 8 hamlesinin hepsini eşit olasılıkla yapar.

  • Şövalye satranç tahtasının dışında olduğunda içeri geri gelemez.

resim açıklamasını buraya girin

Giriş

Girdiler virgülle şu biçimde ayrılır:

l,k,x,y

burada lsatranç tahtası uzunluğu ve genişliği, bir kat yapacak hamle sayısı olduğu, xKnight başlangıç konumundan x-konumu, ve yKnight başlangıç konumundan y-pozisyondur. Bunun 0,0, tahtanın sol alt köşesi ve tahtanın l-1,l-1sağ üst köşesi olduğunu unutmayın.

Algoritma:

Şövalyenin ilk koordinatlarıyla başlayın. Bu pozisyon için tüm olası hareketleri yapın ve bu hareketleri olasılıklarıyla çarpın, her hareket için yinelemeli olarak çağırın, sonlandırma koşulu karşılanana kadar bu işleme devam edin. Sonlandırma koşulu, şövalye satranç tahtasının dışındaysa, bu durumda 0 döndürürse veya istenen hamle sayısı tükenirse, bu durumda dönüş 1'dir.

Gördüğümüz gibi, özyinelemenin mevcut durumu sadece mevcut koordinatlara ve şimdiye kadar yapılan adım sayısına bağlıdır. Bu nedenle, bu bilgileri tablo halinde ezberleyebiliriz.

Kredi

Bu meydan okuma aslında CC BY-NC-ND 2.5 IN lisansı altında yayınlanan crazyforcode.com'un bir blog yazısından kaynaklanmaktadır . Biraz daha zor hale getirmek için biraz değiştirildi.


14
Neden tam bir algoritma yazıyorsunuz? Aslında daha zarif bir alternatif olup olmadığından emin değilim, ancak belirli bir algoritmaya ihtiyaç duyulması potansiyel olarak diğer akıllı yaklaşımları engelleyebilir. Ayrıca, koordinat sistemini çok ayrıntılı olarak belirtmeniz gerektiğini düşünmüyorum - bu olasılığı hiç etkilemez.
Martin Ender

2
"Girdiler virgülle ayrılır: l, k, x, y" - yani girdi ayrıştırmamız gereken bir dize mi? 4 parametre alan bir işlev yazmak kabul edilemez mi?
Cristian Lupascu

3
@Edi Başkalarının denemesi için zaman kalmadıysa bir cevabı 'kabul edilmiş' olarak işaretlemeyin - bir şeyi kabul edilmiş olarak işaretlemek temelde 'Zorluk sona erdi' diyor - dünyanın çoğu muhtemelen bakmak için zaman bile vardı!
Sanchises

3
@Edi Lütfen web'de bulduğunuz rastgele sorunları göndermeyi durdurun. İntihal toplumumuz tarafından kaşlarını çattı. Devam eden programlama yarışmalarından kaynaklanan zorlukların burada hiçbir işi yoktur, çünkü bu yarışmayı kazanan birine yardımcı olabilirler. Ve bir blog yazısında tartışılan, bu satranç meydan okuması ( orijinal kaynak ) gibi zorluklar burada iyi karşılanmayacak. Bunun bir nedeni, orijinal kaynağın bir tür telif hakkına sahip olabilmesidir.
Jakube

2
@Edi Örneğin, bu zorluğun kaynağı kopyalamaya ve yeniden dağıtmaya izin verir, ancak yalnızca uygun kredi verirseniz.
Jakube

Yanıtlar:


10

Pyth, 38 bayt

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

Çevrimiçi deneyin: Gösteri

Açıklama:

                                        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

Bana öyle geliyor ki, sadece golf amaçlı süper özlü diller oluşturacaksak, gerekli algoritmayı ilkel olarak da uygulayabiliriz.
mc0e

3
@ mc0e Hayır, bu standart bir yasak boşluk olurdu. Buraya bakın .
Jakube

golf olmayan kodu pls alabilir miyim?
YaSh Chaudhary

1
@YaShChaudhary 39 baytlık sürüm mü, 40 baytlık sürüm mü demek istediniz? :-P Korkarım hiç golf oynamamış bir versiyon yoktu. Bu kodu doğrudan Pyth'e yazdım ve Pyth programları her zaman kısadır.
Jakube

@Jakube ohk np :)
YaSh Chaudhary

8

Ruby 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(:+)}

Çevrimiçi deneyin: http://ideone.com/ZIjOmP

Eşdeğer golf oynamayan kod:

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

Haskell - 235

fParametreli bir fonksiyon uygularl 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

Açıklanan algoritmayı tam olarak uygular.

@Sanchises yardımıyla 5 bayt kısaltmayı başardım, teşekkürler!

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

Expanded:

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

Eski versiyon

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

Bir ipucu: sMATLAB tarafından başlatılır, böylece yapabilirsiniz s(l,l)=0; Çok kötü MATLAB, yerleşik bir işlev olarak fibonnaci'ye sahip değildir, bu büyük bir optimizasyon olacaktır m.
15'te Sanchises

Bu harika bir numara, teşekkürler! Ben hala mbir matris ayrışımı ile yaratmanın daha kısa bir yolunu bulmaya çalışıyorum ...
flawr

Evet, bir süreliğine de bakıyordum. Belki bazı akıllı mantıksal indeksleme, ama hiçbir şey düşünemiyorum. m+m'+fliplr(m+m')bayt sayısında bir artış gibi görünüyor ve diğer tüm seçeneklerim de öyle.
20'de 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]
]

Kullanımı:

g[5,5,1,2]

Çıktı:

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)

Daha fazla MATLAB-y olarak @ flawr'ın çözümünü geliştirir.

Expanded:

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 (boşluk saymaz)

İlk yığın, 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;

Test edin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.