Xác suất mà một Hiệp sĩ đặt trên Bàn cờ là gì?


16

Với kích thước của bàn cờ và vị trí ban đầu của hiệp sĩ, hãy tính xác suất sau khi kdi chuyển, hiệp sĩ sẽ ở trong bàn cờ.

Ghi chú:

  • Các hiệp sĩ thực hiện tất cả 8 động tác có thể với xác suất bằng nhau.

  • Một khi hiệp sĩ ở ngoài bàn cờ, nó không thể quay lại bên trong.

nhập mô tả hình ảnh ở đây

Đầu vào

Các đầu vào được phân tách bằng dấu phẩy dưới dạng:

l,k,x,y

trong đó lchiều dài và chiều rộng của bàn cờ, klà số lần di chuyển mà hiệp sĩ sẽ thực hiện, xlà vị trí x của vị trí ban đầu của hiệp sĩ và ylà vị trí y của vị trí ban đầu của hiệp sĩ. Lưu ý rằng đó 0,0là góc dưới bên trái của bảng và l-1,l-1là góc trên cùng bên phải của bảng.

Thuật toán:

Bắt đầu với tọa độ ban đầu của hiệp sĩ. Thực hiện tất cả các di chuyển có thể cho vị trí này và nhân các di chuyển này với xác suất của chúng, cho mỗi lần di chuyển gọi đệ quy hàm tiếp tục quá trình này cho đến khi điều kiện kết thúc được đáp ứng. Điều kiện chấm dứt là nếu hiệp sĩ ở ngoài bàn cờ, trong trường hợp này trả về 0 hoặc số lần di chuyển mong muốn đã hết, trong trường hợp này trả về 1.

Như chúng ta có thể thấy rằng trạng thái hiện tại của đệ quy chỉ phụ thuộc vào tọa độ hiện tại và số bước được thực hiện cho đến nay. Do đó chúng ta có thể ghi nhớ thông tin này dưới dạng bảng.

tín dụng

Thử thách này ban đầu từ một bài đăng trên blog của crazyforcode.com được xuất bản theo giấy phép CC BY-NC-ND 2.5 IN . Nó đã được sửa đổi một chút để làm cho nó một chút thách thức hơn.


14
Tại sao bạn quy định một thuật toán chính xác? Tôi không chắc có thực sự có một sự thay thế thanh lịch hơn không, nhưng yêu cầu một thuật toán cụ thể có khả năng ngăn chặn các phương pháp thông minh khác. Ngoài ra, tôi không nghĩ bạn cần chỉ định hệ tọa độ rất chi tiết - nó hoàn toàn không ảnh hưởng đến xác suất.
Martin Ender

2
"Các đầu vào được phân tách bằng dấu phẩy dưới dạng: l, k, x, y" - vậy đầu vào là một chuỗi mà chúng ta phải phân tích? Có phải là không thể chấp nhận để viết một hàm có 4 tham số?
Cristian Lupascu

3
@Edi Đừng đánh dấu câu trả lời là 'được chấp nhận' nếu không có thời gian để người khác thử - đánh dấu điều gì đó được chấp nhận vì vậy về cơ bản là nói 'Thử thách đã kết thúc' - trong khi hầu hết thế giới có lẽ không thậm chí đã có thời gian để nhìn vào nó!
Sanchise

3
@Edi Vui lòng ngừng đăng các thử thách ngẫu nhiên bạn tìm thấy trên web. Đạo văn được cộng đồng của chúng tôi cau mày. Những thách thức từ các cuộc thi lập trình đang diễn ra không có kinh doanh ở đây, vì chúng có thể giúp ai đó chiến thắng cuộc thi này. Và là những thách thức, được thảo luận trong một bài đăng trên blog, như thử thách cờ vua này ( nguồn gốc ), sẽ không được đón nhận ở đây. Một lý do là, nguồn ban đầu có thể có một số loại bản quyền.
Jakube

2
@Edi Ví dụ, nguồn của thách thức này cho phép sao chép và phân phối lại, nhưng chỉ khi bạn cung cấp tín dụng phù hợp.
Jakube

Câu trả lời:


10

Bình thường, 38 byte

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

Dùng thử trực tuyến: Trình diễn

Giải trình:

                                        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

Dường như với tôi rằng nếu chúng ta sẽ tạo ra các ngôn ngữ siêu súc tích cho mục đích duy nhất là chơi gôn, chúng ta cũng có thể thực hiện thuật toán cần thiết như một nguyên thủy.
mc0e

3
@ mc0e Không, đó sẽ là một lỗ hổng bị cấm tiêu chuẩn. Xem tại đây .
Jakube

chúng tôi có thể nhận được mã không chơi golf không?
YaSh Chaudhary

1
@YaShChaudhary Ý bạn là phiên bản có 39 byte hay phiên bản có 40 byte. :-P Tôi e rằng chưa bao giờ tồn tại một phiên bản không chơi gôn thực sự. Tôi đã viết mã này trực tiếp trong Pyth, và các chương trình Pyth luôn ngắn.
Jakube

@Jakube ohk np :)
YaSh Chaudhary

8

Hồng ngọc 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(:+)}

Dùng thử trực tuyến: http://ideone.com/ZIjOmP

Mã không chơi gôn tương đương:

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

Thực hiện một chức năng fvới các tham số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

Chính xác thực hiện các thuật toán được mô tả.

Tôi đã có thể rút ngắn nó xuống 5 byte với sự giúp đỡ của @sanchises, cảm ơn!

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

Mở rộng:

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

Phiên bản cũ

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

Một gợi ý: sđược khởi tạo bởi MATLAB, vì vậy bạn chỉ cần làm s(l,l)=0; Quá tệ MATLAB không có chức năng tích hợp sẵn như là một chức năng tích hợp, đó sẽ là một sự tối ưu hóa tuyệt vời cho m.
Sanchise

Đó là một mẹo siêu tuyệt vời, cảm ơn! Tôi vẫn đang cố gắng tìm ra cách tạo ngắn hơn mbằng cách phân tách ma trận ...
flawr

Vâng, tôi cũng đã nhìn nó một lúc rồi. Có lẽ một số lập chỉ mục logic thông minh, nhưng tôi không thể nghĩ bất cứ điều gì. m+m'+fliplr(m+m')dường như là một sự gia tăng của bytecount, và tất cả các tùy chọn khác của tôi cũng vậy.
Sanchise

5

Toán học - 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]
]

Sử dụng:

g[5,5,1,2]

Đầu ra:

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)

Cải thiện giải pháp của @ flawr bằng cách thêm MATLAB-y.

Mở rộng:

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 (không tính khoảng trắng)

Ngăn xếp ban đầu nê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;

Kiểm tra nó ra

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.