체스 판 미로


14

체스 조각 (왕, 여왕, 루크, 주교, 기사)과 폰은 보드에 있지만 a1 또는 h8 광장 에는 없습니다 . 당신의 임무는 빈 a1 에서 빈 h8 사각형으로 이동하고 빈 사각형 만 통과하는 것입니다. 운동 규칙은 다음과 같습니다.

  1. 빈 사각형에서 그 옆에있는 빈 사각형 (같은 순위, 다음 또는 이전 파일 또는 동일한 파일, 다음 또는 이전 순위)으로 진행할 수 있습니다.
  2. 당신은 그것 (다음 또는 이전 순위, 다음 또는 이전 파일)에 대각선 옆에있는 빈 사각형에 빈 광장에서 진행할 수 있습니다 제공 캐티 코너 사각형 중 하나를 포함하는 것을 (a)는 두 심 또는 반대의 (b)는 심 / 조각 색깔. (같은 색상의 두 개의 non-npawn 조각 또는 non-pnn 조각과 폰은 모서리를 가로 질러 진행을 방해 할만큼 강하지 만, 두 개의 폰은 그렇지 않으며 반대 색상의 조각 / 발은 작동하지 않습니다. 예를 들어 c4에 있고 d5 가 비어있는 경우 c5d4에 폰이 포함되어 있거나 반대 색상의 조각 / 포가 들어있는 경우 계속 진행할 수 있습니다 . 사진은 아래의 "대각선 예"섹션을 참조하십시오.

입력

FEN 보드 설명. 즉, 입력은 순위 8 설명 , 슬래시 ( /), 순위 7 설명 , 슬래시,… 및 순위 1 설명 이 포함 된 문자열입니다 . 각 등급에 대한 설명은 파일 a 에서 파일 h 까지 실행되는 숫자와 문자로 구성되며 , 여기서 문자는 조각과 폰을 나타냅니다 (검은 색은 p폰, n= knight, b= bishop, r= rook, q= queen, k= king 및 흰색 임) 하나는 대문자로 된 버전이며 숫자는 연속 된 빈 사각형 수를 나타냅니다. 예를 들어, rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBN한 번 움직 인 후의 보드입니다 (킹은 폰으로 e4체스 게임에서).

입력에서 a1h8 이 비어 있습니다. 즉, 첫 번째 슬래시 앞에 숫자가 있고 마지막 슬래시 뒤에 숫자가 있습니다.

산출

h8에 성공적으로 통과 할 수 있는지 여부를 나타내는 진실하거나 거짓 입니다.

입력이 유효한 FEN 보드 설명 (즉, 위의 설명과 일치하는 설명)이 아니거나 a1 또는 h8 이 점유 된 경우 출력은 아무거나 될 수 없습니다. 즉, 입력이 위의 요구 사항을 충족한다고 가정 할 수 있습니다.

채점

이것은 코드 골프입니다 : 가장 적은 바이트가 이깁니다.

입력 및 출력 예

코드는 예제뿐만 아니라 모든 유효한 입력에 대해 작동해야합니다.

w각 FEN 뒤에 공백과를 추가하여 에 시각화하십시오 http://www.dhtmlgoodies.com/scripts/chess-fen/chess-fen-3.html. (일부 다른 온라인 FEN 비주얼 라이저는 체스에서 불법적 인 보드 (예 : 1 또는 8 등급의 폰)를 허용 하지 않으므로 우리의 목적으로 사용할 수 없습니다.)

참신한 예

  • 8/8/8/8/8/8/8/8 — 빈 보드
  • 1p1Q4/2p1Q3/2p1Q3/2p1Q3/2p1Q3/2p1Q3/Q1p1Q3/1q3q2— 경로 a1 , b2 , b3 , b4 , b5 , b6 , b7 , c8 , d7 , ( e8이 아닌 차단됨) d6 , d5 , d4 , d3 , d2 , d1 , e1 , f2 , f3 , f4 , f5 , f6 , f7 , f8 , g8 , h8
  • 8/8/KKKKK3/K3K3/K1K1p3/Kp1K4/K1KK4/2KK4 — 한 지점에서 차단 된 정사각형을 나중에 통과해야하는 예 (정사각형을 통과 불가능으로 설정하지 않도록)
  • K1k1K1K1/1K1k1K1k/K1K1k1K1/1k1K1K1k/K1k1K1k1/1K1k1k1K/K1K1k1K1/1k1k1K1k— 통과하는 단일 경로가 있습니다 (코를 따라 가십시오 : 뒤로 한 단계 씩 이동하지 않으면 각 단계마다 이동할 사각형이 하나만 있습니다). 이것은 또한 정사각형이 한 지점에서 차단되었지만 나중에 필요한 경우의 예입니다.

팔시 예

  • 6Q1/5N2/4Q3/3N4/2Q5/1N6/2Q5/1N6 — 경로에 대한 모든 시도는 대각선으로 배치 된 두 개의 동일한 색상 조각을 통과해야합니다.
  • N1q1K1P1/1R1b1p1n/r1B1B1Q1/1p1Q1p1b/B1P1R1N1/1B1P1Q1R/k1k1K1q1/1K1R1P1ra8-h1 대각선을 통과하는 유일한 방법 은 f2-g3 이지만 e1-d2 또는 f2-e3을 통과해야 합니다. 둘 다 불가능합니다.
  • 4Q3/4q3/4Q3/5Q2/6Q1/3QqP2/2Q5/1Q6
  • 4q3/4Q3/4q3/5q2/6q1/3qQp2/2q5/1q6

대각선 예

위의 산문이 불분명 한 경우 몇 가지 그림이 있습니다.

통과 가능한 대각선

같은 색의 폰 반대 색상의 폰 반대 색상의 루크

지나갈 수없는 대각선

루크와 같은 색의 폰 같은 색의 루크


죄송합니다. 표준 골프 규칙에 대해 잘 모르겠습니다. 잘못된 문자열을 삽입하면 어떻게됩니까? 어떤 행동이 일어날 수 있습니까?
alex berne 2016 년

@alexberne 나는 이것이 당신의 코드가 유효한 모든 입력에 대해 작동해야한다고 생각합니다 .
Rainbolt 2016 년

@ alexberne, 편집했습니다. 지금은 분명합니까?
msh210

예, 고마워요 그것은 골퍼 USAL 물건 수 있습니다, 그래서 내가 여기에 새로운 해요,하지만 나를 위해 그것을 :) 불분명
알렉스 베른

