Người kiểm tra: Vua tôi?


14

Thử thách:

Đưa ra một bàn cờ, xuất ra số lượng di chuyển nhỏ nhất mà nó sẽ thực hiện (giả sử màu đen hoàn toàn không di chuyển) để vua một mảnh màu đỏ, nếu có thể.

Quy tắc :

Phía của Red sẽ luôn ở phía dưới, tuy nhiên các quân cờ của họ có thể bắt đầu ở bất kỳ hàng nào (ngay cả hàng của nhà vua mà họ cần đến). Các mảnh màu đen đứng yên , có nghĩa là chúng không di chuyển giữa các chuyển động của màu đỏ, nhưng chúng bị xóa khỏi bảng khi bị bắt. Lưu ý rằng các mảnh có thể bắt đầu trên bất kỳ không gian nào trên bảng, bao gồm ngay bên cạnh nhau. Đây không phải là cách người kiểm tra bình thường được chơi, nhưng chương trình của bạn phải có khả năng giải quyết những điều này. (Xem đầu vào 5) Tuy nhiên, các miếng kiểm tra chỉ phải di chuyển theo đường chéo (xem đầu vào 3). Chụp ngược được cho phép nếu chụp đầu tiên được chuyển tiếp trong chuỗi (xem đầu vào 7).

Đầu vào:

Bảng kiểm tra 8x8, với các không gian bảng được xác định là các ký tự sau (thoải mái sử dụng các lựa chọn thay thế miễn là chúng phù hợp):

. - Trống

R - Mảnh màu đỏ

B - Mảnh đen

Đầu ra:

Các nhỏ nhất số lần di chuyển nó sẽ mất một mảnh màu đỏ là 'kinged' bằng cách nhập hàng của nhà vua trên hàng đầu tiên của hội đồng quản trị (bên đen), 0 nếu không di chuyển được yêu cầu (một mảnh màu đỏ bắt đầu trên hàng vua), hoặc một số âm nếu không thể đánh dấu một mảnh màu đỏ (tức là màu đen chiếm toàn bộ hàng đầu tiên).

Đầu vào 1:

. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
R . . . . . . .

Đầu ra 1:

7

Đầu vào 2:

. . . . . . . .
. . . . . . . .
. . . . . B . .
. . . . . . . .
. . . B . . . .
. . . . . . . .
. B . . . . . .
R . . . . . . .

Đầu ra 2:

2

Đầu vào 3:

. B . B . B . B
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
R . . . . . . .

Đầu ra 3:

-1

Đầu vào 4:

. . . . . . . R
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
R . . . . . . .

Đầu ra 4:

0

Đầu vào 5:

. . . . . . . .
. . . . . . . .
. . . . . . . .
. B . . B . . .
B . . . . B . .
. B . B . . . .
. . B . . B . .
. . . R R . . .

Đầu ra 5:

4

Đầu vào 6:

. . . . . . . .
. . . . . . . .
. B . . . . . .
. . B . . . . .
. B . B . . . .
. . . . R . . .
. . . B . . . .
. . . . R . . .

Đầu ra 6:

2

Đầu vào 7:

. . . . . . . .
. . . . . . . .
. . B . . . . .
. . . . . . . .
. . B . . . . .
. B . B . B . .
. . . . B . . .
. . . . . R . R

Đầu ra 7:

4

Ghi điểm:

Đây là , vì vậy mã ngắn nhất tính bằng byte thắng.


1
Không phải trường hợp thử nghiệm thứ hai là 2, vì bạn có thể nhảy đôi / ba lần?
DJMcMayhem

Là một mảng trạng thái của các mảng số nguyên làm đầu vào OK?
Jonathan Allan

1
Tôi đã thêm một testcase nên chứng minh khó khăn. Nó bao gồm nhiều lần nhảy, nhiều mảnh và nhảy lùi lại để đạt được giải pháp tốt nhất có thể.
orlp

1
@orlp Hừm, tôi sẽ nói rằng không có mảnh màu đỏ nào được phép di chuyển về phía sau vì không ai trong số họ là vua cả mảnh vua nếu bắt đầu tiên là về phía trước. Tôi sẽ thêm nó vào các quy tắc vì tôi đã không nhận thức được điều này trước đây.
Yodle

1
ooooooooh, bạn không cần phải chọn chỉ một mảnh màu đỏ, họ có thể lập nhóm! Tôi hiểu rồi
Greg Martin

Câu trả lời:


4

JavaScript (ES6), 354 322 byte

Lấy một mảng làm đầu vào với:

  • 0 = ô vuông trống
  • 1 = mảnh màu đỏ
  • 2 = mảnh đen

Trả về số lần di chuyển tối ưu hoặc 99 nếu không có giải pháp.

Nó rất nhanh nhưng có thể chơi gôn nhiều hơn nữa.

F=(b,n=0,C=-1,i)=>b.map((v,f,X,T,x=f&7,y=f>>3)=>v-1||(y&&n<m?[-9,-7,7,9].map(d=>(N=c=X=-1,r=(d&7)<2,T=(t=f+d)>=0&t<64&&(x||r)&&(x<7||!r)?(!b[t]&d<0)?t:b[t]&1?N:b[t]&2&&(d<0&y>1|d>0&C==f)?(X=t,x>1||r)&&(x<6|!r)&&!b[t+=d]?c=t:N:N:N)+1&&(b[f]=b[X]=0,b[T]=1,F(b,n+!(C==f&c>N),c,1),b[f]=1,b[X]=2,b[T]=0)):m=n<m?n:m),m=i?m:99)|m

var test = [
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,2,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,2,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,2,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,2,0,2,0,2,0,2,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,0,0,0,0,0,0,1,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,2,0,0,2,0,0,0,
    2,0,0,0,0,2,0,0,
    0,2,0,2,0,0,0,0,
    0,0,2,0,0,2,0,0,
    0,0,0,1,1,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,2,0,0,0,0,0,0,
    0,0,2,0,0,0,0,0,
    0,2,0,2,0,0,0,0,
    0,0,0,0,1,0,0,0,
    0,0,0,2,0,0,0,0,
    0,0,0,0,1,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,2,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,2,0,0,0,0,0,
    0,2,0,2,0,2,0,0,
    0,0,0,0,2,0,0,0,
    0,0,0,0,0,1,0,1
  ]
];

test.forEach((b, n) => {
  console.log("Test #" + (n + 1) + " : " + F(b));
});


99 có lẽ là tốt, tôi không thể tưởng tượng một giải pháp thực sự thực hiện 99 di chuyển trên một bảng 8 x 8. Công việc tốt!
Yodle
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.