왕이 폰을 잡을 수 있습니까?


26

4 개의 정수 x 1 , y 1 , x 2 , y 2 의 입력이 주어지면 체스의 흰색 왕 (좌표 ( x 1 , y 1 ))이 검은 색 폰 (좌표 ( x 2 , y 2 )) 폰이 여왕에게 최대한 빨리 승격시키기 위해 움직이고 있다면 캡처하십시오.

보드의 좌표는 다음과 같습니다.

       first coordinate (x)
             12345678

           1 .#.#.#.#
           2 #.#.#.#.
           3 .#.#.#.#
  second   4 #.#.#.#.
coordinate 5 .#.#.#.#
    (y)    6 #.#.#.#.
           7 .#.#.#.#
           8 #.#.#.#.

이동하는 것이 흰색이고 (왕의 차례) 두 선수가 최적으로 플레이한다고 가정합니다 (왕은 가능한 한 빨리 움직여 폰을 잡을 수 있고 폰은 가능한 빨리 움직여 승진시킵니다). 입력 좌표는 항상 구별되며 폰은 절대 y 좌표 8로 시작하지 않습니다.

왕은 회전 할 때마다 어느 방향 으로든 한 칸 움직입니다 (대각선으로 움직일 수 있음). 7)이 경우 두 칸 앞으로 이동할 수 있습니다.

입력은 공백 / 쉼표로 구분 된 문자열, 문자열 / 정수 배열 또는 4 개의 함수 / 명령 줄 / 기타 인수로 제공 될 수 있습니다. 가장 편리한 / 골프 순서로 좌표를 지정할 수 있습니다 (따라서 [y 2 , y 1 , x 1 , y 2 ]로 입력을받는 것이 일관된 한 괜찮습니다). 결과는 진실하거나 거짓 값이어야합니다 .

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

확실한 테스트 사례 :

5 3 3 2

6 1 1 7

3 3 3 2

4 1 4 7

7 7 1 7

1 8 1 7

거짓 테스트 사례 :

6 4 3 2

8 8 1 7

3 4 3 2


좌표의 순서를 선택할 수 x1 y1 x2 y2있습니까? 아니면 좌표 여야 합니까?
Dennis

11
1 8 1 7폰이 두 칸을 이동할 수 있기 전에 왕이 붙잡는 테스트 케이스를 제안합니다 . 나는 모든 대답이 잘못되었다고 생각합니다. 이 상황은 문제를 훨씬 더 어렵게 만듭니다.
xnor

1
@Neil 숫자로의 변환은 지루하고 아무것도 추가하지 않기 때문에
edc65

1
@Neil 여기에는 이미 대수 표기법과 관련된 게시물이 많이 있으며 실제 과제에 집중하고 싶었습니다.
Doorknob

2
@kaine 전당포는 왕이 승진하기 전이나 이동하기 전에는 왕에게 큰 위협이되지 않습니다. 왕은 항상 똑같이 잘 움직일 수 있기 때문에 점검을 할 필요가 없습니다.
Neil

답변:


3

젤리 , 33 바이트

‘»Ɠ_2<®
Ɠ©<7
:5+Ɠ>7$¤<1.4
Ɠ_ƓA2£Ŀ

이 프로그램은 x2\nx1\ny2\ny1STDIN에서 와 같이 좌표를 읽습니다 . 온라인으로 사용해보십시오!

비경쟁 버전

불행히도, Jelly 통역사는이 질문이 게시되었을 때 버그가있었습니다. 이 버그로 인해 둘 이상의 명령 줄 인수를 허용하지 못했습니다. 최신 버전의 Jelly는 지정된 작업을 23 바이트로 해결할 수 있습니다 .

⁶>7×5
_A+⁵>6$¤+¢’»⁶_2<⁵

온라인으로 사용해보십시오!


18

파이썬 2, 53 40

lambda x,y,p,q:y-2<q>=abs(x-p)+q/7+y/8*5

왕은 좌표 (x, y)와 폰이 (p, q)있습니다.

세 가지 중요한 경우가 있습니다.

  1. 폰은 랭크 7에 있고 킹은 랭크 8에 있습니다. 폰을 캡처하려면, 킹이 같은 파일 또는 인접한 파일에 있어야합니다.

    결과: q = 7 ⋀ y = 8 → |x - p| ≤ 1

  2. 전당포는 7 위에 있습니다. 전당포를 잡으려면, 왕이 6 개의 파일 안에 있어야합니다.

    결과: q = 7 → |x - p| ≤ 6

  3. 폰은 낮은 순위에 있습니다. 폰을 잡으려면, 킹은 폰 후 최대 한 번의 이동으로 승진 광장에 도달 할 수 있어야합니다.

    결과: q < 7 → |x - p| ≤ q ⋀ y - 1 ≤ q

내 해결책은 이러한 조건에 불과합니다. 이번에는 실수가 없기를 바랍니다.


2
어떻게 절단에 대해 abs함께 max(y-1,x-p,p-x)?
xnor

f(1,8,1,7)True왕이 바로 폰을 캡처하기 때문에? 킹이 즉시 잡으면 폰 7 행을 6 행으로 취급 할 수없는 미묘함이 있다고 생각합니다.
xnor

@ xnor 나는 그것이 지금 (정확하지 않은 방식으로) 고쳐 졌다고 생각합니다.
grc

1
마지막 조건을 반대로 한 경우 or및 사이의 공백을 제거 할 수 있습니다 -2.
xsot

팁을 주셔서 감사합니다. 나는 접근 방식을 바꾸었고 지금은 조금 더 내려 갔다.
grc

2

프롤로그, 48 42 바이트

암호:

p(X,Y,P,Q):-Y-2<Q,Q>=abs(X-P)+Q//7+Y//8*5.

예 :

p(1,8,1,7).
true

p(3,4,3,2).
false

프롤로그에게 가장 큰 도전은 아닙니다.

편집 : grc의 Python 2 answer 에서 사용 된 수식으로 전환하여 6 바이트를 절약했습니다 .
불행히도 Prolog는 파이썬이 할 수 있고 정수 나누기가 float 나누기보다 1 바이트 더 길기 때문에 비교를 연결할 수 없습니다.

여기에서 온라인으로 사용해보십시오


0

자바 스크립트 (ES6), 52

(x,y,u,t,d=x>u?x-u:u-x)=>(d>=y?d:y-1)<=(d<2|t<7?t:6)

Math.abs, Math.min, Math.max를 사용하지 않고 바이트를 절약하고 싶습니다.

일곱 번째 줄의 폰은 킹이 가까운 열에 있지 않은 경우에만 2 칸 이동을 피할 수 있습니다 d. 따라서 7을 6으로 대체하기 전에 점검 해야합니다.

콘솔에서 실행할 테스트 사례 :

;[f(5,3,3,2),f(6,1,1,7),f(3,3,3,2),f(1,8,1,7),f(6,4,3,2),f(8,8,1,7),f(3,4,3,2)]

결과: [true, true, true, true, false, false, false]


0

루비, 50 바이트

def f(a,b,c,d)(a-c).abs<=(d==7?6-b/8*5:d)&&b-d<2;end

인수는 (king x, king y, pawn x, pawn y), 모든 정수입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.