Máy phát điện vị trí Chess960


11

Bối cảnh

Chess960 (hay Fischer Random Chess) là một biến thể của cờ vua được phát minh và ủng hộ bởi cựu vô địch cờ vua thế giới Bobby Fischer, được công bố vào ngày 19 tháng 6 năm 1996 tại Buenos Aires, Argentina. Nó sử dụng cùng một bảng và quân cờ như cờ vua tiêu chuẩn; tuy nhiên, vị trí bắt đầu của các quân cờ trên bảng xếp hạng nhà của người chơi được chọn ngẫu nhiên

Quy tắc

  • Những con tốt trắng được xếp hạng thứ hai như trong cờ vua tiêu chuẩn
  • Tất cả các mảnh trắng còn lại được đặt ngẫu nhiên trên xếp hạng đầu tiên
  • Các giám mục phải được đặt trên các ô vuông màu đối diện
  • Nhà vua phải được đặt trên một hình vuông giữa các tân binh.
  • Các mảnh của Đen được đặt ngang nhau và đối diện với các mảnh của Trắng.

Từ: http://en.wikipedia.org/wiki/Chess960

Đối với tất cả những người muốn gửi câu trả lời ...

bạn phải tạo một trình tạo vị trí Chess960, có khả năng tạo ngẫu nhiên một trong số 960 vị trí theo các quy tắc được mô tả ở trên (nó phải có khả năng xuất ra bất kỳ vị trí nào trong số 960, mã hóa một vị trí không được chấp nhận!) và bạn chỉ cần đầu ra thứ hạng trắng một miếng.

Ví dụ đầu ra:

rkrbnnbq

Ở đâu:

  • k vua
  • nữ hoàng q
  • giám mục b
  • hiệp sĩ n
  • r rook

Đây sẽ là mã golf, và bộ ngắt kết nối sẽ là upvote.


Khi bạn nói rằng nó phải có khả năng vượt qua bất kỳ vị trí nào trong số 960 vị trí, liệu chúng có phải được trang bị không?
Peter Taylor

Thật thú vị, tôi đã không thực sự nghĩ về điều đó ... Ý tôi là lý tưởng là nó phải như vậy, tôi nghĩ rằng ... Các câu trả lời cho đến nay cung cấp chất lượng này, ... phải không?
jsedano

Hai trong số đó được viết bằng các ngôn ngữ có nội dung được xáo trộn đồng đều; hai cái GolfScript gần nhau nhưng không hoàn toàn đồng nhất.
Peter Taylor

Tôi muốn nói rằng gần như vậy là đủ tốt
jsedano

Câu hỏi này đã truyền cảm hứng cho tôi để hỏi codegolf.stackexchange.com/questions/12322/ trên
user123444555621

Câu trả lời:


6

GolfScript ( 49 48 ký tự hoặc 47 cho đầu ra chữ hoa)

'bbnnrrkq'{{;9rand}$.'b'/1=,1$'r'/1='k'?)!|1&}do

Điều này sử dụng kỹ thuật tiêu chuẩn cho phép ngẫu nhiên cho đến khi chúng tôi đáp ứng các tiêu chí. Không giống như giải pháp GolfScript của w0lf, cả hai đều kiểm tra chuỗi, vì vậy nó có khả năng chạy qua vòng lặp nhiều lần hơn.

Sử dụng chữ hoa cho phép lưu một char:

'BBNNRRKQ'{{;9rand}$.'B'/1=,1$'R'/1=75?)!|1&}do

8

Ruby 1.9, 67 65 ký tự

À, kỹ thuật "giữ ngẫu nhiên cũ cho đến khi bạn tạo ra thứ gì đó hợp lệ" ...

$_=%w(r r n n b b q k).shuffle*''until/r.*k.*r/&&/b(..)*b/
$><<$_

(Trong Ruby 2.0, %w(r r n n b b q k)có thể 'rrnnbbqk'.chars)


1
Trong 1.9.3, bạn có thể tiết ~kiệm chi phí cảnh báo khi có sẵn. pastebin.com/nuE9zWSw
manatwork

@manatwork thật tuyệt, cảm ơn!
Paul Prestidge

2
kỹ thuật "giữ ngẫu nhiên cho đến khi bạn tạo ra thứ gì đó hợp lệ" vẫn nhanh hơn nhiều so với kỹ thuật "xáo trộn danh sách các khả năng, lọc và lấy đầu tiên" mà các ngôn ngữ chức năng thuần túy như APL có xu hướng tạo ra :-)
John Dvorak

