Chemin le plus court pour un chevalier d'échecs


12

Votre programme doit calculer le nombre de coups qu'il faut à un chevalier d'échecs pour atteindre chaque case de l'échiquier. L'entrée sera constituée de deux entiers séparés par des espaces représentant les coordonnées du carré de départ (coordonnées horizontales puis verticales, 0-7 inclus chacune). Votre programme devrait produire une grille numérique contenant le nombre minimum de mouvements qu'un chevalier d'échecs doit effectuer pour atteindre chaque case.

exemples

contribution

0 0

production

03232345
34123434
21432345
32323434
23234345
34343454
43434545
54545456

contribution

3 1

production

21232123
32303232
21232123
34121432
23232323
32323234
43434343
34343434

Le code le plus court gagne.

Réponses:


4

Ruby 1.9, 146 151 caractères

g=(?9*8+".
")*8
r=->x,a=0{x<0||a<g[x].to_i&&(g[x]=a.to_s;[21,19,12,8].map{|i|r[x+i,a+1];r[x-i,a+1]})}
r[eval gets.split*?++"*10"]
puts g.tr(?.,"")

4

Haskell , 255 236 231 229 octets

import Data.List
k x y=unlines[[toEnum$findIndices(elem(i,j))(scanl(\s _->filter(\(z,w)->z`elem`n&&w`elem`n)$(\(a,b)->[(a+c,b+d)|(c,d)<-zip[1,1,-1,-1,-2,-2,2,2][2,-2,2,-2,1,-1,1,-1]])=<<s)[(x,y)]n)!!0+48|j<-n]|i<-n]where n=[0..7]

RÉ:

Ceci est ma première tentative de golf. Aussi un peu nouveau pour Haskell.

Suite de tests:

import System.Environment

main :: IO ()
main = do
    args <- getArgs
    let readArgs = map read args
    let out = k (readArgs !! 0) (readArgs !! 1)
    putStr out

2
Bienvenue sur le site! Bon premier golf. Si vous voulez des idées supplémentaires pour le golf Haskell, consultez codegolf.stackexchange.com/questions/19255/…
isaacg

map(\(c,d)->...)$zip ...peut être raccourci zipWith(\c d->...)....
Laikoni

2

Windows PowerShell, 178 183 188

filter f($n){if($d[($p=$_)]-gt$n){$d[$p]=$n
12,8,21,19|%{$p+$_
$p-$_}|f($n+1)}}$d=,0*20+(0..7|%{,9*8+0,0})+,0*20
$x,$y=-split$input
20+"$y$x"|f 0
2..9|%{-join$d[(10*$_).."$_`7"]}

Réussit les deux cas de test.


1

JavaScript, 426 408 octets

for(a=[],i=0;i<8;i++){a[i]=[];for(j=0;j<8;j++)a[i][j]=99}m=[[2,1],[2,-1],
[-2,1],[-2,-1],[1,2],[-1,2],[1,-2],[-1,-2]];function s(f,g,e,b){b&&(a[f][g]=0);
for(var b=[],c=0;c<m.length;c++){var d=[f+m[c][0],g+m[c][1]];a[d[0]]&&
a[d[0]][d[1]]&&a[d[0]][d[1]]>e&&(a[d[0]][d[1]]=e,b.push(d))}for(c=0;c<b.length;c++)
s(b[c][0],b[c][1],e+1)}function _(f,g){s(g,f,1,1);for(e="",b=0;b<8;b++)e+=
a[b].join("")+"\n";return e}

JavaScript n'est pas le langage le plus concis du marché ... Mais mon style de codage est aussi un peu bavard.

Utilisation: _(0, 0)etc.


Sortez tous ces vars et économisez des tonnes d'espace ...
Ry-

@minitech: C'est une fonction récursive qui gâche tout ... Certains varpourraient cependant être supprimés, merci.
pimvdb
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.