O quebra - cabeça MU é um quebra-cabeça no qual você descobre se pode se transformar MI
nas MU
seguintes operações:
Se sua string terminar
I
, você poderá adicionarU
a no final. (por exemploMI -> MIU
)Se sua sequência começar
M
, você poderá anexar uma cópia da peça depoisM
à sequência.
(por exemploMII -> MIIII
)Se a sua string contiver três consecutivas
I
, você poderá alterá-las para aU
.
(por exemploMIII -> MU
)Se sua string contiver dois consecutivos
U
, você poderá excluí-los. (por exemploMUUU -> MU
).
Sua tarefa é criar um programa que determine se isso é possível para qualquer sequência de início e fim.
Seu programa terá duas seqüências de caracteres como entrada. Cada sequência consistirá no seguinte:
um
M
.uma sequência de até vinte e nove
I
'eU
'.
Seu programa retornará true
(ou a representação da sua linguagem de programação / YPLRT) se a segunda string estiver acessível a partir da primeira string e false
(ou YPLRT) se não estiver.
Exemplos de entradas e saídas:
MI MII
true
MI MU
false
MIIIIU MI
true
O código mais curto em qualquer idioma para fazer isso vence.
fonte
MI
são exatamenteM(I|U)*
onde o número deI
não é um múltiplo de 3. E essa verificação direta certamente contribui para um código mais curto. Além disso, não conheço um limite a priori no comprimento das seqüências necessárias para etapas intermediárias, portanto, a pesquisa direta pode ser simplesmente impraticável.MI
de uma determinada sequência acessível.IM
for fornecida ouMUMMI
?Respostas:
SWI Prolog, 183 caracteres
Que tal um Prolog, (já que ninguém responde em 6 meses). Para executar, basta usar "s (mi, mu)". O código divide os átomos em caracteres e depois procura a solução.
fonte
s(mi,miiii)
e, em geral, qualquer coisa que exija mais de uma aplicação da regra 2 para provar.