Dado el tamaño del tablero de ajedrez y la posición inicial del caballero, calcule la probabilidad de que después del k
movimiento el caballero esté dentro del tablero de ajedrez.
Nota:
El caballero hace sus 8 movimientos posibles con la misma probabilidad.
Una vez que el caballero está fuera del tablero de ajedrez, no puede volver a entrar.
Entrada
Las entradas están separadas por comas en la forma:
l,k,x,y
donde l
es la longitud y el ancho del tablero de ajedrez, k
es el número de movimientos que realizará el caballero, x
es la posición x de la posición inicial del caballero y y
es la posición y de la posición inicial del caballero. Tenga en cuenta que 0,0
es la esquina inferior izquierda del tablero y l-1,l-1
es la esquina superior derecha del tablero.
Algoritmo:
Comience con las coordenadas iniciales del caballero. Realice todos los movimientos posibles para esta posición y multiplique estos movimientos con su probabilidad, para cada movimiento recursivamente llame a la función, continúe este proceso hasta que se cumpla la condición de finalización. La condición de finalización es si el caballero está fuera del tablero de ajedrez, en este caso, devuelve 0, o el número deseado de movimientos se agota, en este caso, devuelve 1.
Como podemos ver, el estado actual de la recursión depende solo de las coordenadas actuales y el número de pasos realizados hasta ahora. Por lo tanto, podemos memorizar esta información en forma de tabla.
Crédito
Este desafío es originalmente de una publicación de blog de crazyforcode.com publicada bajo la licencia CC BY-NC-ND 2.5 IN . Fue ligeramente modificado para hacerlo un poco más desafiante.
Respuestas:
Pyth, 38 bytes
Pruébelo en línea: demostración
Explicación:
fuente
Rubí 134
Pruébelo en línea: http://ideone.com/ZIjOmP
El código equivalente no golfizado:
fuente
Haskell - 235
Implementa una función
f
con parámetros.l k x y
fuente
Matlab,
124119Implementa exactamente el algoritmo descrito.
Pude acortarlo en 5 bytes con la ayuda de @sanchises, ¡gracias!
Expandido:
Versión antigua
fuente
s
MATLAB lo inicializa, por lo que puede hacerlos(l,l)=0
; Lástima que MATLAB no tenga fibonnaci como función incorporada, sería una gran optimizaciónm
.m
mediante una descomposición de la matriz ...m+m'+fliplr(m+m')
parece ser un aumento en el bytecount, y también lo son todas mis otras opciones.Mathematica - 137
Uso:
Salida:
fuente
MATLAB - 106
Mejora la solución de @ flawr al ser más MATLAB-y.
Expandido:
fuente
> <> - 620 (sin contar espacios en blanco)
La pila inicial debe ser
l,k,x,y
Pruébalo
fuente