Quelle est la probabilité qu'un chevalier reste sur l'échiquier?


16

Compte tenu de la taille de l'échiquier et de la position initiale du chevalier, calculez la probabilité qu'après un kmouvement, le chevalier se trouve à l'intérieur de l'échiquier.

Remarque:

  • Le chevalier effectue ses 8 mouvements possibles avec une probabilité égale.

  • Une fois que le chevalier est à l'extérieur de l'échiquier, il ne peut pas revenir à l'intérieur.

entrez la description de l'image ici

Contribution

Les entrées sont séparées par des virgules sous la forme:

l,k,x,y

lest la longueur et la largeur de l'échiquier, kle nombre de mouvements que le chevalier effectuera, xla position x de la position initiale du chevalier et yla position y de la position initiale du chevalier. Notez qu'il 0,0s'agit du coin inférieur gauche de la carte et l-1,l-1du coin supérieur droit de la carte.

Algorithme:

Commencez par les coordonnées initiales du chevalier. Effectuez tous les mouvements possibles pour cette position et multipliez ces mouvements par leur probabilité, pour chaque mouvement appelez récursivement la fonction continuez ce processus jusqu'à ce que la condition de fin soit remplie. La condition de fin est si le chevalier est en dehors de l'échiquier, dans ce cas retournez 0, ou si le nombre de coups souhaité est épuisé, dans ce cas retournez 1.

Comme nous pouvons le voir, l'état actuel de la récursivité ne dépend que des coordonnées actuelles et du nombre de pas effectués jusqu'à présent. Par conséquent, nous pouvons mémoriser ces informations sous forme de tableau.

Crédit

Ce défi provient à l'origine d'un article de blog de crazyforcode.com publié sous la licence CC BY-NC-ND 2.5 IN . Il a été légèrement modifié pour le rendre un peu plus difficile.


14
Pourquoi prescrivez-vous un algorithme exact? Je ne sais pas s'il existe réellement une alternative plus élégante, mais nécessiter un algorithme spécifique pourrait potentiellement empêcher d'autres approches intelligentes. De plus, je ne pense pas que vous ayez besoin de spécifier le système de coordonnées avec autant de détails - cela n'affecte pas du tout la probabilité.
Martin Ender

2
"Les entrées sont séparées par des virgules sous la forme: l, k, x, y" - donc l'entrée est une chaîne que nous devons analyser? N'est-il pas acceptable d'écrire une fonction qui prend 4 paramètres?
Cristian Lupascu

3
@Edi Ne marquez pas une réponse comme «acceptée» s'il n'y a pas eu de temps pour que d'autres personnes l'essaient - marquer quelque chose comme accepté, c'est dire en gros «le défi est terminé» - alors que la plupart du monde ne l'a probablement pas même eu le temps de le regarder!
Sanchises

3
@Edi Veuillez arrêter de publier des défis aléatoires que vous trouvez sur le Web. Le plagiat est mal vu par notre communauté. Les défis des compétitions de programmation en cours n'ont rien à voir ici, car ils peuvent aider quelqu'un à gagner ce concours. Et les défis, qui sont discutés dans un article de blog, comme ce défi d'échecs ( source originale ), ne seront pas bien accueillis ici. L'une des raisons est que la source d'origine peut avoir une sorte de droit d'auteur.
Jakube

2
@Edi Par exemple, la source de ce défi permet la copie et la redistribution, mais uniquement si vous accordez le crédit approprié.
Jakube

Réponses:


10

Pyth, 38 octets

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

Essayez-le en ligne: Démonstration

Explication:

                                        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

Il me semble que si nous voulons créer des langages super concis dans le seul but de jouer au golf, nous pourrions aussi bien implémenter l'algorithme requis en tant que primitif.
mc0e

3
@ mc0e Non, ce serait une faille standard interdite. Voyez ici .
Jakube

pouvons-nous obtenir les pls de code non golfés?
YaSh Chaudhary

1
@YaShChaudhary Voulez-vous dire la version avec 39 octets, ou la version avec 40 octets. :-P J'ai bien peur qu'il n'y ait jamais eu de version vraiment non golfée. J'ai écrit ce code directement en Pyth et les programmes Pyth sont toujours courts.
Jakube

@Jakube ohk np :)
YaSh Chaudhary

8

Rubis 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(:+)}

Essayez-le en ligne: http://ideone.com/ZIjOmP

Le code non golfé équivalent:

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

5

Haskell - 235

Implémente une fonction favec des paramètresl 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)

5

Matlab, 124 119

Implémente exactement l'algorithme décrit.

J'ai pu le raccourcir de 5 octets avec l'aide de @sanchises, merci!

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(:))

Étendu:

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(:))

Ancienne version

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(:));

Un conseil: sest initialisé par MATLAB, vous pouvez donc simplement le faire s(l,l)=0; Dommage que MATLAB n'ait pas de fibonnaci comme fonction intégrée, ce serait une excellente optimisation pour m.
Sanchises

C'est un truc super génial, merci! J'essaie toujours de trouver un moyen plus court de créer mpar une décomposition matricielle ...
flawr

Ouais, je le regardais aussi depuis un moment. Peut-être une indexation logique intelligente, mais je ne pense à rien. m+m'+fliplr(m+m')semble être une augmentation de bytecount, et sont donc toutes mes autres options.
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]
]

Usage:

g[5,5,1,2]

Production:

9/64

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)

Améliore la solution de @ flawr en étant plus MATLAB-y.

Étendu:

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)

1

> <> - 620 (sans compter les espaces blancs)

La pile initiale doit être 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;

Testez-le

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.