Trò chơi ô chữ bắt buộc!


14

Chris, một người nghiện trò chơi ô chữ khó hiểu, có một thuật toán được thiết lập cho thứ tự mà anh ta giải quyết chúng.

nhập mô tả hình ảnh ở đây

Chúng tôi sẽ sử dụng hình ảnh trên như một hướng dẫn.

  1. Chris luôn bắt đầu với đầu mối xuyên suốt, trong trường hợp này là 1 Across. Chris là một người đam mê trò chơi ô chữ có khả năng, vì vậy người ta cho rằng anh ta sẽ luôn biết câu trả lời cho manh mối mà anh ta đang làm việc.
  2. Khi Chris hoàn thành một đầu mối, anh ta sẽ kiểm tra tất cả các đầu mối tiếp giáp với những gì anh ta đã hoàn thành (trong trường hợp đầu tiên, 1 Xuống, 2 Xuống và 3 Xuống) và sau đó hoàn thành đầu mối với số thấp nhất. Nếu không có manh mối liền kề, anh sẽ chuyển sang bước 3.
  3. Nếu đầu mối sao cho số tiếp theo (như được mô tả trong Bước 3) có cả đầu mối và đầu mối xuống, anh ta sẽ hoàn thành đầu mối trên đầu tiên (chắc chắn 100%, điều này giáp với OCD!)
  4. Nếu không có manh mối liền kề, anh ta sẽ đi đến đầu mối tiếp theo có số tiếp theo (ngang hoặc xuống)
  5. Lặp lại từ Bước 2 cho đến khi tất cả các đầu mối được hoàn thành.

Và đây là nơi nó đến với bạn, các lập trình viên thân yêu. Bạn đã được giao nhiệm vụ tạo mã có thể, khi được cung cấp một mẫu ô chữ, cung cấp đầu ra mô tả thứ tự các đầu mối dựa trên thuật toán của Chris để giải quyết nó.

Mã sẽ chấp nhận đầu vào của một mẫu câu đố ô chữ, dưới dạng .một hình vuông #đại diện cho hình vuông màu trắng và hình đại diện cho hình vuông màu đen.

Ví dụ :

.....#.........
.#.#.#.#.#.#.#.
...#...#.......
.#.#.#.#.#.#.#.
....#..........
##.#.#.#.#.#.#.
......#........
.###.#####.###.
........#......
.#.#.#.#.#.#.##
..........#....
.#.#.#.#.#.#.#.
.......#...#...
.#.#.#.#.#.#.#.
.........#.....

Đầu vào có thể thông qua: a) một tệp đọc biểu diễn của ô chữ hoặc b) theo đầu vào dòng của mỗi dòng của ô chữ, theo sau \n, với một giây \ncho biết EOF.

Và sau đó nó sẽ xác định phương pháp mà Chris sẽ giải quyết nó theo thuật toán trên mà anh đã mô tả.

Đầu ra phải ở định dạng của một loạt các hướng dẫn được phân tách bằng dấu phẩy ở dạng n(A|D), trong đó nlà số đầu mối theo sau Acho ngang hoặc Dxuống.

Vì vậy, trong ví dụ trên (cả từ hình ảnh và mẫu ví dụ, là một và giống nhau), đầu ra sẽ là:

1A,1D,2D,3D,9A,10A,4D,5D,6D,7D,8D,11A,12A,13A,15A,14D,15D,16A,17A,18D,19D,20A,21D,23A,22D,24A,25D,27A,28A,26D,29A,30A,31A

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

Kiểm tra

Bạn phải cung cấp cho trình đệ trình mã, số byte, cũng như một trong bốn trường hợp thử nghiệm được trình bày theo định dạng .#, cũng như đầu ra được tạo từ đầu vào này. Có bốn trường hợp thử nghiệm, ba trường hợp dưới đây cũng như mẫu ví dụ trên.

Các trường hợp thử nghiệm ví dụ:

Trường hợp kiểm tra 1

.....#
.#.#.#
...#..
.#.#.#
.....#
##.#..

Đầu ra: 1A,1D,2D,3D,4A,5A,6A,7A

