¿Cuál es la probabilidad de que un caballero permanezca en el tablero de ajedrez?

16

Dado el tamaño del tablero de ajedrez y la posición inicial del caballero, calcule la probabilidad de que después del kmovimiento 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.

ingrese la descripción de la imagen aquí

Entrada

Las entradas están separadas por comas en la forma:

l,k,x,y

donde les la longitud y el ancho del tablero de ajedrez, kes el número de movimientos que realizará el caballero, xes la posición x de la posición inicial del caballero y yes la posición y de la posición inicial del caballero. Tenga en cuenta que 0,0es la esquina inferior izquierda del tablero y l-1,l-1es 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.

Delgado
fuente
14
¿Por qué prescribe un algoritmo exacto? No estoy seguro de si realmente hay una alternativa más elegante, pero requerir un algoritmo específico podría prevenir otros enfoques inteligentes. Además, no creo que necesite especificar el sistema de coordenadas con tanto detalle, no afecta la probabilidad en absoluto.
Martin Ender
2
"Las entradas están separadas por comas en la forma: l, k, x, y" , ¿entonces la entrada es una cadena que debemos analizar? ¿No es aceptable escribir una función que tome 4 parámetros?
Cristian Lupascu
3
@Edi No marque una respuesta como 'aceptada' si no ha habido tiempo para que otras personas lo intenten, marcar algo como aceptado, así que básicamente dice 'El desafío ha terminado', mientras que la mayoría del mundo probablemente no incluso tuve tiempo de mirarlo!
Sanchises
3
@Edi Por favor, deja de publicar desafíos aleatorios que encuentres en la web. El plagio está mal visto por nuestra comunidad. Los desafíos de las competencias de programación en curso no tienen nada que ver aquí, ya que pueden ayudar a alguien a ganar esta competencia. Y los desafíos, que se analizan en una publicación de blog, como este desafío de ajedrez ( fuente original ), no serán bien recibidos aquí. Una razón es que la fuente original puede tener algún tipo de copyright.
Jakube
2
@Edi Por ejemplo, la fuente de este desafío permite copiar y redistribuir, pero solo si otorga el crédito apropiado.
Jakube

Respuestas:

10

Pyth, 38 bytes

M?smcgtGd8fq5sm^-Fk2C,TH^UhQ2G1g@Q1>Q2

Pruébelo en línea: demostración

Explicación:

                                        implicit: Q = evaluated input
M                                       define a function g(G,H): //G=depth, H=current cell
                         UhQ              the list [0,1,...,Q[0]-1]
                        ^   2             Cartesian product, gives all cells
          f                               filter for numbers numbers T, which satisfy:
                    C,TH                    zip(T,H)
              m                             map the two pairs k to:
                -Fk                           their difference
               ^   2                          squared
             s                              sum (distance squared)
           q5                               == 5           
   m                                      map each valid cell d to:
     gtHd                                   g(G-1,d)
    c    8                                  divided by 8
  s                                       return sum
 ?                           G          if G > 0 else
                              1           return 1

                               g@Q1>Q2  call g(Q[1],Q[2:]) and print
Jakube
fuente
Me parece que si vamos a crear lenguajes súper concisos con el único propósito de jugar al golf, también podríamos implementar el algoritmo requerido como primitivo.
mc0e
3
@ mc0e No, eso sería una escapatoria prohibida estándar. Ver aquí .
Jakube
¿podemos obtener el código no golfizado por favor?
YaSh Chaudhary
1
@YaShChaudhary ¿Se refiere a la versión con 39 bytes o la versión con 40 bytes? :-P Me temo que nunca existió una versión verdaderamente sin golf. Escribí este código directamente en Pyth, y los programas de Pyth siempre son cortos.
Jakube el
@Jakube ohk np :)
YaSh Chaudhary
8

Rubí 134

->l,m,x,y{!((r=0...l)===x&&r===y)?0:m<1?1:(0..7).map{|i|a,b=[1,2].rotate i[2]
P[l,m-1,x+a*(i[0]*2-1),y+b*(i[1]*2-1)]/8.0}.inject(:+)}

Pruébelo en línea: http://ideone.com/ZIjOmP

El código equivalente no golfizado:

def probability_to_stay_on_board(board_size, move_count, x, y)
  range = 0...board_size
  return 0 unless range===x && range===y
  return 1 if move_count < 1

  possible_new_locations = (0..7).map do |i|
    dx, dy = [1,2].rotate i[2]
    dx *= i[0]*2-1
    dy *= i[1]*2-1

    [x+dx, y+dy]
  end

  possible_new_locations.map do |new_x, new_y| 
    probability_to_stay_on_board(board_size, move_count-1, new_x, new_y) / 8.0 
  end.inject :+
end
Cristian Lupascu
fuente
5

Haskell - 235

Implementa una función fcon parámetros.l k x y

