Mê cung bàn cờ


14

Các quân cờ (vua, hoàng hậu, tân binh, giám mục và hiệp sĩ) và quân cờ nằm ​​trên một bảng, nhưng không phải trên hình vuông a1 hoặc h8 . Nhiệm vụ của bạn là đi từ a1 trống đến các ô vuông h8 trống , chỉ đi qua các ô vuông trống. Các quy tắc di chuyển như sau:

  1. Bạn có thể tiến hành từ bất kỳ hình vuông trống nào đến bất kỳ hình vuông trống nào bên cạnh nó (cùng thứ hạng, tập tin tiếp theo hoặc tập tin trước hoặc tập tin tương tự, thứ hạng tiếp theo hoặc trước đó).
  2. Bạn có thể tiến hành từ bất kỳ hình vuông trống nào đến bất kỳ hình vuông trống nào theo đường chéo bên cạnh nó (xếp hạng tiếp theo hoặc trước, tập tin tiếp theo hoặc trước đó), miễn là các hình vuông góc catty chứa (a) hai con tốt hoặc (b) cầm đồ / mảnh đối diện màu sắc. (Hai mảnh không cầm đồ, hoặc một mảnh không cầm đồ và một con tốt, cùng màu đủ mạnh để ngăn cản sự tiến bộ của bạn qua góc, nhưng hai con tốt không; và những mảnh / con tốt có màu đối diện không hoạt động hòa nhạc theo cách của bạn.) Ví dụ: nếu bạn trên c4d5 trống, bạn có thể tiếp tục với nó được cung cấp c5d4 chứa pawns hoặc chứa các mảnh / pawns có màu đối diện. Xem phần "Ví dụ đường chéo", bên dưới, để biết hình ảnh.

Đầu vào

Mô tả hội đồng của FEN . Đó là: Đầu vào sẽ là một chuỗi bao gồm mô tả về hạng 8 , dấu gạch chéo ( /), mô tả về hạng 7 , dấu gạch chéo, Câu và mô tả về hạng 1 . Mô tả của mỗi cấp bậc bao gồm các số và chữ cái chạy từ tệp a đến tệp h , trong đó các chữ cái chỉ các mảnh và con tốt (các màu đen là p= cầm đồ, n= hiệp sĩ, b= bishop, r= rook, q= queen, k= king và trắng những cái là phiên bản viết hoa của cùng một) và các con số chỉ số lượng hình vuông trống liên tiếp. Ví dụ, rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNlà bảng sau khi di chuyển một lớp (vua cầm đồ sang e4) trong một ván cờ.

a1h8 sẽ trống trong đầu vào; tức là dấu gạch chéo đầu tiên có một chữ số trước nó và dấu gạch chéo cuối cùng có một chữ số sau nó.

Đầu ra

Truthy hoặc falsey, cho biết liệu thành công vượt qua h8 là có thể.

Nếu đầu vào không phải là mô tả bảng FEN hợp lệ (nghĩa là phù hợp với giải thích của tôi ở trên) hoặc nếu a1 hoặc h8 bị chiếm đóng, thì đầu ra có thể là bất cứ thứ gì hoặc không có gì. (Nói cách khác: bạn có thể cho rằng đầu vào đáp ứng các yêu cầu ở trên.)

Chấm điểm

Đây là mã golf: ít byte nhất thắng.

Ví dụ đầu vào và đầu ra

Lưu ý rằng mã của bạn phải hoạt động cho tất cả các đầu vào hợp lệ, không chỉ các ví dụ.

Thêm một khoảng wtrắng và sau mỗi FEN để hình dung nó tại http://www.dhtmlgoodies.com/scripts/chess-fen/chess-fen-3.html. (Lưu ý rằng một số trình hiển thị FEN trực tuyến khác sẽ không cho phép một ván cờ bất hợp pháp trong cờ vua, ví dụ như cầm đồ ở hạng 1 hoặc 8 , vì vậy không thể được sử dụng cho mục đích của chúng tôi.)