Trường hợp thử nghiệm 2

.....#..
.#.##..#
.#....#.
...##.#.
.####...
......##

Đầu ra: 1A,1D,2D,5A,4D,4A,3D,3A,7A,8A,6D,9A

Trường hợp thử nghiệm 3

.........#
#.#.#.#.#.
....#...#.
#...#.#.#.
..###.#.#.
.#....#...
.#####...#
.....###..

Đầu ra: 1A,2D,3D,4D,5D,7A,8A,9A,10A,11A,11D,12A,13A,6D,14D,15A,16A,17A

Trường hợp thử nghiệm 4

.....#.........
.#.#.#.#.#.#.#.
...#...#.......
.#.#.#.#.#.#.#.
....#..........
##.#.#.#.#.#.#.
......#........
.###.#####.###.
........#......
.#.#.#.#.#.#.##
..........#....
.#.#.#.#.#.#.#.
.......#...#...
.#.#.#.#.#.#.#.
.........#.....

Đầu ra: 1A,1D,2D,3D,9A,10A,4D,4A,5D,6D,7D,8D,11A,12A,13A,15A,14D,15D,16A,17A,18D,19D,20A,21D,23A,22D,24A,25D,27A,28A,26D,29A,30A,31A

Chúc may mắn!


Chỉ cần chắc chắn: Trong hình ảnh ví dụ của bạn, số nào là đầu mối thứ năm được điền đầy bắt buộc? (sau 1H, 1V, 2V, 3V)
Tiến sĩ belisarius

@belisarius Hình ảnh tương ứng với trường hợp thử nghiệm thứ tư. Vì vậy, manh mối thứ năm được điền sẽ là 9 Across, hoặc như bạn sẽ đặt nó, 9H :) Vì manh mối duy nhất liền kề sau khi đầu mối thứ tư được hoàn thành là 9 và 10 Across, Chris sẽ bị buộc phải điền vào đầu mối thấp nhất trước ...
WallyWest

Là các byte chỉ được xem xét trên cơ sở mã tạo ra đầu ra chính xác. IOW, bạn có bị phạt bao gồm, không gian tên C # + lớp + Chính và tương tự để có thể biên dịch được không hay có hợp lý không khi cho rằng nếu tôi viết nó bằng C #, hoặc tương tự, thì sẽ cần một lượng mã tối thiểu?
ChiefTwoP Pencil 24/214

1
@BulkDigital Chà, đây là môn đánh gôn ... Tôi hy vọng rằng nếu bạn có kế hoạch viết nó bằng C #, bạn sẽ cố gắng không sử dụng quá nhiều ngoại cảnh ... Bạn sẽ phải đếm chúng tôi sợ .. .
WallyWest

1
@WallyWest Tôi nghĩ rằng ví dụ thứ ba của bạn đang bỏ qua 17Aphần cuối. Cũng là thứ tư 4Angay sau 4D.
Howard

Câu trả lời:


5

GolfScript, 154 ký tự

