Najkrótsza ścieżka dla rycerza szachowego

12

Twój program powinien obliczyć liczbę ruchów, które rycerz szachowy musi osiągnąć, aby dotrzeć do każdego pola szachownicy. Dane wejściowe będą dwiema liczbami całkowitymi oddzielonymi spacją reprezentującymi współrzędne początkowego kwadratu (współrzędna pozioma, a następnie pionowa, każda 0-7 włącznie). Twój program powinien wypisać siatkę liczb zawierającą minimalną liczbę ruchów, które rycerz szachowy musi wykonać, aby dotrzeć do każdego kwadratu.

przykłady

Wejście

0 0

wynik

03232345
34123434
21432345
32323434
23234345
34343454
43434545
54545456

Wejście

3 1

wynik

21232123
32303232
21232123
34121432
23232323
32323234
43434343
34343434

Najkrótszy kod wygrywa.

Keith Randall
źródło

Odpowiedzi:

4

Ruby 1.9, 146 151 znaków

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(?.,"")
Ventero
źródło
4

Haskell , 255 236 231 229 bajtów

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]

RE:

To moja pierwsza próba gry w golfa. Również nieco nowy w Haskell.

Zestaw testowy:

import System.Environment

main :: IO ()
main = do
    args <- getArgs
    let readArgs = map read args
    let out = k (readArgs !! 0) (readArgs !! 1)
    putStr out
Rozszerzona czwarta
źródło
2
Witamy na stronie! Dobry pierwszy golf. Jeśli potrzebujesz dodatkowych pomysłów na grę w
isaacg
map(\(c,d)->...)$zip ...można skrócić do 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"]}

Przechodzi oba przypadki testowe.

Joey
źródło
1

JavaScript, 426 408 bajtów

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 nie jest najbardziej zwięzłym językiem na świecie ... Ale mój styl kodowania jest również trochę zbyt szczegółowy.

Zastosowanie: _(0, 0)itp.

pimvdb
źródło
Wyjmij wszystkie te vari zaoszczędź sobie mnóstwo miejsca ...
Ry-
@minitech: Jest to funkcja rekurencyjna, więc wszystko popsuje ... Niektóre varjednak można usunąć, dzięki.
pimvdb