Ví dụ thật

  • 8/8/8/8/8/8/8/8 - cái bảng trống
  • 1p1Q4/2p1Q3/2p1Q3/2p1Q3/2p1Q3/2p1Q3/Q1p1Q3/1q3q2- có đường dẫn a1 , b2 , b3 , b4 , b5 , b6 , b7 , c8 , d7 , ( không phải e8 , bị chặn, nhưng) d6 , d5 , d4 , d3 , d2 , d1 , e1 , f2 , f3 , f4 , f5 , f6 , f7 , f8 , g8 , h8
  • 8/8/KKKKK3/K3K3/K1K1p3/Kp1K4/K1KK4/2KK4 - một ví dụ trong đó một hình vuông bị chặn tại một điểm phải được chuyển qua sau này (để đảm bảo bạn không đặt hình vuông là không thể vượt qua)
  • K1k1K1K1/1K1k1K1k/K1K1k1K1/1k1K1K1k/K1k1K1k1/1K1k1k1K/K1K1k1K1/1k1k1K1k- có một con đường duy nhất đi qua (chỉ cần đi theo mũi của bạn: chỉ có một hình vuông để di chuyển đến mỗi bước, trừ khi lùi một bước); đây cũng là một ví dụ trong đó một hình vuông bị chặn tại một điểm nhưng cần thiết sau đó

Ví dụ Falsey

  • 6Q1/5N2/4Q3/3N4/2Q5/1N6/2Q5/1N6 - mọi cố gắng trên một đường dẫn sẽ phải đi qua hai mảnh cùng màu nằm chéo nhau
  • N1q1K1P1/1R1b1p1n/r1B1B1Q1/1p1Q1p1b/B1P1R1N1/1B1P1Q1R/k1k1K1q1/1K1R1P1r- cách duy nhất qua đường chéo a8-h1 là ở f2-g3 , nhưng điều đó đòi hỏi phải đi qua e1-d2 hoặc f2-e3 , cả hai đều không thể.
  • 4Q3/4q3/4Q3/5Q2/6Q1/3QqP2/2Q5/1Q6
  • 4q3/4Q3/4q3/5q2/6q1/3qQp2/2q5/1q6

Ví dụ đường chéo

Trong trường hợp văn xuôi ở trên không rõ ràng, đây là một số hình ảnh.

Đường chéo có thể vượt qua

cầm đồ cùng màu cầm đồ của màu sắc đối nghịch tân binh của màu sắc đối nghịch

Đường chéo bất khả xâm phạm

một con gà trống và một con tốt cùng màu tân binh cùng màu


Tôi xin lỗi, tôi không chắc chắn về các quy tắc golf stanadard: Điều gì xảy ra, nếu bạn chèn một chuỗi bất hợp pháp? Có thể có hành vi nào xảy ra không?
alex berne

@alexberne Tôi tin rằng điều này bao gồm nó: "mã của bạn phải hoạt động cho tất cả các đầu vào hợp lệ ".
Rainbolt

@alexberne, tôi đã chỉnh sửa. Bây giờ có rõ không?
msh210

Vâng cảm ơn. Tôi mới ở đây, vì vậy nó có thể là thứ bình thường cho người chơi golf, nhưng đối với tôi thì không rõ :)
alex berne

Chỉ muốn nói cảm ơn cho một câu đố tuyệt vời @ msh210. Tôi không hiểu tại sao không có nhiều câu trả lời hơn.
Joffan

Câu trả lời:


6

VBA 668 666 633 622 548 510 489 435 331 322 319 315 byte

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

Đọc chuỗi đầu vào chiếm tới 'Wend'. Hiệu ứng phụ tuyệt vời - điều này từ bỏ chuỗi đầu vào sau khi bảng [X] được mã hóa hoàn toàn, do đó bạn có thể để lại một mô tả ở cuối.

Trong bảng mã, pawns là 2, các mảnh khác là 3, màu đen là âm. Chân được nhận dạng bởi 'P' & 'p' có mã ký tự chia hết cho 8.