1
@Daniero đó chắc chắn là những gì $_biến. Nó hoạt động vì ruby ​​có một số phương thức gọn gàng như Kernel # chop hoạt động giống như phương thức String # chop tương đương nhưng với $_tư cách là người nhận của chúng. Điều này giúp tiết kiệm rất nhiều thời gian khi (ví dụ) bạn đang viết một vòng lặp đọc / xử lý / ghi bằng cách sử dụng ruby -nhoặc ruby -p.
Paul Prestidge

2
@GigaWatt không. Các trận đấu trước đây nếu có số lượng ký tự chẵn giữa một số B. Cái sau chỉ khớp nếu B'S ở cuối.
John Dvorak

8

GolfScript 60 49

;'qbbnnxxx'{{9rand*}$.'b'/1=,2%}do'x'/'rkr'1/]zip

(rút ngắn xuống còn 49 ký tự nhờ những lời khuyên tuyệt vời của Peter Taylor)

Kiểm tra trực tuyến tại đây .

Một lời giải thích về mã:

;'qbbnnxxx'         # push the string 'qbbnnxxx' on the clean stack
{

    {9rand*}$       # shuffle the string

    .'b'/1=,2%      # count the number of places between the 'b's
                    # (including the 'b's themselves)
                    # if this count is even, the bishops are on
                    # squares of different colors, so place a 0
                    # on the stack to make the do loop stop

}do                 # repeat the procedure above until a 
                    # good string is encountered

'x'/                # split the string where the 'x's are

'rkr'1/]zip         # and put 'r', 'k' and then 'r' again
                    # where the 'x's used to be

1
Phương pháp của bạn để kiểm tra xem có một số lượng chữ cái chẵn giữa các chữ bcó vẻ rất dài. Thế còn .'b'/1=,2%?
Peter Taylor

Và bạn có thể tránh loại bỏ các lần thử thất bại bằng cách kéo 'qbbnnxxx'ra khỏi vòng lặp và chia sẻ lại chuỗi tương tự.
Peter Taylor

@PeterTaylor Cảm ơn bạn vì những lời khuyên tuyệt vời. Đối với vấn đề "tính giữa 'b'" tôi cảm thấy rằng nên có một cách ngắn hơn, nhưng tôi không thể tìm thấy nó.
Cristian Lupascu

4

J, 56 ký tự

{.(#~'(?=.*b(..)*b).*r.*k.*r.*'&rxeq"1)'kqbbnnrr'A.~?~!8

phải mất vài giây trên máy của tôi do thuật toán không hiệu quả. Một số tốc độ có thể đạt được bằng cách thêm ~.(loại bỏ trùng lặp) trước 'kqbbnnrr'.

giải trình:

  • ?~!8giao dịch 8!các yếu tố ngẫu nhiên từ0 ... 8!
  • 'kqbbnnrr'A.~sử dụng chúng như các chỉ mục đảo chữ cho chuỗi kqbbnnrr.
  • (#~'...'&rxeq"1)' lọc chúng theo regex trong dấu ngoặc kép.
  • {. có nghĩa là "lấy yếu tố đầu tiên"

4

K, 69

(-8?)/[{~*(*/~~':{m=_m:x%2}@&x="b")&(&x="k")within&"r"=x};"rrbbnnkq"]

3

Con trăn, 105 ký tự

Về cơ bản kỹ thuật của chron, trừ đi thứ Ruby thanh lịch.

import re,random
a='rrbbnnkq'
while re.search('b.(..)*b|r[^k]*r',a):a=''.join(random.sample(a,8))
print a

Cảm ơn Peter Taylor đã rút ngắn regex.


not s('b(..)*b',a)có vẻ như một cách dài dòng nói s('b.(..)*b',a). Ngoài ra, samplecó thể ngắn hơn một ký tự shuffle, nhưng nó đòi hỏi một đối số phụ.
Peter Taylor

Bạn nói đúng về regex, Peter. Cảm ơn! mặc dù Shuffletrả về None, vì vậy nó không tốt :(
daniero

1
Bỏ lỡ rừng cho cây. Bạn không cần hai orregex , vì bạn đang kiểm tra cùng một chuỗi và tương đương với luân phiên regex ( |). Tiết kiệm 13 ký tự.
Peter Taylor

@PeterTaylor Bắt tốt! cảm ơn.
daniero
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.