Con đường ngắn nhất cho một hiệp sĩ cờ vua


12

Chương trình của bạn nên tính toán số lần di chuyển cần một hiệp sĩ cờ vua để đến từng ô vuông của bàn cờ. Đầu vào sẽ là hai số nguyên được phân tách bằng dấu cách biểu thị tọa độ của hình vuông bắt đầu (tọa độ ngang rồi dọc, bao gồm 0-7 mỗi số). Chương trình của bạn sẽ xuất ra một lưới số chứa số lần di chuyển tối thiểu mà một hiệp sĩ cờ vua cần thực hiện để đến từng ô vuông.

ví dụ

đầu vào

0 0

đầu ra

03232345
34123434
21432345
32323434
23234345
34343454
43434545
54545456

đầu vào

3 1

đầu ra

21232123
32303232
21232123
34121432
23232323
32323234
43434343
34343434

Mã ngắn nhất sẽ thắng.

Câu trả lời:


4

Ruby 1.9, 146 151 ký tự

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 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]

Đ:

Đây là nỗ lực đầu tiên của tôi khi chơi golf. Cũng có phần mới đối với Haskell.

Bộ kiểm tra:

import System.Environment

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

2
Chào mừng đến với trang web! Golf tốt đầu tiên. Nếu bạn muốn có thêm một số ý tưởng cho việc chơi golf Haskell, hãy xem codegolf.stackexchange.com/questions/19255/iêu
isaacg

map(\(c,d)->...)$zip ...có thể rút ngắn thành 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"]}

Vượt qua cả hai trường hợp thử nghiệm.


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 không phải là ngôn ngữ ngắn gọn nhất ngoài kia ... Nhưng phong cách mã hóa của tôi cũng hơi dài dòng.

Cách sử dụng: _(0, 0)v.v.


Loại bỏ tất cả những thứ đó varvà tiết kiệm cho bạn hàng tấn không gian ...
Ry-

@minitech: Đây là một chức năng đệ quy để làm rối tung mọi thứ ... varMặc dù vậy, một số có thể được gỡ bỏ, cảm ơn.
pimvdb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.