'X (7,0) = 1', đặt a1 có thể truy cập, là nơi bắt đầu kiểm tra đường dẫn. Điều này liên tục quét bảng cố gắng thêm các ô vuông có thể truy cập từ các ô vuông được đánh dấu là có thể truy cập (1) cho đến nay. Truy cập chéo và chiếm chỗ được kiểm tra trong IF + logic-calc từng sống trong một chức năng nhưng bây giờ nằm ​​trong các vòng lân cận lồng nhau. Kiểm tra truy cập đường chéo phụ thuộc vào sản phẩm của hai hình vuông góc kitty, chỉ ở mức 6 hoặc nhiều hơn nếu các mảnh có cùng màu và ít nhất một là không phải là một con tốt.

Gọi trong bảng tính; trả về giá trị trong X (0,7) - 1 nếu h8 có thể truy cập và 0 nếu không - điều mà Excel nhận ra là trung thực / giả. = IF (Z (C2), "có", "không")

nhập mô tả hình ảnh ở đây

Tôi có thể đã bị mang đi với việc xóa mã xuống, ở trên, vì vậy đây là một phiên bản nhận xét bán vô căn cứ:

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

Ghi chú Tiến bộ

Chỉnh sửa 1: Mã bây giờ không phải là 666-quỷ dữ :-D và đã mất chức năng; Tôi tìm thấy một cách đủ ngắn để viết chúng để tránh chi phí.

Chỉnh sửa 2: Một bước nhảy vọt lớn khác, hoàn thành hiệu quả công việc loại bỏ các chức năng inc / dec, thở dài và sử dụng một vài quả cầu. Cuối cùng tôi cũng có thể hiểu được điều này ....

Mã hóa của các mảnh và hình vuông đã thay đổi. Không ảnh hưởng đến chiều dài mã.

Chỉnh sửa 3: Trả về các hàm (giả), loại bỏ tất cả các Callbyte gây phiền nhiễu đó và một số điều chỉnh khác.

Chỉnh sửa 4: Vượt qua 500 lớn, woohoo - smooshed 3 Cho các vòng lặp thành 1.

Chỉnh sửa 5: Jiminy Cricket, một sự sụt giảm lớn khác khi tôi kết hợp hai chức năng với nhau - kiểm tra truy cập đường chéo của tôi luôn vượt qua cho các ô vuông liền kề, vì vậy ...

Chỉnh sửa 6: Holy niblicks, một sự sụt giảm lớn khác. Tạm biệt các chức năng bên ngoài và do đó trên toàn cầu ... Tôi đã đi được dưới một nửa thời lượng đăng ban đầu ....

Chỉnh sửa 7: Thêm phiên bản chưa được chỉnh sửa

Chỉnh sửa 8: Sửa đổi quy trình đọc thêm một vài đô la

Chỉnh sửa 9: Bóp một vài biểu cảm cho vài giọt máu cuối cùng

Chỉnh sửa 10: Câu Nextlệnh Compund giảm một vài byte


Đối với sở thích, đồ họa của các bảng sau khi phân tích khả năng truy cập (số mã đã hết hạn nhưng ...) hình vuông có thể truy cập là màu xanh lá cây, hình vuông không thể tiếp cận màu trắng và các màu khác là miếng hoặc con tốt.

3 ban thành công 3 bảng bị chặn

Một vài bảng thử thách: h8 có thể truy cập được ở cả hai:

  • P1Pq2p1 / 1P1R1R1p / 1K2R1R1 / 1p1p1p2 / p1b1b1np / 1B1B1N1k / Q1P1P1N1 / 1r1r1n2 - 10 vượt qua để giải quyết
  • P1P3r1 / 1P1R2r1 / 1N1R1N2 / 1P1P1P2 / 1n1p1ppp / 1B1B4 / 1b1pppp1 / 1P6 - đường dẫn quanh co

1
Rất đẹp và +1, nhưng: (1) Bạn có chắc chắn đủ 960 bước không? (2) Bạn có thể lưu một số byte bằng cách nhìn bảng lộn ngược không? If V>9 Then X(7-P,C)=tôi sẽ nghĩ (không phải tôi biết VBA) trở thành If V>9 Then X(P,C)=.
msh210

