Berapa Probabilitas yang Dimiliki oleh Seorang Ksatria di Papan Catur?

16

Mengingat ukuran papan catur dan posisi awal ksatria, hitung probabilitas bahwa setelah kbergerak ksatria akan berada di dalam papan catur.

catatan:

  • Knight itu membuat 8 gerakan yang mungkin dengan probabilitas yang sama.

  • Begitu ksatria berada di luar papan catur, ia tidak bisa kembali ke dalam.

masukkan deskripsi gambar di sini

Memasukkan

Input dipisahkan koma dalam bentuk:

l,k,x,y

di mana lpanjang dan lebar papan catur, kadalah jumlah gerakan ksatria akan membuat, xadalah posisi-x dari posisi awal ksatria, dan yadalah posisi-y dari posisi awal ksatria. Perhatikan bahwa itu 0,0adalah sudut kiri bawah papan dan l-1,l-1merupakan sudut kanan atas papan.

Algoritma:

Mulailah dengan koordinat awal ksatria. Buat semua gerakan yang mungkin untuk posisi ini dan gandakan gerakan ini dengan probabilitasnya, untuk setiap gerakan secara rekursif memanggil fungsi untuk melanjutkan proses ini sampai kondisi terminasi terpenuhi. Kondisi penghentian adalah jika ksatria berada di luar papan catur, dalam hal ini mengembalikan 0, atau jumlah gerakan yang diinginkan habis, dalam hal ini pengembalian 1.

Seperti yang dapat kita lihat bahwa kondisi rekursi saat ini hanya bergantung pada koordinat saat ini dan jumlah langkah yang dilakukan sejauh ini. Karena itu kami dapat mengingat informasi ini dalam bentuk tabel.

Kredit

Tantangan ini berasal dari posting blog crazyforcode.com yang diterbitkan di bawah lisensi CC BY-NC-ND 2.5 IN . Itu sedikit dimodifikasi untuk membuatnya sedikit lebih menantang.

Ramping
sumber
14
Mengapa Anda meresepkan algoritma yang tepat? Saya tidak yakin apakah sebenarnya ada alternatif yang lebih elegan, tetapi membutuhkan algoritma tertentu berpotensi mencegah pendekatan pintar lainnya. Juga, saya tidak berpikir Anda perlu menentukan sistem koordinat dengan sangat detail - itu tidak mempengaruhi probabilitas sama sekali.
Martin Ender
2
"Input dipisahkan koma dalam bentuk: l, k, x, y" - jadi inputnya adalah string yang harus kita uraikan? Apakah tidak bisa menulis fungsi yang mengambil 4 parameter?
Cristian Lupascu
3
@ Edi Jangan tandai jawaban sebagai 'diterima' jika tidak ada waktu bagi orang lain untuk mencobanya - menandai sesuatu sebagai diterima maka pada dasarnya mengatakan 'Tantangan sudah berakhir' - sementara sebagian besar dunia mungkin belum bahkan sempat melihatnya!
Sanchises
3
@Di, berhentilah memposting tantangan acak yang Anda temukan di web. Plagiarisme disukai oleh komunitas kami. Tantangan dari kompetisi pemrograman yang sedang berlangsung tidak memiliki bisnis di sini sama sekali, karena mereka dapat membantu seseorang memenangkan kompetisi ini. Dan apakah tantangan, yang dibahas dalam posting blog, seperti tantangan catur ini ( sumber asli ), tidak akan diterima dengan baik di sini. Salah satu alasannya adalah, bahwa sumber asli mungkin memiliki semacam hak cipta.
Jakube
2
@ Edi Misalnya sumber tantangan ini memungkinkan menyalin dan mendistribusikan kembali, tetapi hanya jika Anda memberikan kredit yang sesuai.
Jakube

Jawaban:

10

Pyth, 38 byte

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

Cobalah online: Demonstrasi

Penjelasan:

                                        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
Jakube
sumber
Menurut saya, jika kita akan membuat bahasa yang sangat ringkas untuk tujuan golf saja, kita mungkin juga mengimplementasikan algoritma yang diperlukan sebagai primitif.
mc0e
3
@ mc0e Tidak, itu akan menjadi lubang terlarang standar. Lihat di sini .
Jakube
bisakah kita mendapatkan kode non-golf pls?
YaSh Chaudhary
1
@YaShChaudhary Maksud Anda versi dengan 39 byte, atau versi dengan 40 byte. :-P Saya khawatir tidak pernah ada versi yang benar-benar non-golf. Saya menulis kode ini langsung dalam Pyth, dan program Pyth selalu pendek.
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(:+)}

Cobalah online: http://ideone.com/ZIjOmP

Kode non-golf yang setara:

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
Cristian Lupascu
sumber
5

Haskell - 235

Menerapkan fungsi fdengan parameterl 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)
jhwcb
sumber
5

Matlab, 124 119

Tepatnya mengimplementasikan algoritma yang dijelaskan.

Saya dapat mempersingkat 5 byte dengan bantuan @sanchises, terima kasih!

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

Diperluas:

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

Versi lama

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(:));
cacat
sumber
Satu petunjuk: sdiinisialisasi oleh MATLAB, jadi Anda bisa melakukannya s(l,l)=0; Sayang sekali MATLAB tidak memiliki fibonnaci sebagai fungsi bawaan, itu akan menjadi optimasi yang bagus untuknya m.
Sanchises
Itu adalah trik yang sangat luar biasa, terima kasih! Saya masih mencoba menemukan cara yang lebih singkat untuk membuatnya dengan mdekomposisi matriks ...
flawr
Ya, saya juga melihatnya sebentar. Mungkin beberapa pengindeksan logis cerdas, tapi saya tidak bisa memikirkan apa pun. m+m'+fliplr(m+m')tampaknya merupakan peningkatan bytecount, dan begitu juga semua pilihan saya yang lain.
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]
]

Pemakaian:

g[5,5,1,2]

Keluaran:

9/64
Menghitung
sumber
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)

Memperbaiki solusi @ flawr dengan menjadi lebih MATLAB-y.

Diperluas:

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)
Jared
sumber
1

> <> - 620 (tidak termasuk spasi putih)

Tumpukan awal seharusnya 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;

Uji itu

JNF
sumber