체스 960 위치 생성기


11

문맥

Chess960 (또는 Fischer Random Chess)은 1996 년 6 월 19 일 아르헨티나 부에노스 아이레스에서 공개적으로 발표 된 전 세계 체스 챔피언 바비 피셔 (Bobby Fischer)가 발명하고 옹호 한 체스의 변형입니다. 표준 체스와 같은 보드와 조각을 사용합니다. 그러나 플레이어의 홈 랭크에서 피스의 시작 위치는 무작위입니다.

규칙

  • 화이트 폰은 표준 체스에서와 같이 두 번째 순위에 배치됩니다
  • 남은 흰색 조각은 모두 첫 번째 순위에 무작위로 배치됩니다
  • 감독은 반대 색 사각형에 배치해야합니다
  • 왕은 루크 사이의 광장에 배치해야합니다.
  • 블랙의 조각은 화이트의 조각과 동일 및 반대쪽에 배치됩니다.

보낸 사람 : http://en.wikipedia.org/wiki/Chess960

답변을 게시하려는 모든 사람들에게 ...

위에서 설명한 규칙에 따라 960 개 위치 중 하나를 임의로 생성 할 수있는 Chess960 위치 생성기를 만들어야합니다 (960 개 중 하나를 출력 할 수 있어야하며, 한 위치를 하드 코딩 할 수 없습니다!). 흰색 순위를 한 조각 출력합니다.

출력 예 :

rkrbnnbq

어디:

  • 케이 킹
  • 비숍
  • N 기사
  • 루크

이것은 코드 골프가되고 타이 브레이커는 공감대가됩니다.


960 개의 포지션을 출력 할 수 있어야한다고 말하면, 그것들은 동등해야합니까?
피터 테일러

흥미롭게도, 나는 그것을 전혀 생각하지 못했습니다 ... 이상적으로는 그렇게 생각합니다 ... 지금까지의 대답은이 품질을 제공합니다.
jsedano 2016 년

균일하게 섞인 내장이있는 언어로 작성된 두 가지; 두 개의 GolfScript는 가깝지만 균일하지는 않습니다.
피터 테일러

나는 가까운 좋은 충분하다 말할 것
jsedano

답변:


6

GolfScript ( 49 48 자 또는 대문자 출력 47)

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

이는 기준을 충족 할 때까지 무작위 순열의 표준 기술을 사용합니다. w0lf의 GolfScript 솔루션과 달리 문자열을 모두 검사하므로 루프를 더 많이 통과 할 가능성이 있습니다.

대문자를 사용하면 하나의 문자를 저장할 수 있습니다.

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

8

루비 1.9, 67 65 자

아, 오래된 "유효한 것을 생성 할 때까지 무작위로 유지"기술 ...

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

(루비 2.0, %w(r r n n b b q k)'rrnnbbqk'.chars)


1
1.9.3에서는 ~가능한 경우 경고 비용을 절약 할 수 있습니다. pastebin.com/nuE9zWSw
manatwork

@manatwork 감사합니다!
Paul Prestidge 2016 년

2
기술은 훨씬 더 빨리 "가능성, 필터의 목록을 셔플 먼저 받아"APL 같은 순수하게 기능적인 언어 :-) 생산하는 경향이 기술을보다 아직이다 "유효한 뭔가를 생성 할 때까지 무작위 계속"
존 드보락

1
@Daniero $_변수가 무엇인지 확실히 알 수 있습니다. 루비에는 Kernel # chop과 같은 String # chop 메소드와 비슷하지만 $_수신자 와 같은 깔끔한 메소드가 있기 때문에 작동합니다 . (예를 들어) 사용 읽기 / 프로세스 / 쓰기 루프를 작성할 때 많은 시간을 절약 ruby -n하거나 ruby -p.
Paul Prestidge

2
@GigaWatt 번호 두 B 사이에 짝수의 문자가 있으면 전자가 일치합니다. 후자는 B가 끝날 때만 일치합니다.
John Dvorak

8

GolfScript 60 49

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

(Peter Taylor의 훌륭한 팁 덕분에 49 자로 줄었습니다)

온라인 테스트는 여기 입니다.

코드에 대한 설명 :

;'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
사이에 짝수의 문자가 있는지 확인하는 방법 b은 매우 길다. 어때요 .'b'/1=,2%?
피터 테일러

또한 'qbbnnxxx'루프 에서 빠져 나와 동일한 문자열을 다시 섞으면 실패한 시도를 버리지 않을 수 있습니다 .
피터 테일러

@PeterTaylor 훌륭한 팁 감사합니다. "b 's count"문제의 경우 더 짧은 방법이 있어야한다고 생각했지만 찾지 못했습니다.
Cristian Lupascu

4

J, 56 자

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

비효율적 인 알고리즘으로 인해 내 컴퓨터에서 몇 초가 걸립니다. ~.전에 (중복 제거)를 추가하면 약간의 속도를 얻을 수 있습니다 'kqbbnnrr'.

설명:

  • ?~!88!무작위 요소를 다룬다0 ... 8!
  • 'kqbbnnrr'A.~문자열에 대한 아나그램 인덱스로 사용합니다 kqbbnnrr.
  • (#~'...'&rxeq"1)' 따옴표로 정규식으로 필터링합니다.
  • {. "첫번째 요소를 가져 가라"를 의미

4

K, 69

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

3

파이썬, 105 자

기본적으로 chron의 기술에서 우아한 Ruby를 빼십시오.

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

정규 표현식을 단축 한 Peter Taylor에게 감사합니다.


not s('b(..)*b',a)말이 오래 걸리는 것 같습니다 s('b.(..)*b',a). 또한 sample하나보다 짧은 문자 일 수 shuffle있지만 추가 인수가 필요합니다.
피터 테일러

당신은 정규식에 대해 맞습니다, 피터 감사! 그러나 Shuffle반환 None, 그래서 좋지 않다 :(
daniero

1
나무의 숲을 놓쳤다. 동일한 문자열을 확인하고 or정규식 대체 ( |) 와 동일하므로 두 개의 정규 표현식이 필요하지 않습니다 . 13자를 저장합니다.
피터 테일러

@PeterTaylor 잘 잡아라! 감사.
daniero
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.