Trên thực tế kỹ thuật đó tiết kiệm khởi tạo P, vì vậy cảm ơn bạn đã hỏi :-). Và vâng, tôi chắc chắn 15 lượt của hội đồng quản trị là đủ; Tôi đã làm khá nhiều kiểm tra. Trên thực tế, tôi chưa thể vượt qua 10 lần, nhưng 640 và 960 có cùng số lượng nhân vật nên tôi sẽ chơi an toàn. NHƯNG nếu tôi lật ngược tấm ván, nó CÓ THỂ mất hơn 10 đường chuyền và có thể hơn 15 - trừ khi tôi vượt qua tấm ván lộn ngược, nó sẽ có một cái đầu.
Joffan

@ msh210 1 quan sát bổ sung - 15 vòng là vừa đủ để phân tích toàn bộ bảng, trường hợp xấu nhất, nhưng 10 vòng là đủ để có được trạng thái của h8, vì vậy tôi thực sự có một biên độ lớn. Lý do là việc tìm đường dẫn hoạt động nhanh hơn nhiều theo hướng đánh giá, tăng hàng # và cột # - miễn là đường dẫn đi lên hoặc sang phải, nó sẽ được hoàn thành trong một lượt. Đi sang trái hoặc xuống chỉ được một bước nữa cho mỗi lần vượt qua.
Joffan

@ msh210 Là một phần của cải tiến quy trình đọc - trong đó giữ cho cơ sở không để lại nhận xét về phần cuối của chuỗi FEN - Tôi đã thêm bảng đảo ngược mà bạn đề xuất - một số bảng hiện có hơn 15 lượt (tối đa 17) chức năng đã tăng lên 30 lượt của hội đồng quản trị.
Joffan

@Joffan bạn có thể thả 3 Bytes bởi ngưng tụ tất cả các trường hợp [some non-letter character] Tođến[some non-letter character]To
Taylor Scott

3

Matlab, 636 887 byte khi được lưu (bao gồm cả thụt lề)

Giải pháp này không được đánh gôn lắm, nhưng tôi muốn đi trước và đưa nó lên.

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

Đọc một chuỗi bảng xnhư được chỉ định ở trên và biến nó thành đại diện hoàn toàn hơn o, sau đó tìm tất cả các di chuyển (cạnh đồ thị) giữa các không gian, sau đó tìm ra những chuyển động nào có thể (không phải vào không gian đầy), sau đó tìm ra những chuyển động có thể có " cổng "của hai mảnh để đi qua giữa, sau đó tìm ra nếu cổng mở (cầm đồ, màu đối diện) hoặc đóng (cùng màu và bao gồm cả không cầm đồ). Sau đó, nó đi qua để tìm các vị trí có thể tiếp cận bằng các đường dẫn từ hình vuông bên trái phía dưới và nếu một đường dẫn có thể đến không gian 64, thì đó là bảng Có.


1
Mát mẻ. Bạn đã kiểm tra nó với các FEN ví dụ của tôi trong câu hỏi để đảm bảo nó trả về kết quả chính xác cho từng câu hỏi chưa? Ngoài ra, vì đây là một câu hỏi golf-code , bạn thực sự nên chơi golf này. Nếu không có gì khác, bạn có thể thoát khỏi vết lõm (hoặc biến nó thành một khoảng trắng hoặc tab thay vì bốn khoảng trắng) không? và / hoặc thả các khoảng trống xung quanh =s? (Tôi không biết MATLAB: có lẽ những điều đó là không thể.)
msh210

Vâng, và tôi có thể làm một số điều đó trong giờ nghỉ tiếp theo của tôi. Tôi đã kiểm tra nó chống lại tất cả các ví dụ của bạn và sau đó một số. Tôi có nên chỉ ra điều đó theo một cách nào đó?
sintax

Không biết; Tôi chỉ đang tự hỏi.
msh210
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.