Jalur terpendek untuk seorang ksatria catur

12

Program Anda harus menghitung jumlah gerakan yang dibutuhkan seorang ksatria catur untuk mencapai setiap kotak papan catur. Input akan berupa dua bilangan bulat yang dipisahkan oleh ruang yang mewakili koordinat dari awal kuadrat (koordinat horizontal kemudian vertikal, masing-masing termasuk 0-7). Program Anda harus menampilkan kisi-kisi angka yang berisi jumlah gerakan minimum yang harus dilakukan oleh seorang ksatria catur untuk mencapai setiap kotak.

contoh

memasukkan

0 0

keluaran

03232345
34123434
21432345
32323434
23234345
34343454
43434545
54545456

memasukkan

3 1

keluaran

21232123
32303232
21232123
34121432
23232323
32323234
43434343
34343434

Kode terpendek menang.

Keith Randall
sumber

Jawaban:

4

Ruby 1.9, 146 151 karakter

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
sumber
4

Haskell , 255 236 231 229 byte

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:

Ini adalah usaha pertama saya bermain golf. Juga agak baru di Haskell.

Test suite:

import System.Environment

main :: IO ()
main = do
    args <- getArgs
    let readArgs = map read args
    let out = k (readArgs !! 0) (readArgs !! 1)
    putStr out
Augmented keempat
sumber
2
Selamat datang di situs ini! Golf pertama yang bagus. Jika Anda ingin beberapa ide tambahan untuk bermain golf Haskell, periksa codegolf.stackexchange.com/questions/19255/…
isaacg
map(\(c,d)->...)$zip ...dapat disingkat menjadi 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"]}

Melewati kedua kasus uji.

Joey
sumber
1

JavaScript, 426 408 byte

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 bukan bahasa yang paling ringkas di luar sana ... Tapi gaya pengkodean saya juga sedikit bertele-tele.

Penggunaan: _(0, 0)dll

pimvdb
sumber
Buang semua varitu dan hemat banyak ruang ...
Ry-
@minitech: Ini adalah fungsi rekursif sehingga mengacaukan semuanya ... Ada varyang bisa dihapus, terima kasih.
pimvdb