기사가 체스 판에 머무를 확률은 얼마입니까?


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
왜 정확한 알고리즘을 처방합니까? 실제로 더 우아한 대안이 있는지 확실하지 않지만 특정 알고리즘을 요구하면 다른 영리한 접근법을 잠재적으로 막을 수 있습니다. 또한 좌표계를 너무 자세하게 지정할 필요는 없다고 생각합니다. 확률에 전혀 영향을 미치지 않습니다.
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

우리는 골퍼가 아닌 코드를 얻을 수 있습니까?
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

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

힌트 : sMATLAB에 의해 초기화되므로, 그냥 할 수 있습니다 s(l,l)=0; 너무 나쁜 MATLAB에는 내장 함수로 피본 나시가 없기 때문에에 최적화되어 m있습니다.
Sanchises

정말 대단합니다. 고마워요! 나는 아직도 m매트릭스 분해에 의해 더 짧은 생성 방법을 찾으려고 노력하고있다 .
flawr

그래, 나도 한동안보고 있었어 아마도 똑똑한 논리적 인덱싱이지만 아무것도 생각할 수 없습니다. m+m'+fliplr(m+m')바이트 수가 증가한 것으로 보이며 다른 옵션도 있습니다.
Sanchises

5

수학-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.