Contexto
O Chess960 (ou Fischer Random Chess) é uma variante do xadrez inventada e defendida pelo ex-campeão mundial de xadrez Bobby Fischer, anunciada publicamente em 19 de junho de 1996 em Buenos Aires, Argentina. Emprega o mesmo tabuleiro e peças do xadrez padrão; no entanto, a posição inicial das peças nas fileiras dos jogadores é aleatória
Regras
- Os peões brancos são colocados na segunda posição como no xadrez padrão
- Todas as peças brancas restantes são colocadas aleatoriamente na primeira fila
- Os bispos devem ser colocados em quadrados de cores opostas
- O rei deve ser colocado em um quadrado entre as torres.
- As peças de preto são colocadas iguais e opostas às peças de branco.
De: http://en.wikipedia.org/wiki/Chess960
Para todas as pessoas que gostariam de postar respostas ...
você precisa criar um gerador de posições Chess960, capaz de gerar aleatoriamente uma das 960 posições seguindo as regras descritas acima (ele deve ser capaz de gerar qualquer uma das 960, codificar uma posição não é aceita!) e você só precisa saída o branco classificar uma peça.
Exemplo de saída:
rkrbnnbq
Onde:
- rei k
- q rainha
- b bispo
- n cavaleiro
- torre r
Este será o código de golfe, e o desempate será o voto positivo.
fonte
Respostas:
GolfScript (
4948 caracteres ou 47 para letras maiúsculas)Isso usa a técnica padrão de permutar aleatoriamente até atendermos aos critérios. Diferentemente da solução GolfScript da w0lf, isso faz as duas verificações na string, portanto é provável que ela percorra o loop mais vezes.
Usar maiúsculas permite salvar um caractere:
fonte
Ruby 1.9,
6765 caracteresAh, a velha técnica "continue randomizando até gerar algo válido" ...
(No Ruby 2.0,
%w(r r n n b b q k)
poderia ser'rrnnbbqk'.chars
)fonte
~
o custo de um aviso, quando disponível. pastebin.com/nuE9zWSw$_
variável. Funciona porque o ruby possui alguns métodos interessantes, como o Kernel # chop, que funciona como o método String # chop equivalente, mas com$_
seu receptor. Isso economiza muito tempo quando (por exemplo) você está gravando um loop de leitura / processo / gravação usandoruby -n
ouruby -p
.GolfScript
6049(reduzido para 49 caracteres graças às ótimas dicas de Peter Taylor)
Teste online aqui .
Uma explicação do código:
fonte
b
s parece muito longo. Que tal.'b'/1=,2%
?'qbbnnxxx'
o loop e reorganizando a mesma string.J, 56 caracteres
leva alguns segundos na minha máquina devido ao algoritmo ineficiente. Alguma velocidade pode ser obtida adicionando
~.
(remova duplicatas) antes'kqbbnnrr'
.explicação:
?~!8
trata8!
elementos aleatórios de0 ... 8!
'kqbbnnrr'A.~
usa-os como índices de anagramas para a stringkqbbnnrr
.(#~'...'&rxeq"1)'
os filtra pela regex entre aspas.{.
significa "pegue o primeiro elemento"fonte
K, 69
fonte
Python, 105 caracteres
Basicamente, a técnica do cron, menos o material elegante do Ruby.
Obrigado a Peter Taylor pelo encurtamento da regex.
fonte
not s('b(..)*b',a)
parece ser uma maneira longa de dizers('b.(..)*b',a)
. Além disso,sample
pode ser um caractere menor queshuffle
, mas requer um argumento extra.Shuffle
retornaNone
, portanto, não é bom :( #or
é equivalente à alternância de regex (|
). Economiza 13 caracteres.