Chụp trên Bàn cờ cầm đồ


17

Bạn nên viết một chương trình hoặc chức năng nhận một chuỗi đại diện cho bàn cờ chỉ với những con tốt làm đầu vào và đầu ra hoặc trả về cho dù có thể bắt được bất kỳ hình thức nào trên bàn cờ.

Đầu vào là một ký hiệu giống như FEN mô tả vị trí của những con tốt trắng và đen mà không có phần nào khác hiện diện. Bạn nên quyết định nếu có một con tốt có thể bắt được kẻ thù.

Mỗi cấp bậc được mô tả, bắt đầu với thứ hạng 8 và kết thúc với thứ hạng 1; trong mỗi cấp bậc, nội dung của mỗi ô vuông được mô tả từ tệp "a" thông qua tệp "h". Mỗi con tốt được xác định bằng một chữ cái duy nhất (cầm đồ trắng = "P", cầm đồ đen = "p",). Hình vuông trống được ghi chú bằng cách sử dụng các chữ số từ 1 đến 8 (số lượng hình vuông trống) và "/" phân tách các cấp bậc. (lấy một phần từ Wikipedia)

Ví dụ

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

mô tả bảng

--------

pppppppp


    P   

PPPP PPP

--------

Một con tốt màu trắng có thể chụp một con màu đen nếu con màu đen được đặt theo đường chéo từ nó (màu đen là bên trái hoặc bên phải) và một con tốt màu đen có thể chụp một con màu trắng nếu con màu trắng nằm chéo bên dưới nó (màu trắng là xuống trái hoặc xuống phải). Không có động thái bắt giữ khác ( en passant ) nên được xem xét.

Đầu vào

  • Một chuỗi giống FEN bao gồm các ký tự 12345678pP/.
  • Đầu vào mô tả những con tốt của một vị trí trò chơi cờ hợp lệ. Điều này có nghĩa (trong số các ràng buộc phức tạp khác) sẽ có tối đa 8 con tốt cho mỗi bên và không có con tốt nào trong hàng 1 và 8.

Đầu ra

  • Nếu có một chụp có thể cho cả hai phía, bạn nên đầu ra một truthy giá trị và một falsy giá trị khác.

Ví dụ

Đầu vào với truthy đầu ra (mỗi dòng)

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

Đầu vào với falsy đầu ra (mỗi dòng)

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

Đây là mã golf nên mục ngắn nhất sẽ thắng.


Không nên mô tả bảng ví dụ 8/pppppppp/8/8/8/7P/PPPP1PPP/8?
TheNumberOne

@TheNumberOne Không, 7Pcó nghĩa là con tốt ở tập tin thứ 8 cuối cùng. (Mặc dù sơ đồ không chính xác, tôi đã sửa nó.)
Randomra

1
Tôi cảm thấy loại bỏ en passant làm cho điều này một câu đố ít thú vị hơn.
corsiKa

Câu trả lời:


6

Bình thường, 25 byte

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

Bộ kiểm tra

Các bước:

Chuyển đổi đầu vào bằng cách thay thế các chữ số bằng số dấu ngoặc kép ( N) tương đương . Điều này được lưu trong J. Sau đó, chúng tôi cắt 8 hoặc 10 ký tự đầu tiên và nén kết quả với bản gốc. Bất kỳ cặp bắt giữ nào cũng sẽ được chuyển thành "Pp", vì vậy chúng tôi sau đó tìm số đếm của chuỗi đó trong danh sách kết quả. Đây là đầu ra.

Như một phần thưởng, điều này thực sự đếm số lần chụp có thể có trong đầu vào.


