Desafío
La notación de Forsyth-Edwards (FEN) es una notación estándar para describir una posición particular del tablero de un juego de ajedrez. Su desafío es evaluar el puntaje utilizando la cadena FEN. Este es un ejemplo de una cadena FEN:
5k2/ppp5/4P3/3R3p/6P1/1K2Nr2/PP3P2/8
Con esta cadena, puede calcular la puntuación del material para cada color con la siguiente tabla de puntuación:
- p / P = Peón = 1 punto
- n / N = Caballero = 3 puntos
- b / B = Obispo = 3 puntos
- r / R = Torre = 5 puntos
- q / Q = Reina = 9 puntos
- k / K = Rey, estos no tienen ningún punto porque cada posición legal contiene un rey para cada lado
Las piezas blancas se designan con letras mayúsculas ("PNBRQK") mientras que las piezas negras usan minúsculas ("pnbrqk"). Los cuadrados vacíos se observan utilizando los dígitos del 1 al 8 (el número de cuadrados vacíos), y "/" separa los rangos.
A partir de la cadena de ejemplo FEN, podemos calcular las puntuaciones de material para cada lado:
Para negro:
5 k 2 / ppp 5 / 4P3 / 3R3 p / 6P1 / 1K2N r 2 / PP3P2 / 8
Quedan todas las piezas negras: p + p + p + p + r, esto es un total de 9
Para blanco:
5k2 / ppp5 / 4 P 3/3 R 3p / 6 P 1/1 K 2 N r2 / PP 3 P 2/8
Quedan todas las piezas blancas: P + R + P + N + P + P + P, esto es un total de 13
El puntaje final se determina con la siguiente fórmula: puntaje blanco - puntaje negro = puntaje final , entonces, por ejemplo, el puntaje final sería: 13 - 9 = 4
Ejemplo :
Entrada:
5k2/ppp5/4P3/3R3p/6P1/1K2Nr2/PP3P2/8
Salida:
4
Todos los códigos de golf reglas se aplican aquí, la solución con la menor cantidad de bytes victorias.
Cómo publicar
# Language Name, N bytes
[code]
[explaination, etc.]
Respuestas:
CJam,
282726 bytesPruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
> <> ,
64575653 bytes(-7 bytes con algo de inspiración de la respuesta de @ El'endiaStarman, -3 bytes gracias a @randomra)
Explicación
El programa usa el cuadro de código como una tabla de búsqueda. Los put / gets fuera de rango no funcionan con el intérprete en línea, por lo que esto solo funciona con el intérprete oficial de Python.
La primera línea empuja las piezas, seguido de los valores de las piezas. También empuja un 0 inicial para iniciar el total de la tercera línea.
La segunda línea coloca el valor positivo o negativo apropiado en la celda de pieza correspondiente, por ejemplo,
-1
se coloca en('p', 4)
y1
se coloca('P', 4)
. La longitud de la pila se verifica para asegurarse de que el ciclo se ejecute 5 veces.Una vez que finaliza el ciclo, la pila consiste en nuestro único cero desde la primera línea. Para cada carácter, realizamos una búsqueda en la celda correspondiente en la tabla y la agregamos a nuestro total. Por defecto, los valores de celda no inicializados son 0, lo cual es perfecto para nuestros propósitos.
La última línea simplemente imprime el resultado.
fuente
Ruby, 88 caracteres
Esto es incómodo y feo, y probablemente haya una mejor manera, pero bueno.
La
{foo: 'bar'}
sintaxis de Ruby en realidad es solo azúcar, esto{:foo => 'bar'}
es molesto para el golf porque significa que tengo que convertir la clave en un símbolo antes de usarla para acceder a un elemento hash (:"#{x}"
es un carácter más corto quex.to_sym
).fuente
Pip, 39 bytes
Tomaré mi breve turno antes de que lleguen las respuestas de CJam y Pyth ...
Toma la cadena FEN como un argumento de línea de comandos. Aquí hay una explicación para una versión ungolfed:
fuente
Perl, 44 bytes
Contando el shebang como uno, la entrada se toma de stdin.
Uso de muestra
Explicación
Las piezas se transliteran con sus respectivos valores. Si la pieza está en mayúscula (es decir, menor que
a
), su valor se agrega a la suma, si no se resta.fuente
JavaScript ES7, 79 bytes
124131Tan corto como puedo llegar. Utiliza comprensiones de arreglos elegantes para recorrer la cadena.
Explicación
fuente
Minkolang 0.9 ,
72656460444241 bytesPruébalo aquí
¡Muchas gracias a Sp3000 por señalar una forma mucho más eficiente de hacer esto!
Explicación
13359"QRBNP"m
empuja los puntajes y sus caracteres correspondientes, luego los intercala , para que la pila se vea así:[1,80,3,78,3,66,5,82,9,81]
. Luego5[d3~c~$r48*+0p0p]
coloca la puntuación de cada carácter, tanto en minúsculas como en mayúsculas, en su ubicación en el espacio de código. Finalmente,$I[o0q+]N.
recorre la entrada hasta que esté vacía, sumando los puntajes a medida que avanza.fuente
CJam, 33 bytes
Aquí está la manera súper ingenua de encontrar cuerdas. Pruébalo en línea .
fuente
Ouroboros , 82
Ouroboros es un esolang que diseñé esta semana. ¡Es hora de dar una vuelta!
Cada línea de comandos de un solo carácter 1 representa una serpiente ouroboros, en la que la ejecución procede de la cabeza (inicio) a la cola (final) y regresa a la cabeza. El
(
y)
comandos le permiten comer parte de la cola o regurgitan, cambiando así lo que los comandos se ejecutan. Si alguna vez se traga el puntero de instrucción, la serpiente muere (deja de ejecutarse). Un programa Ouroboros consiste en una o más serpientes que se ejecutan en paralelo. Cada serpiente tiene una pila propia, y también hay una pila compartida.1 Una excepción, que distingue a Ouroboros de muchos lenguajes 2D: los números de varios dígitos se pueden escribir directamente, sin tener que hacer cálculos matemáticos o presionar un 0 primero.
Serpiente 1
La primera serpiente lee un carácter (
i
) y comprueba si es -1 / EOF (.1+!
). Si es así, se come la mayor parte de su cola, hasta e incluyendo elM
(57*(
).Luego, la serpiente intercambia el código del personaje con la cuenta que está arriba de la pila (
\
), mueve la cuenta a la pila compartida (m
) y se traga otro personaje (1(
). Si ya se había tragado un montón, esto significa que se traga el hecho de(
que la IP está actualmente encendida y muere. De lo contrario, la ejecución continúa moviendo la cuenta de regreso a la pila de la serpiente 1, intercambiándola con el código de char y regurgitando el personaje que se tragó previamente (M\1)
).Luego usamos operaciones matemáticas y de pila para generar el puntaje apropiado para el personaje.
.96>
prueba si es minúscula o no; los siguientes se32*-
convierten a mayúsculas. A continuación, el largo tramo de.80=
a81=9*++++
mapasP
->1
,N
->3
, etc. Por último,\2*1\-*
niega la puntuación si la carta fue minúscula, y+
lo añade a la cuenta corriente. La serpiente luego gira y lee otro personaje.Serpiente 2
La segunda serpiente comienza con una operación de regurgitación (
)
), que no hace nada la primera vez (ya que todavía no se ha tragado nada, y también desde que aparece una pila vacía0
). Luego, empuja la longitud de la pila compartida a su propia pila y niega lógicamente (L!
). Esto da1
si la pila está vacía, de lo0
contrario. La serpiente se multiplica por 4 y se come esa cantidad de caracteres (4*(
).Si la pila compartida estaba vacía, esto significa que la serpiente ahora termina antes que
S
. Empuja4
y regresa al)
, donde regurgita a los personajes que acaba de tragar y comienza de nuevo.Sin embargo, si hubo un valor en la pila compartida, no se tragan caracteres y la ejecución continúa. La serpiente cambia a la pila compartida y muestra el número allí (
Sn
); luego se traga su último personaje y muere (1(
).Sincronización
Las dos serpientes deben sincronizarse cuidadosamente para que nunca haya un valor en la pila compartida cuando la serpiente 2 hace su verificación, hasta que se alcanza el final de la entrada. Snake 1 pone un valor en la pila compartida brevemente en cada pasada a través de su ciclo. Por lo tanto, el
L
comando de la serpiente 2 nunca debe ejecutarse entre los comandosm
yM
de la serpiente 1. Afortunadamente, las serpientes se alinean muy bien. Crucialmente, la longitud del bucle de la serpiente 1 (70 instrucciones) es un múltiplo del bucle de la serpiente 2 (7 instrucciones), por lo que los dos nunca se desincronizarán:Si los números no hubieran funcionado tan perfectamente, habría rellenado una o ambas serpientes con espacios para alinearlas según sea necesario.
¡Todo esto está muy bien, pero quiero verlo en acción!
Aquí está el programa anterior a través de Fragmento de pila. Incluso en 1000 operaciones por segundo, lleva unos 10 segundos escupir la respuesta para la entrada de muestra, ¡pero llega allí!
Mostrar fragmento de código
fuente
JavaScript ES6, 71
Como una función anónima
fuente
Perl 5,
7163 bytesEsto modifica
$\
(el separador de línea paraprint
, que comienza en falso) para cada alfanumérico en la cadena que es una clave del hash%a
definido al principio. Se incrementa$\
por el valor del hash si la letra es una clave como es; de lo contrario, incrementa en negativo el valor del hash si la letra mayúscula es una clave; de lo contrario no agrega nada.Muchas gracias a primo por salvarme ocho bytes (en un comentario sobre esta respuesta).
Puedo guardar otro byte con otra sugerencia de primo (¡gracias!): Cambiar
$a{$_}||-$a{uc$_}
a$a{$_}-$a{$"^$_}
. Pero creo que esa es una respuesta bastante diferente a la mía, así que no tomaré el "crédito" (de -1 byte) por ello.fuente
Clojure / ClojureScript, 63 caracteres
Escrito usando un ClojureScript REPL, también debe ser válido Clojure. Intentalo aquí . Ingrese, luego llámelo usando
(*1 "FEN_string_here")
Muy claro.
{"P"1..."q"-9}
es una estructura de datos literal para un mapa de "P" a 1, "N" a 3, etc.map
toma la función como primer argumento y la estructura de datos para procesar como el segundo; en este caso, está utilizando la función que Una estructura de datos (el literal del mapa) puede actuar como su propia función de acceso. El parámetro de cadena (%
de la macro de función) puede tratarse como una lista de cadenas de caracteres individuales. Cualquier personaje que no esté en el mapa terminará comonil
en la lista resultante, que+
felizmente ignora.fuente
Pyth, 25 bytes
Demostración
Utiliza la siguiente fórmula de mapeo para las letras
pbnrq
, sik
es la letra:Esto se representa en Pyth como:
Primero, el programa crea la versión con mayúsculas y minúsculas de la entrada, luego en ambas cadenas se filtran las letras minúsculas, luego aplica la fórmula anterior, luego suma y resta los valores negros de los valores blancos.
fuente
Pitón 3, 93
fuente