MUパズルソルバーを構築する


16

MUのパズルは、あなたが回すことができるかどうかを知るしたパズルであるMIMU与えられ、次の操作:

  1. 文字列がで終わる場合、末尾にIa Uを追加できます。(例MI -> MIU

  2. 文字列がで始まる場合、文字列のMMにパートのコピーを追加できます。
    (例MII -> MIIII

  3. 文字列に3つの連続した文字列が含まれている場合、Iそれらをに変更できますU
    (例MIII -> MU

  4. 文字列に2つの連続したが含まれている場合、Uそれらを削除できます。(例MUUU -> MU)。

あなたの仕事は、これが任意の開始文字列と終了文字列に対して実行可能かどうかを判断するプログラムを構築することです。

プログラムは、入力として2つの文字列を受け取ります。各文字列は次で構成されます。

  • 一つM

  • 最大29 IのおよびUの文字列。

プログラムはtrue、2番目の文字列が最初の文字列から到達可能な場合(またはプログラミング言語の表現/ YPLRT)、falseそうでない場合(またはYPLRT)を返します。

入力と出力の例:

MI  MII
true

MI  MU
false

MIIIIU  MI
true

これを行うための任意の言語の最短コードが勝ちです。


8
私は現在、ゲーデル、エッシャー、バッハを読んでおり、その後の章に基づいて「18ホールのゴルフコース」を行うことを考えています。今、新しい「穴1」を見つけなければならないと思います。;)
マーティン・エンダー14

これは単なるグラフ到達可能性の質問であり、その本質は以前に何度も尋ねられてきました。
ピーターテイラー14

1
@PeterTaylor到達可能性グラフの明示的な検索ではこれが解決されない可能性が高いと思います。MIUルールには多くの構造があり、中間ノードを検索せずに到達可能性をテストする直接的なアルゴリズムがあれば驚かないでしょう。たとえば、から到達可能なノードMIM(I|U)*、の数Iが3の倍数ではない場所です。そして、このような直接チェックにより、確実にコードが短くなります。また、中間ステップに必要な文字列の長さに関するアプリオリの境界がわからないため、直接検索は単純に非実用的かもしれません。
xnor 14

1
私はしばらくの間この問題について考えてきましたが、ブルートフォースではないソリューションに近づいていません。誰も噛まない場合は、おそらくMI特定の到達可能な文字列から派生するように、質問の簡単なバージョンを投稿することをお勧めします。
xnor 14

1
IMが提供される場合、出力はどうなりMUMMIますか?
ベータ崩壊14

回答:


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

Prologについてはどうですか(6か月以内に誰も答えていないので)。実行するには、「s(mi、mu)」を使用します。このコードは、アトムを文字に分割し、ソリューションを検索します。


2
これは、誤ってfalseを返しs(mi,miiii)、一般に、証明するためにルール2の複数のアプリケーションを必要とするものすべて。
algorithmshark
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.