Jack y Jane decidieron jugar una partida de ajedrez para pasar el tiempo. Desafortunadamente, Jack es bastante malo visualizando. ¡Le resulta difícil imaginar los movimientos posibles para una pieza determinada que no sea un peón, por supuesto!
Su desafío es ayudar a encontrar a Jack las posibles opciones para una pieza determinada (que no sea un peón).
En caso de que uno haya olvidado, las diversas piezas se denotan por:
- K: rey
- Q: reina
- N: caballero
- B: obispo
- R: torre
Como ejemplo, en la siguiente imagen la Knight se encuentra en d4
y se puede mover a c2
, b3
, b5
, c6
, e6
, f5
, f3
, e2
. Para una entrada dada:
Nd4
usted produciría:
Nc2 Nb3 Nb5 Nc6 Ne6 Nf5 Nf3 Ne2
Reglas:
- El orden de la salida no importa siempre que se enumeren todos los movimientos posibles
- Los movimientos posibles se pueden separar por espacios en blanco, líneas nuevas o cualquier otro delimitador
- La entrada se puede pasar al programa como parámetro o mediante
STDIN
- Se contarán los espacios en blanco en el programa, por lo tanto, haga un uso óptimo del mismo.
Este es el código de golf. (Por favor, evite utilizar herramientas / utilidades específicamente diseñadas para este propósito). ¡La respuesta más corta gana!
f(x)... case "Q": {f("B");f("R")}
si la función requiere algún #incluye, estos deberían ser parte del recuento de bytes.Respuestas:
GolfScript,
9493 caracteres¡Mi primer programa GolfScript! Esto me llevó muchas horas buscando sin saber lo que estaba haciendo, pero insistí y creo que logré aprender los conceptos básicos del idioma y jugar golf bastante bien.
Completamente golfizado :
Fuente comentada y más agradable :
Puede parecer la respuesta de Claudiu, que es porque hice referencia a su respuesta, así como a mi solución C (no presentada), mientras hacía la mía. Proporcionó una buena muestra de un programa de GolfScript (relativamente) complejo y funcional, y me ayudó a aprender mucho sobre el lenguaje. ¡Gracias, Claudiu!
Siendo nuevo en GolfScript todavía, si ustedes tienen algún comentario, les agradecería escucharlo.
fuente
Python,
217212220217213 caracteresAtado la solución de Mathematica de 213 bytes
Comencé generando todos los movimientos válidos, pero eso creció demasiado, por lo que el enfoque es bastante similar al de Mathematica.
fuente
Mathematica,
278272264260215213 caracteresVersión sin golf:
Ejemplo de uso:
La versión sin golf crea un tablero completo, y luego selecciona las posiciones correctas
Cases
, mientras que la versión con golf elimina movimientos inválidos inmediatamente en elTable
comando mediante la emisión##&[]
, que simplemente desaparece.fuente
N4d
? ¿No debería serNd4
en su lugar?Nd4
.ChessboardDistance
Abs
en Mathematica, porque denotan alternativas en un patrón.Haskell
225 220 208 205 200182Va a ser difícil tocar Mathematica cuando eso tiene movimientos de ajedrez incorporados: rollseyes: (bien jugado m.buettner)Lorecuperotodo. ¡Venciendo a Mathematica por 31!Última edición: caso reemplazado con una función, filtro integrado en la comprensión, para superar la entrada en R;)
uso:
Ungolfed (corresponde a la versión 208 char antes de que 'u' estuviera en línea):
fuente
piece
a la lista[piece,newfile, newrank]
si no lo usa en la coincidencia de patrones, puede guardar algunos caracteres?Bash, 238
Cómo funciona
La idea es representar cada campo en el tablero por un valor numérico, tomando sus coordenadas como un número base 20 y restando 200. De esta manera, se
a1
convierte20 * 10 + 1 - 200 = 1
, seh8
convierte20 * 17 + 8 - 200 = 148
, etc.Ahora, los posibles movimientos del Obispo se pueden representar mediante múltiplos (positivos o negativos) de 19 - la misma cantidad de pasos hacia arriba (+20) y hacia la izquierda (-1) - o 21 - la misma cantidad de pasos hacia arriba (+20 ) y a la derecha (+1).
La colocación de la figura después del movimiento es simplemente la suma de su posición original y el movimiento. Después de sumar esos números, tenemos que verificar si su suma corresponde a un campo válido en el tablero.
Dado que la base (20) es más del doble del número más alto posible (8), la suma no se puede ajustar alrededor del tablero, por ejemplo, mover Bh1 siete pasos hacia la derecha y hacia arriba dará como resultado una posición de tablero no válida.
La línea
enumera todos los movimientos posibles de las piezas que están representados por números positivos.
Los comandos
almacena el identificador de la pieza en la variable a , la representación numérica de la posición original en b y las letras a a h en la matriz d .
Después de la expansión de la llave, se
eval{,} echo '$'$a
convierteeval eval echo '$'$a
(doblemente malvado), que se evalúa como, por ejemploeval echo $K
, que se evalúa comoecho 1 19 20 21
.for i in $c -${c// / -};do …; done
recorre todos los movimientos posibles y sus contrapartes negativas.echo $a${d[$[(i+=b)/20]]}$[i%20]
da la posición final después del movimiento.grep '[a-h][1-8]$'
se asegura de que tengamos una posición válida en el tablero.fuente
Golfscript,
144135 caracteresEn lugar de seguir intentando jugar golf con mi solución Python , la traduje a Golfscript:
Traducción directa sin mucho golf, por lo que lo más probable es que pueda reducirse aún más. Toma datos de stdin sin una nueva línea, pruébalo aquí (las primeras dos líneas son para imitar stdin).
fuente
C
634632629625600 caracteres¿Alguna sugerencia sobre cómo mejorar esto? Esta es la primera vez que envío una respuesta.
fuente
C
se puede simplificar enormemente utilizando el operador ternario?:
y utilizando el valor de retorno deprintf
. (printf
devuelve el número de caracteres escritos, por lo que en este caso siempre es distinto de cero)C(P,c,r){return(0<=c)&(c<8)&(0<r)&(r<9)?printf("%c%c%d ",P,c+'a',r):0;}
. Una edición menor: hay un espacio adicionalM
después delif
que puedes eliminar.Haskell,
300269 caracteresGracias a bazzargh por ayudarme a perder 31 personajes ...
Mismo algoritmo que la versión de Mathematica. Salida de muestra de ghci:
(¡No solicitaste la comprobación de la cordura!)
fuente
Haskell, 446 caracteres
Llamado usando la
j
funciónNo he trabajado con Haskell en unos meses, por lo que no terminó siendo tan breve como la mayoría de las otras soluciones, pero estoy seguro de que hay algunas optimizaciones que hacer, principalmente con
h
. Podría acortarlo un poco.fuente
q & k [
311262 caracteres]Existe la posibilidad de reducir algunos caracteres más. Lo reduciré en la próxima iteración.
Uso
Torre
Rey
Caballero
obispo
Reina
fuente
R, 203 caracteres
Versión sin golf:
Uso:
La solución es incluso buena legible. Sin embargo, agregué algunos paréntesis y comentarios para lectores que no están familiarizados con el código R (en la versión sin golf).
fuente
Haskell (hipotético), 248 caracteres
Desafortunadamente, todos los compiladores de Haskell a los que tengo acceso ahora tienen problemas con los literales de cadena Unicode. Aquí está la versión (más larga) que realmente funciona:
La definición
h x y=...
es una función hash; los movimientos válidos se dividirán en números de caracteres que se encuentran en la cadena de 41 caracteres. Esto elimina la necesidad de una declaración de "caso" o equivalente.No estoy planeando trabajar más en esto ahora. Sería divertido ver si alguien puede usar una función hash en un lenguaje más conciso para hacer una solución más corta.
fuente