25 giải pháp khác: :sXz`M9*LN9"p.{7}(..)?P"1Đáng buồn là tham số cuối cùng :không phải là tùy chọn (tôi nghĩ nó nên như vậy).
Jakube

3
@Jakube Sẽ làm.
isaacg

12

Võng mạc , 33 29 byte

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

p.{7}(..)?P

Để chạy mã từ một tệp duy nhất, sử dụng -scờ.

Có thể dễ dàng bị đánh bại bởi một cái gì đó như Perl trong đó việc mở rộng các chữ số thành các chuỗi khoảng trắng (hoặc các ký tự khác) không chiếm 17 byte.

Đầu ra là dương (trung thực) nếu có khả năng bắt và 0 (giả) nếu không có.

Giải trình

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

Đây là một vòng lặp của hai giai đoạn. Đầu tiên là giai đoạn chuyển ngữ làm giảm từng chữ số và biến các số 0 thành dấu gạch dưới. Tại sao? Bởi vì dwmở rộng ra hai dòng sau:

0123456789
_0123456789AB...YZab...yz

Nếu bộ mục tiêu của giai đoạn chuyển ngữ dài hơn bộ nguồn, các ký tự không liên quan sẽ bị bỏ qua, do đó hành vi giảm dần (thật lòng, tôi đã quyết định đặt dấu gạch dưới trước các chữ số khi mở rộng wlớp ký tự) .

Sau đó, giai đoạn thứ hai là một sự thay thế, nối thêm một .chữ số. Điều đó có nghĩa là với mỗi chữ số n, các ndấu chấm được thêm vào trước khi chữ số đó được chuyển thành dấu gạch dưới.

_
<empty>

Điều này chỉ cần thoát khỏi các dấu gạch dưới.

p.{7}(..)?P

Cuối cùng, chúng tôi tìm thấy các trận đấu. Vì chúng ta bỏ qua en passant, nên chỉ có thể chụp được nếu có pvà sau đó là một Pđường chéo bên dưới nó. Trong chuỗi tuyến tính, điều này đơn giản có nghĩa là phải có 7 hoặc 9 ký tự giữa hai con tốt. Điều này khớp với .{7}(..)?(tức là khớp 7 ký tự và sau đó, tùy ý, khớp hai ký tự khác).

Một giai đoạn trận đấu như vậy trả về số lượng trận đấu mà nó tìm thấy.


Re "Có thể dễ dàng bị đánh bại bởi thứ gì đó như Perl khi việc mở rộng các chữ số thành chuỗi khoảng trắng (hoặc các ký tự khác) không chiếm 17 byte.": Tôi không thể khiến Perl buộc số điểm của mình, chứ đừng nói đến việc đánh bại nó . ( Câu trả lời Perl của tôi. ) Nhưng có lẽ người khác có thể ....
msh210

3

Javascript, 272 ký tự

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;}

Có lẽ có rất nhiều chỗ để cải thiện.


3

Ruby, 145 123 46 byte

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

Tôi không biết tại sao tôi không nghĩ về điều này ngay từ đầu. Nó ngắn hơn nhiều và cũng khá dễ đọc.

Đây là bài kiểm tra: http://ideone.com/Gzav8N


Cách tiếp cận cũ:

->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}

Kiểm tra trực tuyến: http://ideone.com/9L01lf , phiên bản trước khi chơi gôn: http://ideone.com/CSmqlW

Một lịch sử sửa đổi có sẵn ở đây .


2

ES6, 64 byte

Một số byte thích hợp, nếu nó kéo dài!

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

Tôi thực sự đã nghĩ đến giải pháp này mà không cần đọc các câu trả lời khác trước, nhưng tôi sẽ không phiền nếu bạn không tin tôi.



0

PHP, 94 87 80 byte

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

Vòng lặp đó + strtrngắn hơn rất nhiều so preg_replace_callbackvới str_pad.


0

Jelly, 88 84 79 72 69 65 64 63 60 byte

Chắc chắn phòng để cải thiện. Không soạn thảo vì Jelly đã được tạo trước câu hỏi. Cảm ơn @lirtosiast đã nói với tôi điều đó!

ØDṖḊ
”_x
e1£¬
1£iЀ2Ŀ€
x"3Ŀ€;"ÇFṣ”/
w€⁾pPn0
5ĿUŒDÇ
5ĿŒD6ĿoÇS
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.