훌륭한 퍼즐 @ msh210에 감사의 말을 전하고 싶었습니다. 더 이상 답변이없는 이유를 이해하지 못합니다.
Joffan 2016 년

답변:


6

VBA 668 666 633 622 548 510 489 435 331 322 319 315 바이트

Function Z(F):Dim X(7,7):While Q<64:R=R+1:V=Asc(Mid(F,R))-48:If V>9 Then X(Q\8,Q Mod 8)=(3+(V\8=V/8))*Sgn(48-V):V=1
Q=Q-V*(V>0):Wend:X(7,0)=1:For W=0 To 2E3:Q=W Mod 8:P=W\8 Mod 8:For T=Q+(Q>0) To Q-(Q<7):For S=P+(P>0) To P-(P<7):If X(S,T)=0 Then X(S,T)=(1=X(P,Q))*(6>X(P,T)*X(S,Q))
Next S,T,W:Z=X(0,7):End Function

입력 문자열을 읽으면 'Wend'까지 차지합니다. 좋은 부작용-보드 [X]가 완전히 코딩되면 입력 문자열을 포기하므로 ​​끝에 설명을 남길 수 있습니다.

보드 코딩에서 폰은 2, 다른 조각은 3, 검은 색은 음수입니다. 폰은 8로 나눌 수있는 문자 코드를 갖는 'P'& 'p'로 인식됩니다.

a1 액세스 가능으로 설정 한 'X (7,0) = 1' 은 경로 검사가 시작되는 위치입니다. 이것은 지금까지 액세스 가능한 것으로 표시된 사각형에서 액세스 가능한 사각형을 추가하려고 시도하는 보드를 반복적으로 스캔합니다 (1). 대각선 액세스 및 점유는 IF + 논리 계산에서 한 번 기능에 살았지만 이제 중첩 된 이웃 루프에 있습니다. 대각선 접근 점검은 두 개의 키티 코너 정사각형의 곱에 의존합니다. 조각은 같은 색이 있고 적어도 하나는 폰이 아닌 조각 일 경우 6 이상입니다.

스프레드 시트로 전화하십시오. X (0,7)의 값을 반환합니다. h8에 액세스 할 수 있으면 1이고 , 그렇지 않으면 0에 해당합니다. 어느 Excel에서 진실 / 거짓으로 인식합니까? = IF (Z (C2), "예", "아니오")

