Кратчайший путь для шахматного рыцаря

12

Ваша программа должна вычислить количество ходов, которое требуется шахматному рыцарю, чтобы добраться до каждого квадрата шахматной доски. Входными данными будут два целых числа через пробел, представляющих координаты начального квадрата (горизонтальная, а затем вертикальная координата, 0-7 включительно каждая). Ваша программа должна вывести числовую сетку, содержащую минимальное количество ходов, которое должен сделать шахматный рыцарь, чтобы достичь каждого квадрата.

Примеры

вход

0 0

выход

03232345
34123434
21432345
32323434
23234345
34343454
43434545
54545456

вход

3 1

выход

21232123
32303232
21232123
34121432
23232323
32323234
43434343
34343434

Самый короткий код выигрывает.

Кит Рэндалл
источник

Ответы:

4

Ruby 1,9, 146 151 символов

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
источник
4

Haskell , 255 236 231 229 байт

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]

D:

Это моя первая попытка игры в гольф. Также немного нового для Haskell.

Тестирование:

import System.Environment

main :: IO ()
main = do
    args <- getArgs
    let readArgs = map read args
    let out = k (readArgs !! 0) (readArgs !! 1)
    putStr out
Дополненный четвертый
источник
2
Добро пожаловать на сайт! Хороший первый гольф. Если вам нужны дополнительные идеи для игры в гольф на Haskell, посетите codegolf.stackexchange.com/questions/19255/…
isaacg
map(\(c,d)->...)$zip ...можно сократить до zipWith(\c d->...)....
Лайкони
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"]}

Проходит оба теста.

детеныш
источник
1

JavaScript, 426 408 байт

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 не самый лаконичный язык там ... Но мой стиль кодирования тоже немного многословен.

Использование: _(0, 0)и т. Д.

pimvdb
источник
Убери все те varи сэкономь себе
массу
@minitech: Это рекурсивная функция, поэтому все портится ... varХотя некоторые можно удалить, спасибо.
pimvdb