MU zagadka jest logiczna, w której dowiesz się, czy można włączyć MI
do MU
podanych następujących operacji:
Jeśli twój łańcuch kończy się na
I
, możesz dodać aU
na końcu. (np.MI -> MIU
)Jeśli ciąg zaczyna się od
M
, możesz dołączyć kopię części poM
nim.
(np.MII -> MIIII
)Jeśli Twój ciąg zawiera trzy kolejne
I
, możesz zmienić je naU
.
(np.MIII -> MU
)Jeśli Twój ciąg zawiera dwa kolejne
U
, możesz je usunąć. (npMUUU -> MU
.).
Twoim zadaniem jest zbudowanie programu, który określa, czy jest to wykonalne dla dowolnych ciągów początkowych i końcowych.
Twój program pobierze dwa ciągi jako dane wejściowe. Każdy ciąg składa się z następujących elementów:
jeden
M
.ciąg do dwudziestu dziewięciu
I
iU
tych.
Twój program zwróci następnie true
(lub jego reprezentację języka programowania / YPLRT), jeśli drugi łańcuch jest osiągalny z pierwszego łańcucha i false
(lub YPLRT), jeśli nie jest.
Przykładowe dane wejściowe i wyjściowe:
MI MII
true
MI MU
false
MIIIIU MI
true
Wygrywa najkrótszy kod w dowolnym języku, aby to zrobić.
źródło
MI
są dokładnie tam,M(I|U)*
gdzie liczbaI
nie jest wielokrotnością 3. A takie bezpośrednie sprawdzenie z pewnością skraca kod. Ponadto nie znam a priori związanego z długością łańcuchów wymaganych dla pośrednich kroków, więc bezpośrednie wyszukiwanie może być po prostu niepraktyczne.MI
danego osiągalnego ciągu.IM
został dostarczony lubMUMMI
?Odpowiedzi:
SWI Prolog, 183 znaków
Co powiesz na jakiegoś Prologa (skoro nikt nie odpowiedział od 6 miesięcy). Aby uruchomić, po prostu użyj „s (mi, mu)”. Kod dzieli atomy na znaki, a następnie szuka rozwiązania.
źródło
s(mi,miiii)
i ogólnie wszystko, co wymaga więcej niż jednego zastosowania reguły 2 w celu udowodnienia.