ความน่าจะเป็นที่อัศวินเข้าพักบนกระดานหมากรุกคืออะไร?


16

กำหนดขนาดของกระดานหมากรุกและตำแหน่งเริ่มต้นของอัศวินคำนวณความน่าจะเป็นที่หลังจากการkย้ายอัศวินจะอยู่ในกระดานหมากรุก

บันทึก:

  • อัศวินทำให้การเคลื่อนไหวที่เป็นไปได้ทั้งหมด 8 อย่างด้วยความน่าจะเป็นที่เท่ากัน

  • เมื่ออัศวินอยู่นอกกระดานหมากรุกมันจะไม่สามารถกลับมาข้างในได้

ป้อนคำอธิบายรูปภาพที่นี่

อินพุต

อินพุตถูกคั่นด้วยเครื่องหมายจุลภาคในแบบฟอร์ม:

l,k,x,y

โดยที่lความยาวและความกว้างของกระดานหมากรุกkคือจำนวนของการเคลื่อนไหวที่อัศวินจะทำxคือตำแหน่ง x ของตำแหน่งเริ่มต้นของอัศวินและyเป็นตำแหน่ง y ของตำแหน่งเริ่มต้นของอัศวิน โปรดทราบว่า0,0เป็นมุมซ้ายล่างของกระดานและl-1,l-1เป็นมุมบนขวาของกระดาน

ขั้นตอนวิธีการ:

เริ่มต้นด้วยพิกัดเริ่มต้นของอัศวิน ทำการย้ายที่เป็นไปได้ทั้งหมดสำหรับตำแหน่งนี้และคูณการเคลื่อนไหวเหล่านี้ด้วยความน่าจะเป็นของพวกเขาสำหรับการย้ายแต่ละครั้งจะเรียกใช้ฟังก์ชันต่อไปเรื่อย ๆ จนกว่าจะถึงเงื่อนไขการยกเลิก เงื่อนไขการสิ้นสุดคือถ้าอัศวินอยู่นอกกระดานหมากรุกในกรณีนี้คืน 0 หรือจำนวนการเคลื่อนไหวที่ต้องการหมดลงในกรณีนี้คืน 1

ดังที่เราเห็นได้ว่าสถานะปัจจุบันของการเรียกซ้ำขึ้นอยู่กับพิกัดปัจจุบันและจำนวนขั้นตอนที่ทำได้เท่านั้น ดังนั้นเราสามารถจดจำข้อมูลนี้ในรูปแบบตาราง

เครดิต

ความท้าทายนี้มาจากการโพสต์บล็อกของcrazyforcode.comเผยแพร่ภายใต้ใบอนุญาตCC BY-NC-ND 2.5 IN มันได้รับการดัดแปลงเล็กน้อยเพื่อให้มีความท้าทายมากขึ้น


14
ทำไมคุณถึงกำหนดอัลกอริทึมที่แน่นอน? ฉันไม่แน่ใจว่ามีทางเลือกที่สวยงามกว่าจริง ๆ หรือไม่ แต่การใช้อัลกอริทึมเฉพาะอาจป้องกันวิธีการที่ฉลาดกว่านี้ได้ นอกจากนี้ฉันไม่คิดว่าคุณต้องระบุระบบพิกัดในรายละเอียดมากนัก - มันไม่มีผลกระทบต่อความน่าจะเป็นเลย
Martin Ender

2
"อินพุตคั่นด้วยเครื่องหมายจุลภาคในรูปแบบ: l, k, x, y" - ดังนั้นอินพุตเป็นสตริงที่เราต้องแยกวิเคราะห์? การเขียนฟังก์ชั่นที่ใช้พารามิเตอร์ 4 ตัวไม่เป็นที่ยอมรับหรือไม่?
Cristian Lupascu

3
@Edi อย่าทำเครื่องหมายคำตอบว่า 'ยอมรับ' หากไม่มีเวลาสำหรับคนอื่นที่จะลองทำ - ทำเครื่องหมายสิ่งที่ยอมรับดังนั้นโดยทั่วไปแล้วจะพูดว่า 'ความท้าทายจบลง' - ในขณะที่โลกส่วนใหญ่อาจไม่ แม้จะมีเวลาดูมัน!
Sanchises

3
@Edi โปรดหยุดโพสต์ความท้าทายแบบสุ่มที่คุณพบบนเว็บ การคัดลอกผลงานเกิดจากชุมชนของเรา ความท้าทายจากการแข่งขันการเขียนโปรแกรมอย่างต่อเนื่องไม่มีธุรกิจที่นี่เลยเพราะพวกเขาอาจช่วยคนที่ชนะการแข่งขันนี้ และเป็นความท้าทายที่กล่าวถึงในบล็อกโพสต์เช่นความท้าทายหมากรุกนี้ ( ต้นฉบับ ) จะไม่ได้รับการตอบรับที่ดีที่นี่ เหตุผลหนึ่งคือแหล่งต้นฉบับอาจมีลิขสิทธิ์บางประเภท
Jakube

2
@Edi เช่นแหล่งที่มาของความท้าทายนี้อนุญาตให้คัดลอกและแจกจ่ายซ้ำ แต่เฉพาะในกรณีที่คุณให้เครดิตที่เหมาะสม
Jakube

คำตอบ:


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 ไม่นั่นจะเป็นช่องโหว่มาตรฐานที่ต้องห้าม ดูที่นี่
Jakube

เราสามารถรับรหัสที่ไม่ใช่ golfed ได้ไหม?
YaSh Chaudhary

1
@YaShChaudhary คุณหมายถึงรุ่นที่มี 39 ไบต์หรือรุ่นที่มี 40 ไบต์ :-P ฉันเกรงว่าจะไม่เคยมีรุ่นที่ไม่ใช่กอล์ฟอย่างแท้จริง ฉันเขียนโค้ดนี้โดยตรงใน Pyth และโปรแกรม Pyth นั้นสั้นเสมอ
Jakube

@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

Haskell - 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

ใช้อัลกอริทึมที่อธิบายไว้อย่างแน่นอน

ฉันสามารถย่อให้สั้นลงได้ 5 ไบต์ด้วยความช่วยเหลือของ @sanchises ขอบคุณ!

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เป็นฟังก์ชั่นที่จะเพิ่มประสิทธิภาพที่ดีสำหรับ
Sanchises

นั่นเป็นเคล็ดลับสุดยอดมากขอบคุณ! ฉันยังคง tryting จะหาวิธีที่สั้นกว่าของการสร้างmจากการสลายตัวของเมทริกซ์ ...
flawr

ใช่ฉันกำลังดูอยู่พักหนึ่งด้วย บางทีการสร้างดัชนีเชิงตรรกะที่ชาญฉลาด แต่ฉันคิดอะไรไม่ออกเลย m+m'+fliplr(m+m')ดูเหมือนจะเป็นการเพิ่มจำนวน bytec และตัวเลือกอื่น ๆ ของฉันทั้งหมด
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)

ปรับปรุงโซลูชันของ @ flawr ด้วยการใช้ MATLAB-y มากขึ้น

ขยาย:

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.