Bộ giải mã quét


34

Chúng tôi đã tạo các trường Minesweeper , nhưng ai đó thực sự phải quét các mỏ đã tạo trước khi PCG nổ tung!

Nhiệm vụ của bạn là viết một Bộ giải Minesweeper tương thích với một phiên bản sửa đổi một chút của giải pháp được chấp nhận của bộ phận làm việc của Minesweeper (các hành động được phân tách bằng khoảng trắng để cho phép các trường lớn hơn).

Đầu vào: Một trường Minesweeper, các trường được phân tách bằng dấu cách. Dòng đầu tiên biểu thị tổng số mỏ.

  • x: Không bị ảnh hưởng
  • !: Cờ
  • Chữ số: Số lượng mỏ xung quanh lĩnh vực đó

Thí dụ:

10
0 0 1 x x x x x
0 0 2 x x x x x
0 0 2 ! x x x x
0 0 1 2 x x x x
0 0 0 1 x x x x
1 1 0 2 x x x x
x 1 0 2 x x x x
1 1 0 1 x x x x

Đầu ra: Bước tiếp theo của bạn trong định dạng action row column(bắt đầu từ 0)

Hành động hợp lệ:

  • 0: Mở nó ra
  • 1: Đặt cờ

Thí dụ:

0 1 2

Quy tắc:

  • Bạn viết một chương trình hoàn chỉnh lấy một trường duy nhất làm đầu vào (STDIN hoặc đối số dòng lệnh) và xuất ra một hành động (STDOUT). Do đó, bạn không thể lưu trạng thái, ngoại trừ !.
  • Sự lựa chọn của bạn phải tuân theo tỷ lệ cược tốt nhất để tồn tại. (tức là nếu có di chuyển an toàn 100%, hãy thực hiện)
  • Đây là ; giải pháp ngắn nhất (tính theo UTF-8 byte)

Các xét nghiệm:

Những thử nghiệm này phục vụ mục đích thử nghiệm cho các tình huống rõ ràng phổ biến; chương trình của bạn phải hoạt động cho mọi lĩnh vực kiểm tra.

Trong:

4
x x x x
1 2 x x
0 1 2 x
0 0 1 x

Ra (bất kỳ trong số này):

1 1 2
0 0 2
0 1 3

Trong:

2
x x x
1 ! x
1 1 x

Ra (bất kỳ trong số này):

0 0 0
0 0 1
0 1 2
0 2 2
1 0 2

Trong:

10
x x x x x x x x
1 3 3 x x x x x
0 1 ! 3 3 4 x x
0 2 3 ! 2 3 x x
0 1 ! 2 2 ! x x

Ra (bất kỳ trong số này):

1 1 5
1 0 2

Trong:

2
x x x
2 3 1
! 1 0

Ra (bất kỳ trong số này):

0 0 1
1 0 0
1 0 2

Tốt đẹp! 1) Có lẽ để kiểm tra ai đó nên viết một khai thác thử nghiệm: được cung cấp một trường, nó sẽ in từng bước được thực hiện và liệu chương trình có chiến thắng hay không. Chương trình sẽ giành chiến thắng trên bản đồ mà không có bất kỳ sự mơ hồ. 2) Tôi tự hỏi nếu có ai sẽ sử dụng hành động cờ. Có vẻ như không bao giờ cần thiết.
Claudiu

Đối với bài kiểm tra đầu tiên. Tại sao bạn có thể di chuyển đến 0 0 2hoặc 0 1 3. Tôi không thể thấy một trong những người đó sẽ được coi là an toàn như thế nào. (Tôi không đủ giỏi ở tàu quét mìn ...)
FDinoff

1
Có thể Fhoặc Ptrông cờ tốt hơn !:)
VisioN

1
@JonathanVanMatre Trường này là một trường trống, nhưng nó được đảm bảo rằng lần mở đầu tiên của bạn không phải là của tôi, vì các mỏ được đặt sau lần nhấp đầu tiên :)
TimWolla

2
Sự thật thú vị: Chỉ có một số lượng hữu hạn các bảng có sẵn (ít nhất là trong phiên bản XP, là bảng chính tắc trong bối cảnh cạnh tranh). Bảng được chuyển xung quanh khi bạn nhấp vào vị trí đầu tiên để đảm bảo rằng bạn không nhấp vào bảng, nhưng khác với bảng đã quyết định bạn sẽ sử dụng bảng nào.
undergroundmonorail

Câu trả lời:


17

Toán học

Vẫn không chơi gôn. Cần thêm một số công việc trên các định dạng I / O.

t = {{0, 0, 1, x, x, x, x, x}, {0, 0, 2, x, x, x, x, x}, {0, 0, 2, F, x, x, x, x}, 
     {0, 0, 1, 2, x, x, x, x}, {0, 0, 0, 1, x, x, x, x}, {1, 1, 0, 2, x, x, x, x}, 
     {x, 1, 0, 2, x, x, x, x}, {1, 1, 0, 1, x, x, x, x}};
(*Sqrt[2] is  1.5*)
c = Sequence; p = Position;
nums = p[t, _?NumberQ];
fx = Nearest[p[t, x]];
flagMinus[flag_] := If[Norm[# - flag] < 1.5, t[[c @@ #]]--] & /@ nums
flagMinus /@ p[t, F];
g@x_List := Tr[q[#] & /@ x]
eqs = MapIndexed[t[[c @@ (nums[[#2]][[1]])]] == g[#1] &, (fx[#, {8, 1.5}] & /@nums)];
vars = Union@Cases[eqs, _q, 4];
s = Solve[Join[eqs, Thread[0 <= vars < 2]], vars, Integers];
res = (Transpose@s)[[All, All, 2]];
i = 1; plays = Select[{i++, #[[1]], Equal @@ #} & /@ res, #[[3]] &];
Flatten /@ ({#[[2]] /. 1 -> F, List @@ vars[[#[[1]]]] - 1} & /@ plays)

(*
{{0, 0, 3}, {F, 1, 3}, {F, 2, 4}, {0, 3, 4}, {0, 4, 4}, 
 {F, 5, 4}, {F, 6, 0}, {F, 6, 4}, {0, 7, 4}}
*)

Chỉnh sửa: Phần thưởng theo dõi

Tôi đã tạo ra một sân chơi tương tác tính toán xác suất bom bằng cách tính toán tất cả các giải pháp có thể cho một cấu hình nhất định:

Đồ họa toán học

Hướng dẫn kiểm tra mà không cần cài đặt Mathicala:

  1. Tải xuống http://pastebin.com/asLC47BW và lưu dưới dạng * .CDF
  2. Tải xuống môi trường CDF miễn phí từ Wolfram Research tại https://www.wolfram.com/cdf-player/ (không phải là một tệp nhỏ)

Thanh trượt thay đổi kích thước bảng. Đây chỉ là một chương trình sơ sài, chưa được kiểm tra đầy đủ, vui lòng báo cáo bất kỳ lỗi nào. Tôi chưa thực hiện tính năng "tổng số bom có ​​sẵn trên tàu". Nó được giả định là vô hạn.

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.