Costruisci un MU risolutore di puzzle


16

Il puzzle MU è un puzzle in cui scopri se puoi trasformarti MIin MUle seguenti operazioni:

  1. Se la stringa finisce I, puoi aggiungere Ua alla fine. (ad es. MI -> MIU)

  2. Se la stringa inizia con M, è possibile aggiungere una copia della parte successiva Malla stringa.
    (ad es. MII -> MIIII)

  3. Se la tua stringa contiene tre di seguito I, puoi cambiarli in a U.
    (ad es. MIII -> MU)

  4. Se la tua stringa contiene due di seguito U, puoi eliminarli. (ad es MUUU -> MU.).

Il tuo compito è costruire un programma che determini se ciò è fattibile per qualsiasi stringa di inizio e fine.

Il tuo programma prenderà due stringhe come input. Ogni stringa sarà composta da quanto segue:

  • uno M.

  • una serie di fino a ventinove I's e U' s.

Il programma quindi restituirà true(o la sua rappresentazione del linguaggio di programmazione / YPLRT) se la seconda stringa è raggiungibile dalla prima stringa e false(o YPLRT) se non lo è.

Ingressi e uscite di esempio:

MI  MII
true

MI  MU
false

MIIIIU  MI
true

Il codice più corto in qualsiasi lingua per fare ciò vince.


8
Attualmente sto leggendo Gödel, Escher, Bach e ho pensato di fare un "campo da golf a 18 buche" basato sui suoi capitoli in seguito. Immagino che ora devo trovare un nuovo "buco 1". ;)
Martin Ender,

Questa è solo una domanda di raggiungibilità del grafico la cui essenza è stata posta molte volte in precedenza.
Peter Taylor,

1
@PeterTaylor Penso che ci siano buone probabilità che questo non venga risolto da una ricerca esplicita del grafico di raggiungibilità. Le regole MIU hanno molta struttura e non sarei sorpreso se ci fosse un algoritmo diretto per testare la raggiungibilità senza cercare nodi intermedi. Ad esempio, i nodi raggiungibili MIsono esattamente il punto in M(I|U)*cui il numero di Inon è un multiplo di 3. E un tale controllo diretto rende sicuramente il codice più breve. Inoltre, non conosco un limite a priori legato alla lunghezza delle stringhe richieste per passaggi intermedi, quindi la ricerca diretta potrebbe essere semplicemente poco pratica.
xnor

1
Ho pensato a questo problema per un po 'e non mi sono avvicinato a una soluzione che non sia la forza bruta. Se nessuno morde, suggerisco di pubblicare una versione più semplice della domanda, magari per dare una derivazione a partire da MIuna determinata stringa raggiungibile.
xnor

1
Cosa dovrebbe essere l'output se IMviene fornito o MUMMI?
Decadimento beta

Risposte:


7

SWI Prolog, 183 caratteri

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

Che ne dici di Prolog (dal momento che nessuno ha risposto in 6 mesi). Per correre, basta usare "s (mi, mu)". Il codice suddivide gli atomi in caratteri, quindi cerca la soluzione.


2
Ciò restituisce erroneamente false s(mi,miiii), e in generale tutto ciò che richiede più di un'applicazione della regola 2 per dimostrarlo.
algoritmo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.