import Data.List
g[]=[]
g((a,b):r)=[(a+c,b+d)|(c,d)<-zip[-2,-1,1,2,-2,-1,1,2][1,2,-2,-1,-1,-2,2,1]]++g r
h _ 0 a=a
h l a b=h l(a-1)$filter(\(a,b)->(elem a[0..l])&&(elem b[0..l]))$g b
f l k x y=(sum$map(\x->1.0) (h l k [(x,y)]))/(8**k)
jhwcb
fuente
5

Matlab, 124 119

Implementa exactamente el algoritmo descrito.

Pude acortarlo en 5 bytes con la ayuda de @sanchises, ¡gracias!

function s=c(l,k,x,y);m=zeros(5);m([2,4,10,20])=1/8;s(l,l)=0;s(l-y,x+1)=1;for i=1:k;s=conv2(s,m+m','s');end;s=sum(s(:))

Expandido:

function s=c(l,k,x,y);
    m=zeros(5);
    m([2,4,10,20])=1/8;
    s(l,l)=0;s(l-y,x+1)=1;
    for i=1:k;
        s=conv2(s,m+m','s');
    end;
    s=sum(s(:))

Versión antigua

function s=c(l,k,x,y);
    m =zeros(5);m([1:3,5,8,10:12]*2)=1/8;
    s=zeros(l);
    s(l-y,x+1)=1;
    for i=1:k
        s=conv2(s,m,'s');
    end
    s=sum(s(:));
falla
fuente
Una pista: sMATLAB lo inicializa, por lo que puede hacerlo s(l,l)=0; Lástima que MATLAB no tenga fibonnaci como función incorporada, sería una gran optimización m.
Sanchises
Ese es un truco súper increíble, ¡gracias! Todavía estoy tratando de encontrar una forma más corta de crear mmediante una descomposición de la matriz ...
error
Sí, lo estuve mirando por un tiempo también. Quizás alguna indexación lógica inteligente, pero no se me ocurre nada. m+m'+fliplr(m+m')parece ser un aumento en el bytecount, y también lo son todas mis otras opciones.
Sanchises
5

Mathematica - 137

q = # {1, 2} & /@ Tuples[{-1, 1}, 2]
q = Reverse /@ q~Union~q
g[l_, k_, x_, y_] :=

 Which[
  k < 1,
  1,

  !0 <= x < l || ! 0 <= y < l,
  0,

  0<1,
  Mean[g[l, k - 1, x + #[[1]], y + #[[2]]] & /@ q]
]

Uso:

g[5,5,1,2]

Salida:

9/64
Cuenta
fuente
2

MATLAB - 106

function s=c(l,k,x,y);m(5,5)=0;m([2,4,10,20])=1/8;s=ones(l);for i=1:k;s=conv2(s,m+m','s');end;s=s(l-y,x+1)

Mejora la solución de @ flawr al ser más MATLAB-y.

Expandido:

function s=c(l,k,x,y)
    m(5,5)=0;
    m([2,4,10,20])=1/8;
    s=ones(l);
    for i=1:k
        s=conv2(s,m+m','s');
    end
    s=s(l-y,x+1)
Jared
fuente
1

> <> - 620 (sin contar espacios en blanco)

La pila inicial debe ser l,k,x,y

{:a2*0p   v
vp0*3a*}:{<
>{1+&a3*0g}v                   >          >       >          >~~01-01-v             >          >       >          >~~01-01-v             >          >       >          >~~01-01-v             >          >       >          >~~01-01-v
           >&1-:&?!v>:@@:@@:0(?^:a2*0g1-)?^2-$:0(?^:a2*0g1-)?^1-      >}}$:@@:@@:0(?^:a2*0g1-)?^2-$:0(?^:a2*0g1-)?^1+      >}}$:@@:@@:0(?^:a2*0g1-)?^2+$:0(?^:a2*0g1-)?^1-      >}}$:@@:@@:0(?^:a2*0g1-)?^2+$:0(?^:a2*0g1-)?^1+      >}}$:@@:@v
v1         ^}       ^!?=g0*3a:~~}}<      +2v?)-1g0*2a:v?(0:$+1v?)-1g0*2a:v?(0:@@:@@:$}}<      -2v?)-1g0*2a:v?(0:$+1v?)-1g0*2a:v?(0:@@:@@:$}}<      +2v?)-1g0*2a:v?(0:$-1v?)-1g0*2a:v?(0:@@:@@:$}}<-2      v?)-1g0*2a:v?(0:$-1v?)-1g0*2a:v?(0:@<
>a3*0g=   ?^\      &              ^-10-10~~<          <       <          <             ^-10-10~~<          <       <          <             ^-10-10~~<          <       <          <             ^-10-10~~<          <       <          <
\         :{/      
v                  >~{~l2,&0
>@:0(?v:a2*0g1-)?v$:0(?v:a2*0g1-)?v1>@~~+l1=?v
      >          >     >          >0^        >&,n;

Pruébalo

JNF
fuente