Compte tenu de la taille de l'échiquier et de la position initiale du chevalier, calculez la probabilité qu'après un k
mouvement, 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.
Contribution
Les entrées sont séparées par des virgules sous la forme:
l,k,x,y
où l
est la longueur et la largeur de l'échiquier, k
le nombre de mouvements que le chevalier effectuera, x
la position x de la position initiale du chevalier et y
la position y de la position initiale du chevalier. Notez qu'il 0,0
s'agit du coin inférieur gauche de la carte et l-1,l-1
du 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.
Réponses:
Pyth, 38 octets
Essayez-le en ligne: Démonstration
Explication:
la source
Rubis 134
Essayez-le en ligne: http://ideone.com/ZIjOmP
Le code non golfé équivalent:
la source
Haskell - 235
Implémente une fonction
f
avec des paramètresl k x y
la source
Matlab,
124119Implémente exactement l'algorithme décrit.
J'ai pu le raccourcir de 5 octets avec l'aide de @sanchises, merci!
Étendu:
Ancienne version
la source
s
est initialisé par MATLAB, vous pouvez donc simplement le faires(l,l)=0
; Dommage que MATLAB n'ait pas de fibonnaci comme fonction intégrée, ce serait une excellente optimisation pourm
.m
par une décomposition matricielle ...m+m'+fliplr(m+m')
semble être une augmentation de bytecount, et sont donc toutes mes autres options.Mathematica - 137
Usage:
Production:
la source
MATLAB - 106
Améliore la solution de @ flawr en étant plus MATLAB-y.
Étendu:
la source
> <> - 620 (sans compter les espaces blancs)
La pile initiale doit être
l,k,x,y
Testez-le
la source