Побудуйте MU головоломку


16

Головоломка MU - головоломка , в якій ви дізнаєтеся, чи можна включити MIв MUданих наступних операцій:

  1. Якщо ваш рядок закінчується I, ви можете додати його Uдо кінця. (наприклад MI -> MIU)

  2. Якщо ваш рядок починається з M, ви можете додати копію частини після цього Mдо рядка.
    (наприклад MII -> MIIII)

  3. Якщо ваша рядок містить три послідовних I, ви можете змінити їх на U.
    (наприклад MIII -> MU)

  4. Якщо ваша рядок містить два послідовних U, ви можете їх видалити. (наприклад MUUU -> MU).

Ваше завдання - створити програму, яка визначає, чи це можливо для будь-яких рядків початку та закінчення.

Ваша програма буде вводити два рядки як вхідні дані. Кожна рядок складається з наступного:

  • один M.

  • рядок до двадцяти дев'яти Iі Uз.

Потім ваша програма поверне true(або представлення вашої мови програмування / YPLRT), якщо другий рядок буде доступний з першої струни, і false(або YPLRT), якщо він не є.

Приклади входів і виходів:

MI  MII
true

MI  MU
false

MIIIIU  MI
true

Найкоротший код будь-якої мови для цього виграє.


8
Я зараз читаю Геделя, Ешера, Баха і замислювався про те, щоб зробити "поле для гольфу з 18 лунками" на основі його розділів після цього. Гадаю, зараз мені потрібно знайти нову "дірку 1". ;)
Мартін Ендер

Це лише питання про доступність графіку, суть якого задавали багато разів раніше.
Пітер Тейлор

1
@PeterTaylor Я думаю, що є хороший шанс, що це не вирішиться шляхом явного пошуку графіка доступності. Правила MIU мають багато структури, і я не здивуюся, якщо існує прямий алгоритм для перевірки доступності без пошуку проміжних вузлів. Наприклад, вузли, до яких можна дістатися, - MIце саме те, M(I|U)*де кількість Iне кратна 3. І така пряма перевірка, безумовно, передбачає коротший код. Крім того, я не знаю апріорі, обмеженого довжинами рядків, необхідних для проміжних кроків, тому прямий пошук може бути просто недоцільним.
xnor

1
Я деякий час думав над цією проблемою і не наблизився до рішення, яке не є грубою силою. Якщо ніхто не кусається, я пропоную опублікувати більш просту версію питання, можливо, дати виведення, починаючи з MIзаданої рядки, що доступна.
xnor

1
Яким повинен бути вихід, якщо IMвін подається або MUMMI?
Бета-розпад

Відповіді:


7

SWI Prolog, 183 символи

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).

А як щодо якогось Прологу (адже за 6 місяців ніхто не відповів). Для запуску просто використовуйте "s (mi, mu)". Код розбиває атоми на символи, потім шукає рішення.


2
Це помилково повертає помилкове значення s(mi,miiii), і взагалі все, що вимагає доведення декількох застосувань правила 2.
алгоритм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.