CJam, 33 32 20 19 17 byte
Phiên bản sửa đổi, với sự hỗ trợ lớn từ @ Sp3000 và @ MartinBüttner:
qN/_z]{:e`z,3<}/|
Dùng thử trực tuyến
Đóng góp
- @ Sp3000 đề xuất đơn giản hóa quan trọng cho thuật toán ban đầu của tôi.
- @ MartinBüttner đã áp dụng các kỹ năng chơi golf điên rồ của mình vào cách tiếp cận sửa đổi, điều này gần như chắc chắn dẫn đến mã ngắn hơn tôi sẽ nghĩ ra ngay cả sau khi xem xét đơn giản hóa.
Thuật toán và bằng chứng
Sau đây giải thích các tiêu chí cho câu đố trượt theo chiều ngang. Trường hợp dọc có thể được xác định bằng cách nhìn vào các cột thay vì các hàng hoặc hoán vị ma trận ký tự và nhìn lại các hàng.
Tôi sẽ sử dụng thuật ngữ "kéo dài" cho một chuỗi tối đa của cùng một chữ cái. Ví dụ: các hàng sau có lần lượt 1, 2 và 3:
AAAAAAAA
BBBAAAAA
AABBBAAA
Tôi cũng sẽ sử dụng thuật ngữ "lồng vào nhau" cho một hàng / câu đố không thể trượt ra.
Quan sát chính là câu đố có thể trượt ra khi và chỉ khi tất cả các hàng có tối đa 2 lần kéo dài . Hoặc đảo ngược, nó được lồng vào nhau khi và chỉ khi có bất kỳ hàng nào có nhiều hơn 2 đoạn .
Những điều sau đây có thể không đủ điều kiện là một bằng chứng toán học nghiêm ngặt, nhưng tôi tin rằng nó đưa ra một lời giải thích thuyết phục tại sao điều này phải là trường hợp.
Dễ dàng thấy rằng câu đố được lồng vào nhau nếu nó có các hàng dài hơn 2 đoạn. Nhìn vào một hàng với 3 trải dài:
BBBAAB
rõ ràng là nó ngăn chặn câu đố trượt ra ngoài vì sự A
kéo dài bị khóa giữa các B
đoạn. Điều này có nghĩa là hàng được lồng vào nhau, từ đó làm cho toàn bộ câu đố được lồng vào nhau.
Hướng ngược lại của bằng chứng không hoàn toàn rõ ràng. Chúng ta cần chỉ ra rằng không có câu đố lồng vào nhau mà tất cả các hàng chỉ có 1 hoặc 2 đoạn. Bắt đầu với một vài quan sát:
- Các hàng chỉ có 1 độ căng không góp phần làm cho câu đố được lồng vào nhau, vì chúng có thể trượt theo hai hướng mà không có bất kỳ va chạm nào.
- Nếu tất cả các hàng có 2 đoạn có cùng thứ tự
A
và B
, câu đố rõ ràng không được lồng vào nhau. Trong trường hợp này, tất cả các A
ô còn lại của tất cả các B
ô hoặc ngược lại và không có va chạm khi trượt hai mảnh cách nhau.
Trường hợp khó khăn duy nhất sẽ là các câu đố trong đó chúng ta có các hàng với 2 đoạn theo thứ tự khác nhau. Tôi sẽ chỉ ra rằng những câu đố như vậy không tồn tại theo các thông số kỹ thuật nhất định. Để hiển thị điều này, chúng ta hãy nhìn vào một câu đố một phần có cấu hình này, trong đó .
có các ký tự đại diện:
.......
AAABBBB
.......
BBAAAAA
.......
Bây giờ, đặc tả nói rằng cả hai A
và B
các ô được kết nối đơn giản trong tất cả các câu đố hợp lệ. Để làm cho các A
ô được kết nối trong câu đố một phần ở trên, chúng tôi có hai tùy chọn:
Chúng tôi vòng quanh một trong những đoạn của B
, ví dụ:
..AAAAAA
AAABBBBA
.......A
BBAAAAAA
........
Để làm điều này, chúng tôi không thể tránh khỏi việc mở rộng một trong các hàng để có 3 lần kéo dài, vì vậy điều này sẽ không bao giờ cho chúng ta một câu đố hợp lệ trong đó tất cả các hàng có tối đa 2 lần.
Chúng tôi kết nối chúng trên một con đường trực tiếp:
.......
AAABBBB
..A....
BBAAAAA
.......
Các A
ô hiện được kết nối đơn giản và vẫn không có hàng nào có nhiều hơn 2 đoạn. Tuy nhiên, các B
tế bào cũng cần được kết nối đơn giản. Đường dẫn trực tiếp hiện bị chặn bởi các A
ô được kết nối và cách duy nhất để kết nối các B
ô là vòng quanh một trong các A
ô của các ô. Điều này dẫn trở lại trường hợp 1, trong đó chúng ta không thể làm điều đó mà không tạo ra các hàng gồm 3 đoạn.
Để đếm các đoạn đường, việc triển khai sử dụng toán tử CJam RLE.
Giải thích về Mã
qN/ Get input and split at newlines.
_z Make a transposed copy.
] Wrap the original and transposed puzzle in an array so that we can
loop over the two.
{ Start of loop over original and transposed puzzle.
:e` Apply RLE to all rows.
z, Transpose the matrix with the RLE rows, and take the element count of the
result. Or in other words, take the column count. This will be the length
of the longest row after RLE.
3< Check the length for less than 3.
}/ End of loop over original and transposed puzzle.
| Or the results of the two.