:^,,{.^=46<{;-1}*)}%[.^n?)/zip[0]*]{1,%{,1>},}%:H"AD"1/]zip{~`{1$0=H{{0=}/}%.&$?)\+[\]}+/}%(2/\{0=)[\~\]}$+[]{1${1=1$&},.!{;1$1<}*1<:F~~@|@F-\1$}do;;]','*

Đầu vào phải được cung cấp trên STDIN. Các ví dụ mang lại kết quả sau (kiểm tra trực tuyến ):

1A,1D,2D,3D,4A,5A,6A,7A

1A,1D,2D,5A,4D,4A,3D,3A,7A,8A,6D,9A

1A,2D,3D,4D,5D,7A,8D,9A,10A,11A,11D,12A,13A,6D,14D,15A,16A,17A

1A,1D,2D,3D,9A,10A,4D,4A,5D,6D,7D,8D,11A,12A,13A,15A,14D,15D,16A,17A,18D,19D,20A,21D,23A,22D,24A,25D,27A,28A,26D,29A,30A,31A

+1 súc tích đáng chú ý. Làm thế nào nó hoạt động?
DavidC

Wow, cảm ơn vì đã nói rõ rằng tôi thậm chí không nên lãng phí thời gian của mình. Rõ ràng sẽ phải có được một ngôn ngữ phù hợp hơn. votes++
ChiefTwoP Pencil 24/214

@BulkDigital Ý tôi là không thiếu tôn trọng. C # là một ngôn ngữ rất dài dòng ... có lẽ nó không phải là ngôn ngữ tốt nhất cho môn đánh gôn. Code-bowling hay cho các cuộc thi nổi tiếng ở đây ... nhưng Code Golf là một loại cá hoàn toàn mới.
WallyWest

+1 ở đây nữa ... Có lẽ là một trong những mục GolfScript dài hơn mà tôi đã thấy ... Hoàn thành tốt.
WallyWest

1
@BulkDigital: Bản thân nhiệm vụ này khá thú vị. Hãy thử một ngôn ngữ mà bạn quen thuộc. Tôi nghĩ bạn sẽ thích câu đố nhiều như tôi đã làm - điều tra tất cả các cách tiếp cận khác nhau để giải câu đố. Đó là niềm vui của chính nó ngay cả khi bạn không đạt được số ký tự thấp như câu trả lời này.
Howard

3

Toán học 806 477

(Dường như có một trục trặc trong việc sắp xếp các bước giải pháp. Tôi đang xem xét điều này.)

Chơi gôn

Hàm qtìm thấy thứ tự của các giải pháp ô chữ.

i = Dimensions; v = MemberQ; u = Position; y = ToString; k = Select;
q@t_ :=
 (g@p_ := Characters@StringSplit[p, "\n"];
  w = g@t;
  a[{r_, c_}, z_] := (c != i[z][[2]]) \[And] 
    v[u[z, "."], {r, c + 1}] \[And] ((c == 1) \[Or] 
      v[u[z, "#"], {r, c - 1}]);
  b@z_ := k[u[z, "."], a[#, z] &];
  d[{r_, c_}, z_] := (r != i[z][[2]]) \[And] 
    v[u[z, "."], {r + 1, c}] \[And] ((r == 1) \[Or] 
      v[u[z, "#"], {r - 1, c}]);
  e@z_ := k[u[z, "."], d[#, z] &];
  Cases[Flatten[{
       If[v[b[w], #[[1]]], y[#[[2]]] <> "A"],
       If[v[e[w], #[[1]]], y[#[[2]]] <> "D"]} & /@ (MapIndexed[List, 
        b[w] \[Union] e[w]] /. {{r_, c_}, {i_}} :> ({r, c} -> i))], 
   Except[Null]])

Ung dung

q[t7_]:=
Module[{d,acrossSquareQ,acrossSquares,downSquareQ,downSquares,m,numberedCells},
(*w=g[t7];*)
g[p2_]:=Characters@StringSplit[p2,"\n"];
w=g[t7];
acrossSquareQ[{r_,c_},z_]:=(c!=Dimensions[z][[2]])\[And]MemberQ[Position[z,"."],{r,c+1}] \[And]((c==1)\[Or]MemberQ[Position[z,"#"],{r,c-1}]);
acrossSquares[z_]:=Select[Position[z,"."],acrossSquareQ[#,z]&];
downSquareQ[{r_,c_},z_]:=(r!=Dimensions[z][[2]])\[And]MemberQ[Position[z,"."],{r+1,c}] \[And]((r==1)\[Or]MemberQ[Position[z,"#"],{r-1,c}]);
downSquares[z_]:=Select[Position[z,"."],downSquareQ[#,z]&];
numberedCells[z_]:=acrossSquares[z]\[Union]downSquares[z];
m=MapIndexed[List,numberedCells[w]]/.{{r_?IntegerQ,c_?IntegerQ},{i_?IntegerQ}}:> ({r,c}-> i);
Cases[Flatten[{
If[MemberQ[acrossSquares[w],#[[1]]],ToString[#[[2]]]<>"A"],
If[MemberQ[downSquares[w],#[[1]]],ToString[#[[2]]]<>"D"]}&/@m],Except[Null]]]

boardhiển thị các trò chơi ô chữ. Mã không được bao gồm trong số lượng ký tự. Một số chức năng phụ qđược mượn ở đây.

board[p_]:=
Module[{q,g,w,downSquareQ,downSquares,acrossSquareQ,acrossSquares,numberedCells,m},
downSquareQ[{r_,c_},z_]:=(r!=Dimensions[z][[2]])\[And]MemberQ[Position[z,"."],{r+1,c}] \[And]((r==1)\[Or]MemberQ[Position[z,"#"],{r-1,c}]);
downSquares[z_]:=Select[Position[z,"."],downSquareQ[#,z]&];
acrossSquareQ[{r_,c_},z_]:=(c!=Dimensions[z][[2]])\[And]MemberQ[Position[z,"."],{r,c+1}] \[And]((c==1)\[Or]MemberQ[Position[z,"#"],{r,c-1}]);
acrossSquares[z_]:=Select[Position[z,"."],acrossSquareQ[#,z]&];
numberedCells[z_]:=acrossSquares[z]\[Union]downSquares[z];
g[p2_]:=Characters@StringSplit[p2,"\n"];
w=g[p];
m=MapIndexed[List,numberedCells[w]]/.{{r_?IntegerQ,c_?IntegerQ},{i_?IntegerQ}}:> ({r,c}-> i);
Grid[ReplacePart[w,m],Dividers->All,Background->{None,None,(#-> Black)&/@Position[w,"#"]}]]

TestCase

1

t1=".....#
.#.#.#
...#..
.#.#.#
.....#
##.#..";
board[t1]
q[t1]

t1

{"1A", "1D", "2D", "3D", "4A", "5A", "6A", "7A"}


2

t2=".....#..
.#.##..#
.#....#.
...##.#.
.####...
......##";

board[t2]
q[t2]

t2

{"1A", "1D", "2D", "3A", "3D", "4A", "4D", "5A", "6D", "7A", "8A", "9A"}


3

t3=".........#
#.#.#.#.#.
....#...#.
#...#.#.#.
..###.#.#.
.#....#...
.#####...#
.....###..";

board[t3]

q[t3]

t3

{"1A", "2D", "3D", "4D", "5D", "6D", "7A", "8D", "9A", "10A", "11A", "11D", " 12A "," 13A "," 14D "," 15A "," 16A "," 17A "}


4

t4=".....#.........
.#.#.#.#.#.#.#.
...#...#.......
.#.#.#.#.#.#.#.
....#..........
##.#.#.#.#.#.#.
......#........
.###.#####.###.
........#......
.#.#.#.#.#.#.##
..........#....
.#.#.#.#.#.#.#.
.......#...#...
.#.#.#.#.#.#.#.
.........#.....";

board[t4]


q[t4]

t4

{"1A", "1D", "2D", "3D", "4A", "4D", "5D", "6D", "7D", "8D", "9A", "10A", " 11A "," 12A "," 13A "," 14D "," 15A "," 15D "," 16A "," 17A "," 18D "," 19D "," 20A "," 21D "," 22D " , "23A", "24A", "25D", "26D", "27A", "28A", "29A", "30A", "31A"}


Tôi nghĩ rằng bạn có một vấn đề với mã của bạn. Ví dụ, trong ví dụ 2, 3Akhông nên ngay sau khi 2Dchưa có manh mối. Ngoài ra các giải pháp khác cho thấy hiệu ứng này.
Howard

Howard, tôi không hiểu quan điểm của bạn. Từ "4. Nếu không có manh mối liền kề, anh ta sẽ đi đến manh mối tiếp theo có số tiếp theo (ngang hoặc xuống)", có vẻ như 3A có thể ở sau 2D.
DavidC

Nhưng ví dụ 5Acó một đầu mối và do đó nên được ưa chuộng hơn 3A.
Howard

Bạn đã xác định một tốc ký cho ToStringhai lần
Tiến sĩ belisarius

Howard, bây giờ tôi hiểu quan điểm của bạn. Cảm ơn. Sẽ sửa sau.
DavidC
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.