Xây dựng bộ giải câu đố MU


16

Câu đố MU là một câu đố trong đó bạn tìm hiểu xem bạn có thể biến MIthành MUcác thao tác sau không:

  1. Nếu chuỗi của bạn kết thúc I, bạn có thể thêm một Ukết thúc. (ví dụ MI -> MIU)

  2. Nếu chuỗi của bạn bắt đầu bằng M, bạn có thể nối thêm một bản sao của phần sau Mvào chuỗi.
    (ví dụ MII -> MIIII)

  3. Nếu chuỗi của bạn chứa ba chuỗi liên tiếp I, bạn có thể thay đổi chúng thành một U.
    (ví dụ MIII -> MU)

  4. Nếu chuỗi của bạn chứa hai chuỗi liên tiếp U, bạn có thể xóa chúng. (ví dụ MUUU -> MU).

Nhiệm vụ của bạn là xây dựng một chương trình xác định xem điều này có thể thực hiện được đối với bất kỳ chuỗi bắt đầu và kết thúc nào không.

Chương trình của bạn sẽ lấy hai chuỗi làm đầu vào. Mỗi chuỗi sẽ bao gồm các điều sau đây:

  • một M.

  • một chuỗi lên đến hai mươi chín IU.

Sau đó, chương trình của bạn sẽ trả về true(hoặc đại diện cho ngôn ngữ lập trình của bạn / YPLRT) nếu chuỗi thứ hai có thể truy cập được từ chuỗi thứ nhất và false(hoặc YPLRT) nếu không có.

Ví dụ đầu vào và đầu ra:

MI  MII
true

MI  MU
false

MIIIIU  MI
true

Mã ngắn nhất trong bất kỳ ngôn ngữ để làm điều này chiến thắng.


8
Tôi hiện đang đọc Gôdel, Escher, Bach và nghĩ về việc thực hiện một "sân golf 18 lỗ" dựa trên các chương của nó sau đó. Đoán tôi đã tìm thấy một "lỗ 1" mới bây giờ. ;)
Martin Ender

Đây chỉ là một câu hỏi khả năng tiếp cận đồ thị mà bản chất của nó đã được hỏi rất nhiều lần trước đây.
Peter Taylor

1
@PeterTaylor Tôi nghĩ rằng rất có thể điều này sẽ không được giải quyết bằng một tìm kiếm rõ ràng về biểu đồ khả năng tiếp cận. Các quy tắc MIU có rất nhiều cấu trúc và tôi sẽ không ngạc nhiên nếu có một thuật toán trực tiếp để kiểm tra khả năng tiếp cận mà không cần tìm kiếm các nút trung gian. Ví dụ, các nút có thể truy cập từ MIchính xác là M(I|U)*số lượng Ikhông phải là bội số của 3. Và việc kiểm tra trực tiếp như vậy chắc chắn tạo ra mã ngắn hơn. Ngoài ra, tôi không biết về một a-prori bị ràng buộc về độ dài của chuỗi cần thiết cho các bước trung gian, vì vậy tìm kiếm trực tiếp có thể đơn giản là không thực tế.
xnor

1
Tôi đã suy nghĩ về vấn đề này trong một thời gian và đã không tiến gần đến một giải pháp không phải là vũ phu. Nếu không ai cắn, tôi khuyên bạn nên đăng một phiên bản dễ hơn của câu hỏi, có lẽ để đưa ra một dẫn xuất bắt đầu từ MImột chuỗi có thể tiếp cận được.
xnor

1
Đầu ra nên là gì nếu IMđược cung cấp hoặc MUMMI?
Beta Decay

Câu trả lời:


7

SWI Prolog, 183 ký tự

m(A,A).
m([i],[i,u]).
m([i,i,i|T],B):-m([u|T],B).
m([u,u|T],B):-m(T,B).
n([m|A],[m|B]):-(m(A,B);append(A,A,X),m(X,B)).
n(A,B):-m(A,B).
s(A,B):-atom_chars(A,X),atom_chars(B,Y),n(X,Y).

Làm thế nào về một số Prolog, (vì không ai trả lời trong 6 tháng). Để chạy, chỉ cần sử dụng "s (mi, mu)." Mã này phá vỡ các nguyên tử thành ký tự, sau đó tìm kiếm giải pháp.


2
Điều này trả về sai s(mi,miiii), và nói chung, bất cứ điều gì đòi hỏi nhiều hơn một ứng dụng của quy tắc 2 để chứng minh.
thuật toá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.