폰 체스 판에서 캡처


17

폰만 입력과 출력으로 체스 판을 나타내는 문자열을 받거나 보드에서 캡처가 가능한지 여부를 반환하는 프로그램이나 함수를 작성해야합니다.

입력은 다른 조각이없는 흰색과 검은 색 폰의 위치를 나타내는 FEN 과 같은 표기법으로되어 있습니다. 적을 붙잡을 수있는 폰이 있는지 결정해야합니다.

각 등급은 등급 8로 시작하고 등급 1로 끝나는 것으로 설명됩니다. 각 등급 내에서, 각 사각형의 내용은 파일 "a"부터 파일 "h"까지 설명됩니다. 각 폰은 단일 문자로 식별됩니다 (흰색 폰 = "P", 검은 폰 = "p",). 빈 사각형은 1에서 8까지의 숫자 (빈 사각형 수)를 사용하여 기록되며 "/"는 순위를 구분합니다. (일부 위키 백과에서 가져옴)

예를 들어

8/pppppppp/8/8/4P3/8/PPPP1PPP/8

보드를 설명

--------

pppppppp


    P   

PPPP PPP

--------

흰색 폰은 검은 색이 대각선으로 위를 향하면 검은 색을 캡처 할 수 있고 (검정색은 왼쪽 위 또는 오른쪽) 검은 색 폰은 흰색이 아래쪽을 향하면 흰색을 캡처 할 수 있습니다 (흰색은 왼쪽 아래 또는 오른쪽 아래). 다른 캡쳐 움직임은 ( 엔 옆모습 )로 간주 될 수 없습니다.

입력

  • FEN 문자로 구성된 -like 문자열 12345678pP/.
  • 입력은 유효한 체스 게임 위치의 폰을 설명합니다. 이것은 (더 복잡한 제약 조건들 중에서도) 각면에 최대 8 개의 폰이 있고 1과 8 등급에는 폰이 없다는 것을 의미합니다.

산출

  • 당신이 출력해야 양쪽에 대한 가능한 캡처가있는 경우 truthy의 값과 falsy 그렇지 않으면 값입니다.

정확한 출력을 가진 입력 (한 줄에 하나씩)

8/7p/6P1/8/8/8/8/8
8/8/p7/1P6/3P3p/8/8/8
8/2P5/8/4P1p1/2p2P2/3p4/3p1P2/8
8/P7/8/5P2/2pp4/3P2p1/3pP3/8
8/P7/p7/p1P1P3/1P3p2/8/1p6/8
8/4p1P1/2P2P1P/2p1pPpp/8/6P1/pP1p4/8

잘못된 출력을 가진 입력 (한 줄에 하나씩)

8/8/8/8/8/8/8/8
8/7P/6p1/8/8/8/8/8
8/7p/7P/8/8/8/8/8
8/pppppppp/8/8/8/8/PPPPPPPP/8
8/p7/8/1p6/5P2/8/8/8
8/p7/P7/2P1p1p1/2p5/8/PP6/8

이것은 코드 골프이므로 가장 짧은 참가작이 승리합니다.


예제 보드를 설명해서는 안 8/pppppppp/8/8/8/7P/PPPP1PPP/8됩니까?
TheNumberOne

@TheNumberOne 아니요, 7P폰이 마지막 8 번째 파일에 있음을 의미합니다. (하지만 다이어그램이 잘못되었습니다, 나는 그것을 수정했습니다.)
randomra

1
enpassant 를 제거 하면 덜 재미있는 퍼즐이됩니다.
corsiKa

답변:


6

Pyth, 25 바이트

/smC,>JsXz`M9*LN9dJ,8T"Pp

테스트 스위트

단계 :

숫자를 동등한 수의 따옴표 ( N) 로 바꾸어 입력을 변환하십시오 . 에 저장됩니다 J. 그런 다음 첫 8 ~ 10자를 잘라 내고 원본과 결과를 압축합니다. 캡처 쌍은로 변환 "Pp"되므로 결과 목록에서 해당 문자열의 개수를 찾습니다. 출력입니다.

보너스로 실제로 입력에서 가능한 캡처 수를 계산합니다.


또 다른 25 가지 해결책 : :sXz`M9*LN9"p.{7}(..)?P"1슬프게도 마지막 매개 변수 :는 선택 사항이 아닙니다 (필자가되어야한다고 생각합니다).
Jakube

3
@ 자쿠 베 윌.
isaacg

12

망막 , 33 29 바이트

