Contexto
Chess960 (o Fischer Random Chess) es una variante del ajedrez inventada y defendida por el ex campeón mundial de ajedrez Bobby Fischer, anunciada públicamente el 19 de junio de 1996 en Buenos Aires, Argentina. Emplea el mismo tablero y piezas que el ajedrez estándar; sin embargo, la posición inicial de las piezas en las filas de inicio de los jugadores es aleatoria
Reglas
- Los peones blancos se colocan en el segundo rango como en el ajedrez estándar
- Todas las piezas blancas restantes se colocan al azar en el primer rango
- Los obispos deben colocarse en cuadrados de colores opuestos.
- El rey debe colocarse en un cuadrado entre las torres.
- Las piezas de las negras se colocan iguales y opuestas a las piezas de las blancas.
De: http://en.wikipedia.org/wiki/Chess960
Para todas las personas que desean publicar respuestas ...
tiene que hacer un generador de posiciones Chess960, capaz de generar aleatoriamente una de las 960 posiciones siguiendo las reglas descritas anteriormente (tiene que ser capaz de generar cualquiera de los 960, ¡no se acepta codificar una posición!), y solo necesita salida de las piezas blancas de rango uno.
Salida de ejemplo:
rkrbnnbq
dónde:
- k rey
- q reina
- b obispo
- n caballero
- r torre
Este será el código de golf, y el desempate serán los votos a favor.
fuente
Respuestas:
GolfScript (
4948 caracteres, o 47 para salida en mayúsculas)Esto utiliza la técnica estándar de permutar aleatoriamente hasta que cumplamos con los criterios. A diferencia de la solución GolfScript de w0lf, esto realiza ambas comprobaciones en la cadena, por lo que es probable que se ejecute a través del bucle más veces.
El uso de mayúsculas permite guardar un carácter:
fuente
Ruby 1.9,
6765 caracteresAh, la vieja técnica "sigue aleatorizando hasta que generes algo válido" ...
(En Ruby 2.0,
%w(r r n n b b q k)
podría ser'rrnnbbqk'.chars
)fuente
~
costo de una advertencia, cuando esté disponible. pastebin.com/nuE9zWSw$_
variable. Funciona porque ruby tiene algunos métodos limpios como Kernel # chop que funcionan como el método String # chop equivalente pero con$_
su receptor. Esto ahorra mucho tiempo cuando (por ejemplo) está escribiendo un ciclo de lectura / proceso / escritura usandoruby -n
oruby -p
.GolfScript
6049(acortado a 49 caracteres gracias a los excelentes consejos de Peter Taylor)
Prueba en línea aquí .
Una explicación del código:
fuente
b
s parece muy largo. ¿Qué tal.'b'/1=,2%
?'qbbnnxxx'
el bucle y reorganizando la misma cadena.J, 56 caracteres
Toma varios segundos en mi máquina debido al algoritmo ineficiente. Se puede ganar algo de velocidad agregando
~.
(eliminar duplicados) antes'kqbbnnrr'
.explicación:
?~!8
trata8!
elementos aleatorios de0 ... 8!
'kqbbnnrr'A.~
los usa como índices de anagramas para la cadenakqbbnnrr
.(#~'...'&rxeq"1)'
los filtra por la expresión regular entre comillas.{.
significa "tomar el primer elemento"fuente
K, 69
fuente
Python, 105 caracteres
Básicamente, la técnica de Chron, menos las elegantes cosas de Ruby.
Gracias a Peter Taylor por el acortamiento de la expresión regular.
fuente
not s('b(..)*b',a)
parece una forma de decir larga y sin alientos('b.(..)*b',a)
. Además,sample
puede ser un carácter más corto queshuffle
, pero requiere un argumento adicional.Shuffle
SinNone
embargo, regresa , así que no es bueno :(or
es equivalente a la alternancia de expresiones regulares (|
). Ahorra 13 caracteres.