Найкоротший шлях для шахового лицаря


12

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

приклади

вхід

0 0

вихід

03232345
34123434
21432345
32323434
23234345
34343454
43434545
54545456

вхід

3 1

вихід

21232123
32303232
21232123
34121432
23232323
32323234
43434343
34343434

Найкоротший код виграє.

Відповіді:


4

Рубін 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(?.,"")

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 golfing, перегляньте 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)і т.д.


Вийміть усі ці varта заощадите собі багато місця…
Ри-

@minitech: Це рекурсивна функція, завдяки чому все переплутається ... Деякі varз них можна було б видалити, дякую.
pimvdb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.