T`d`w
)`\d
$0.
_

p.{7}(..)?P

단일 파일에서 코드를 실행하려면 -s플래그를 사용하십시오 .

공백 문자열 (또는 다른 문자)로 숫자를 확장하는 데 17 바이트가 걸리지 않는 Perl과 같은 것으로 쉽게 이길 수 있어야합니다.

캡처가 가능한 경우 출력은 양수 (거짓)이고 그렇지 않은 경우 0 (거짓)입니다.

설명

T`d`w
)`\d
$0.

이것은 두 단계의 루프입니다. 첫 번째는 각 숫자를 감소시키는 음역 단계이며 0을 밑줄로 바꿉니다. 왜? 때문에 d하고하는 것은 w다음 두 줄에 확장 :

0123456789
_0123456789AB...YZab...yz

음역 단계의 대상 세트가 소스 세트보다 길면 외부 문자는 무시되므로 감소하는 동작 (솔직히 w문자 클래스를 확장 할 때 숫자 앞에 밑줄을두기로 결정한 것은 운이 좋았습니다 ) .

그런 다음 두 번째 단계는 교체이며 .각 숫자 에 a 를 추가합니다 . 즉 n, 각 숫자에 대해 n마침표가 밑줄로 바뀌기 전에 마침표가 추가됩니다.

_
<empty>

이것은 단지 밑줄을 제거합니다.

p.{7}(..)?P

마지막으로 일치하는 것을 찾습니다. 우리는 동반자를 무시하고 있기 때문에 캡처는 대각선 아래 pP대각선 이있는 경우에만 가능 합니다. 선형 문자열에서 이것은 단순히 두 폰 사이에 7 또는 9 문자가 있어야 함을 의미합니다. 이것은 .{7}(..)?7 문자와 일치하고 선택적으로 다른 두 문자와 일치합니다.

이러한 일치 단계는 찾은 일치 수를 반환합니다.


"공간의 문자열 (또는 다른 문자) 로의 숫자 확장이 17 바이트를 차지하지 않는 Perl과 같은 것에 의해 쉽게 이길 수 있어야합니다." . ( 나의 펄 대답. ) 그러나 아마도 다른 누군가가 할 수있다 ...
msh210

3

자바 스크립트, 272 자

function h(t){b=[[]];for(i=-1;i++<7;){c=0;b.push(l=[]);for(j=-1;j++<7;){o=t.split('/')[i][j];switch(o){case'P':l[c++]=-1;break;case'p':l[c++]=1;break;default:c+=parseInt(o);}}}b.push([]);for(i=1;i<9;i++)for(j=0;j<8;j++)if((p=b[i][j])&&(b[i+p][j-1]||b[i+p][j+1]))return 1;}

개선의 여지가 많을 것입니다.


3

루비, 145123 46 바이트

->b{b.gsub(/\d/){|x|?.*x.to_i}=~/p.{7}(..)?P/}

나는 왜 내가 이것을 처음부터 생각하지 않았는지 모른다. 훨씬 짧고 읽기 쉽습니다.

테스트는 다음과 같습니다. http://ideone.com/Gzav8N


기존 접근법 :

->b{l={}
r=p
b.split(?/).map{|s|c={}
i=0
s.chars.map{|x|n=x.to_i;c[i]=x;i+=n<1?1:n;x==?P&&r||=l[i-2]==?p||l[i]==?p}
l=c}
r}

온라인 테스트 : http://ideone.com/9L01lf , 골프 전 버전 : http://ideone.com/CSmqlW

수정 이력은 여기에서 확인할 수 있습니다 .


2

ES6, 64 바이트

지속되는 경우 적절한 바이트 수!

f=s=>/p.{7}(..)?P/.test(s.replace(/\d/g,n=>"        ".slice(-n)))

나는 실제로 다른 해결책을 먼저 읽지 않고이 솔루션을 생각했지만 당신이 나를 믿지 않는다면 상관하지 않습니다.



0

PHP, 94 87 80 바이트

for(;$i++<8;)$t[$i]=$s.=" ";echo preg_match("#p.{7}(..)?P#",strtr($argv[1],$t));

그 loop + strtrpreg_replace_callbackwith 보다 훨씬 짧습니다 str_pad.


0

젤리, 88 84 79 72 69 65 64 63 60 바이트

확실히 개선의 여지가 있습니다. 젤리가 질문 전에 만들어 졌기 때문에 비경쟁. 알려 주신 @lirtosiast에게 감사드립니다!

ØDṖḊ
”_x
e1£¬
1£iЀ2Ŀ€
x"3Ŀ€;"ÇFṣ”/
w€⁾pPn0
5ĿUŒDÇ
5ĿŒD6ĿoÇS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.