여기에 이미지 설명을 입력하십시오

위의 코드를 아래로 스크롤하여 버려 졌을 수도 있습니다. 따라서 반쯤 주석 처리 된 버전이 있습니다.

Function MazeAssess(F)  'input string F (FEN)
Dim X(7, 7)             'size/clear the board; also, implicitly, Q = 0: R = 0
'Interpret string for 8 rows of chessboard
While Q < 64
    R = R + 1           ' next char
    V = Asc(Mid(F, R)) - 48  ' adjust so numerals are correct
    If V > 9 Then X(Q \ 8, Q Mod 8) = (3 + (V \ 8 = V / 8)) * Sgn(48 - V): V = 1 ' get piece type (2/3) and colour (+/-); set for single column step
    Q = Q - V * (V > 0) ' increment column (unless slash)
Wend
'Evaluate maze
X(7, 0) = 1             ' a1 is accessible
For W = 0 To 2000       ' 1920 = 30 passes x 8 rows x 8 columns, golfed to 2E3
    Q = W Mod 8         ' extracting column
    P = W \ 8 Mod 8     ' extracting row
    For T = Q + (Q > 0) To Q - (Q < 7)     ' loop on nearby columns Q-1 to Q+1 with edge awareness
        For S = P + (P > 0) To P - (P < 7) ' loop on nearby rows (as above)
            If X(S, T) = 0 Then X(S, T) = (1 = X(P, Q)) * (6 > X(P, T) * X(S, Q)) ' approve nearby empty squares if current square approved and access is possible
        Next 'S
    Next 'T
Next 'W
MazeAssess = X(0, 7)    ' report result for h8
End Function

진행 노트

편집 1 : 코드는 이제 666 악마와 같지 않으며 기능을 잃었습니다. 오버 헤드를 피하기 위해 작성하는 짧은 방법을 찾았습니다.

편집 2 : 또 다른 큰 도약으로 inc / dec 함수를 제거하고 한숨을 쉬며 두 개의 전역을 사용하는 작업을 효과적으로 마무리합니다. 나는 마침내 이것에 매달리고 있을지도 모른다 ....

조각 및 사각형의 코딩이 변경되었습니다. 코드 길이에는 영향을 미치지 않습니다.

편집 3 : (가짜) 함수의 반환, 모든 성가신 Call바이트를 제거하고 다른 조정.

편집 4 : 큰 500을 뚫고 woohoo-3 For 루프를 1로 부드럽게했습니다.

편집 5 : Jiminy Cricket, 두 기능을 함께 부드럽게 할 때 또 다른 큰 하락-대각선 액세스 확인은 항상 인접한 사각형을 통과합니다.

편집 6 : 신성한 niblicks, 또 다른 거대한 하락. Buh-bye by external functions and globals ... 나는 원래 게시 된 길이의 절반 이하로 갔다 ....

편집 7 : ungolfed 버전 추가

편집 8 : 몇 달러 더 읽기 프로세스 수정

편집 9 : 마지막 몇 방울의 피에 대해 몇 가지 표현을 압박했습니다.

편집 10 : Compund Next문이 몇 바이트 흘림


접근성을 분석 한 후 보드의 그래픽 (코드 번호는 최신이 아니지만 ...)에 액세스 할 수있는 사각형은 녹색, 액세스 할 수없는 사각형은 흰색이며 다른 색상은 조각 또는 폰입니다.

성공적인 보드 3 개 차단 된 보드 3 개

챌린지 보드 : h8 은 다음 두 가지 모두에 액세스 할 수 있습니다.

  • P1Pq2p1 / 1P1R1R1p / 1K2R1R1 / 1p1p1p2 / p1b1b1np / 1B1B1N1k / Q1P1P1N1 / 1r1r1n2-10 번 통과
  • P1P3r1 / 1P1R2r1 / 1N1R1N2 / 1P1P1P2 / 1n1p1ppp / 1B1B4 / 1b1pppp1 / 1P6-권선 경로

1
아주 좋고 +1이지만, (1) 960 걸음이면 충분합니까? (2) 보드를 거꾸로보고 약간의 바이트를 절약 할 수 있습니까? If V>9 Then X(7-P,C)=VBA를 알지 못한다고 생각 If V>9 Then X(P,C)=합니다.
msh210

