Introducción
Aron Nimzowitsch fue un destacado maestro de ajedrez y un influyente escritor de ajedrez.
En su libro 'Mi sistema', el primer capítulo trata sobre la importancia del centro y por qué debería dominarlo. La razón simple es que tus piezas tienen más posibles movimientos directos al estar en el centro, lo que nuevamente le da más poder al jugador.
Esto se vuelve muy claro cuando se miran diferentes posiciones de un caballero y sus próximos movimientos potenciales (mostrados en rosa) en un tablero vacío:
Objetivo
Evalúa el número de posibles próximos movimientos directos de un caballero en un tablero vacío en función de su posición.
Especificaciones de entrada
La posición del caballero.
Primero la x (columna) y luego la y (fila). 0 0
Es la esquina inferior izquierda.
Para simplificar, cambié las etiquetas de un tablero de ajedrez a números solamente. Para nuestros ejemplos y casos de prueba, usamos un índice basado en 0, sin embargo, puede usar un índice basado en 1.
Puede usar cualquier tipo de formatos de entrada posibles, una matriz, argumentos de función, etc.
Especificaciones de salida
El número de posibles próximos movimientos directos para un caballero en un tablero vacío.
Casos de prueba
3 4 => 8
4 6 => 6
7 7 => 2
1 0 => 3
Los casos de prueba están empleando un índice basado en 0. La cuadrícula completa de valores es:
2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2
Respuestas:
Python 2 , 35 bytes
Pruébalo en línea!
Python 2 , 39 bytes
Pruébalo en línea!
Toma entradas indexadas en 0.
La expresión
x*(7-x)/5
toma los valores de coordenadas0..7
para(
min(x,7-x,2)
hace lo mismo, pero es más largo). Al sumar estox
yy
da el patrón correcto pero con los números incorrectos(Vea la solución de Neil para un mejor razonamiento de por qué esto da sobre el patrón correcto)
Finalmente, el mapeo
a -> 50/(8-a)-4
con división de piso da los valores correctosUna solución alternativa igualmente larga con entradas indexadas 1:
fuente
(7-a)*a/5
es 3 bytes más corto quemin(a,7-a,2)
.*l
en realidad le cuesta un byte en general,lambda a,b:"23468"[(7-a)*a/5+(7-b)*b/5]
es solo 41 bytes.x*(9-x)/6
un índice.<strike>
como todos los demás para mostrar el progreso del golf?MATL ,
17141312 bytes¡Gracias a @Neil por 1 byte de descuento!
La entrada está basada en 1.
Pruébalo en línea!
Explicación
Esto calcula la distancia euclidiana desde la entrada a cada una de las 64 posiciones en el tablero de ajedrez, y encuentra cuántos de esos valores son iguales a la raíz cuadrada de 5.
Dado que las coordenadas son valores enteros, podemos estar seguros de que los dos valores de punto flotante que representan la raíz cuadrada de 5 (que se calculan a partir de las coordenadas y que se calculan directamente) son realmente los mismos.
fuente
double
número. Hormiga salva un byteMathematica
6343 bytes¡Con 20 bytes guardados gracias a las sugerencias de Martin Ender!
Lo anterior encuentra el número de cuadrados que están a 1 salto de la celda dada en el gráfico completo del recorrido de caballeros.
g=KnightTourGraph[8,8,VertexLabels->"Name",Axes->True]
muestra el gráfico completo del recorrido del caballero, con nombres de vértices y coordenadas. Tenga en cuenta que Mathematica tiene por defecto una indexación basada en uno para las coordenadas.
#+1+8#2&[r,f]
converts devuelve el vértice correspondiente al cuadrado en el rango (fila)r
y el archivo (columna)f
, utilizando valores basados en cero como entrada.Por ejemplo,
#+1+8#2&[2,1]
devuelve 11.EdgeCount
da el número de aristas en el gráfico del vecindario.Los bordes para el rango 2, archivo 1 (cuadrado 11):
Los bordes resaltados:
Método 2: distancia euclidiana
70 bytes
Este método es más largo, pero posiblemente de algún interés. El enfoque consiste en verificar la distancia euclidiana entre el centro del tablero de ajedrez y la celda de interés.
Ejemplificando
2
8
Para ayudar a visualizar cómo la distancia desde el centro del tablero de ajedrez es suficiente para asignar un valor.
Círculo [{4.5, 4.5}, 4],
Círculo [{4.5, 4.5}, 4.6], Acoplar [f / @ {2, 3, 4, 6, 8}, 1]}, Ejes -> Verdadero, Ejes Origen -> {-1, -1}]
Los números 2.2, 3, 4 y 4.6 son los radios de los círculos.
fuente
KnightTourGraph
Mathematica y sus componentes ... :-)#
al final de su código fuente (justo antes del]
). Deberías poder usarlo enIncidenceList
lugar de hacerloEdgeList@NeighborhoodGraph
. (Alternativamente, también hayEdgeCount
, pero creo que eso termina siendo más largo.)EdgeCount[8~KnightTourGraph~8,#+1+8#2<->_]&
EdgeCount
¡Es genial!JavaScript (ES6), 38 bytes
Toma entradas indexadas 0. Explicación: Mire los cuadrados de las distancias al centro:
El número de cuadrados alcanzables se divide en cinco bandas:
Realmente calculo 24.5 - (3.5 - x) ** 2 - (3.5 - y) ** 2 = (7 - x) * x + (7 - y) * y ya que es un cálculo más corto, pero todo lo que hace es revertir El orden de las bandas.
fuente
x*(7-x)
era solo una operación que se parece a un arco hacia abajo0..7
y que se ajusta a la curva, pero esto explica por qué produce un patrón tan agradable cuando se suma parax
yy
.Jalea, 10 bytes
1 indexado. Toma un solo argumento de la forma
[x,y]
. Pruébalo aquí¡Dennis salvó un byte!
fuente
Mathematica,
4440 bytesActualmente tengo tres soluciones en el mismo número de bytes:
Todas esas son funciones sin nombre que toman un par de coordenadas como
{3, 4}
, que están basadas en 1.Traté de encontrar una fórmula algo explícita. El patrón general en todo el tablero se ve así:
Los valores reales de esos colores (del más claro al más oscuro) son
2, 3, 4, 6, 8
. Es decir:Primero explotamos la simetría desplazando el origen al centro, tomando el valor absoluto y restando el resultado
4
. Esto nos da coordenadas0.5
para3.5
aumentar desde cada esquina. Para hacer que las coordenadas del centro sean las mismas, necesitamos mapear0.5
y1.5
a diferentes valores2.5
y3.5
al mismo valor. Esto se hace fácilmente multiplicando por0.8
(da{0.4, 1.2, 2., 2.8}
) y colocando el resultado en el suelo. Así que ahora tenemos{0, 1, 2, 2}
distancias del centro. Si sumamos las coordenadas en cada celda, obtenemos esta tabla:Esto tiene valores únicos para todos los diferentes resultados posibles, por lo que simplemente lo usamos como un índice en
2[3,4,6,8]
.En la segunda versión usamos techo en lugar de piso. De esta manera,
2
,3
y4
ya son correctos, pero conseguimos5
y6
en lugar de6
y8
, por lo corregimos los manualmente con una regla de sustitución.Finalmente, en la tercera versión, extendemos
5
y6
hacia arriba para6
y8
por medio de exponenciación, seguido por otra operación suelo.fuente
APL, 21 caracteres
En inglés:
(⍳8 8)
: Matriz de rango 2 de 8x8 que contiene las coordenadas de todas las celdas;+/¨×⍨(⍳8 8)-⊂⍵
: cuadrado de las distancias euclidianas de la celda dada con respecto a cada celda en el tablero;5=
: matriz de 0/1, donde los 1 aparecen a distancias al cuadrado iguales a 5;+/,
: suma la matriz aplanadaPrueba (en origen 1):
Ene sta forma:
El argumento de la izquierda puede especificar las dimensiones del tablero. Por
8 8 f
lo tanto , funcionará para el tablero de ajedrez cuadrado estándar. Pero en un tablero más grande y rectangular, los casos de prueba darían resultados diferentes. Por ejemplo, en un tablero de 12x10:fuente
≢⍸5=+/¨×⍨-∘⎕¨⍳8 8
Pruébelo en línea!Java -
160150bytesSin golf:
El código no protegido es idéntico, excepto por cambiar los límites del bucle for para guardar 4 bytes. Funciona iterando a través de cada movimiento posible y realizando una verificación de límites (> 0 y <8). Utiliza el hecho de que los desplazamientos son (1, 2), (2, 1), (-1, 2), (-2, 1), etc. y puede verificar 2 movimientos para cada valor de i y j.
Editar: 10 bytes guardados gracias a las sugerencias de Leaky Nun y u902383.
fuente
int m=0,i=-1,j;
guardar algunos bytesC, 44 bytes
Pero esto es mejor:
fuente
;
. No se compilaráHaskell,
4948 bytesfuente
[0..7]
en una variable durante 1 byte.Java, 81 caracteres (113 bytes)
Codifique toda la tabla de resultados como tabla unicode y luego obtenga los bytes apropiados realizando operaciones bit a bit
Puede verlo en línea aquí: https://ideone.com/K9BojC
fuente
Python, 94 bytes
Utiliza 1 indexación basada.
Demostración en https://repl.it/C6gV .
fuente
Pyth -
3315 bytesGracias a @LeakyNun por reducir mi tamaño a la mitad.
Reorganizar los mapas y
V
's probablemente dejará un poco fuera de juego el golf.Test Suite .
fuente
APL (Dyalog Unicode) , SBCS de 15 bytes
Pruébalo en línea!
fuente
J , 23 bytes
Pruébalo en línea!
Homenaje al método de Lynn, convertido a J
fuente
En realidad, 18 bytes
Pruébalo en línea!
Esto implementa la misma fórmula que muchas otras respuestas han estado utilizando:
50/(8-x*(7-x)//5+y*(7-y))//5)-4
. La entrada se toma como una lista:[x,y]
(o cualquier literal iterable en Python, como(x,y)
ox,y
).Explicación:
fuente
Perl 6 , 44 bytes
Pruébalo en línea!
fuente