MU 퍼즐 솔버 구축


16

MU 퍼즐 당신이 회전 할 수 있는지 여부를 알 수있는 퍼즐 MIMU주어진 다음 작업 :

  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
저는 현재 Gödel, Escher, Bach를 읽고 있으며 나중에 그 장을 기반으로 "18 홀 골프 코스"에 대해 생각했습니다. 이제 새로운 "구멍 1"을 찾아야한다고 생각합니다. ;)
Martin Ender

이것은 본질이 이전에 여러 번 요청 된 그래프 도달 가능성 질문입니다.
피터 테일러

1
@PeterTaylor 도달 가능성 그래프를 명시 적으로 검색해도 이것이 해결되지 않을 가능성이 높다고 생각합니다. MIU 규칙은 많은 구조를 가지고 있으며 중간 노드를 검색하지 않고 도달 가능성을 테스트하는 직접적인 알고리즘이 있는지는 놀랄 일이 아닙니다. 예를 들어, 연결할 수있는 노드 MIM(I|U)*I 는 3의 배수가 아닌 위치입니다. 이러한 직접 검사는 코드를 더 짧게 만듭니다. 또한 중간 단계에 필요한 문자열 길이에 대한 선입견을 알지 못하므로 직접 검색이 실용적이지 않을 수 있습니다.
xnor

1
나는이 문제에 대해 잠시 동안 생각했지만 무력하지 않은 솔루션에 가까워지지 않았습니다. 아무도 물지 않으면 더 쉬운 버전의 질문을 게시하는 것이 좋습니다. 어쩌면 MI주어진 도달 가능한 문자열 에서 시작하여 파생 할 수 있습니다.
xnor

1
IM공급되는 경우 출력은 무엇입니까 MUMMI?
Beta Decay

답변:


7

SWI 프롤로그, 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 개월 동안 아무도 대답하지 않았기 때문에 어떤 Prolog는 어떻습니까? 실행하려면 "s (mi, mu)"를 사용하십시오. 코드는 원자를 문자로 나누고 솔루션을 검색합니다.


2
이것은 잘못 on을 반환 s(mi,miiii)하며 일반적으로 증명하기 위해 둘 이상의 규칙 2를 적용해야하는 모든 것을 반환합니다 .
algorithmshark
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.