실제로이 기술은 P 초기화를 절약하므로 :-)를 요청 해 주셔서 감사합니다. 그리고 네, 15 번의 패스가 충분하다고 확신합니다. 나는 많은 점검을했다. 실제로 10 패스를 넘길 수는 없었지만 실제로 640과 960에는 같은 수의 문자가 있으므로 안전하게 재생할 수 있습니다. 그러나 보드를 거꾸로 뒤집 으면 보드를 거꾸로 통과하지 않으면 오버 헤드가있는 경우가 아니라면 10 패스 이상, 15 개 이상이 걸릴 수 있습니다.
Joffan 2016 년

msh210 1 추가 관찰 @ - 15 개 루프는 단지 전체 보드, 최악의 경우를 분석하기에 충분하지만, 정말 큰 마진을 가질 수 있도록 10 개 루프, H8의 상태를 확인하기에 충분하다. 그 이유는 평가 방향으로 경로를 찾는 것이 훨씬 빨라서 행 번호와 열 번호가 증가한다는 것입니다. 경로가 올라가거나 오른쪽에있는 한, 단일 패스로 완료됩니다. 왼쪽 또는 아래쪽으로 이동하면 패스 당 한 단계 만 더 이동합니다.
Joffan

@ msh210 읽기 프로세스에 대한 개선의 일환으로-FEN 문자열의 끝에 주석을 남기는 기능을 좁게 유지했습니다-제안한 보드 반전을 추가했습니다. 일부 보드는 이제 15 패스를 넘습니다 (최대 17). 이 기능은 보드의 30 패스로 증가했습니다.
Joffan

당신의 모든 인스턴스를 응축에 의해 3 바이트를 삭제할 수 있습니다 @Joffan [some non-letter character] To[some non-letter character]To
테일러 스콧

3

Matlab, 636 887 바이트 저장시 (들여 쓰기 포함)

이 솔루션은 골프를 타지 않았지만 계속 진행하고 싶었습니다.

function[n] = h(x)
o=[];
for i=x
 b={blanks(str2num(i)),'K','k',i};o=[o b{~cellfun(@isempty,regexp(i,{'\d','[NBRQK]','[nbrqk]','p|P'}))}];
end
o=fliplr(reshape(o,8,8))
for i=1:64
 b=i-[-8,8,7,-1,-9,1,9,-7];
 if mod(i,8)==1
  b=b(1:5);
 elseif mod(i,8)==0
  b=b([1,2,6:8]);
 end
 b=b(b<65&b>0);c=o(b);dn=b(isspace(c)&ismember(b,i-[9,7,-9,-7]));
 for j=dn
  g=o(b(ismember(b,j-[-8,8,7,-1,-9,1,9,-7])));
  if ~isempty(regexp(g,'pk|kp|PK|KP|kk|KK'));c(b==j)='X';end;
 end
 Bc{i}=b(c==32);
end
n=Bc{1};
on=[];
while length(n)>length(on)
 on=n;
 for i=1:length(n)
  n=unique([n Bc{n(i)}]);
 end
end
any(n==64)
end

x위에서 지정한대로 보드 문자열 을 읽고 더 완벽하게 표현 된 것으로 바꾸고, o공백 사이의 모든 움직임 (그래프 가장자리)을 찾은 다음 어떤 움직임이 가능한지 (공백 된 공간이 아닌) 알아 낸 다음 어떤 움직임이 " 게이트가 열리면 두 문을 통과 한 다음 게이트가 열려 있는지 (앞면, 반대 색상) 또는 닫혀 있는지 (동일한 색상과 비판 포함) 알아냅니다. 그런 다음 왼쪽 아래 사각형에서 경로로 도달 할 수있는 위치를 찾기 위해 통과하며 경로가 공간 64에 도달 할 수 있으면 예 보드입니다.


1
멋있는. 질문의 예제 FEN에 대해 테스트하여 각각에 대한 올바른 결과를 반환하는지 확인 했습니까? 또한 이것은 코드 골프 질문이므로 실제로 골프를 치십시오. 다른 것이 없으면 들여 쓰기를 제거 할 수 있습니까 (또는 4 개의 공백 대신 단일 공백 ​​또는 탭으로 만들 수 있습니까)? 및 / 또는 =s 주위의 공간을 떨어 뜨립니까? (나는 MATLAB을 모른다 : 아마도 그것들은 불가능하다.)
msh210

예, 다음 휴식 시간에 그 중 일부를 할 수도 있습니다. 나는 당신의 모든 예와 일부에 대해 그것을 테스트했습니다. 어떤 식 으로든 표시해야합니까?
sintax

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