MU bulmaca çözücü oluşturun


16

MU bulmaca Eğer açabilirsiniz olup olmadığını öğrenmek olduğu bir bulmaca MIhaline MUverilen aşağıdaki işlemleri:

  1. Dizeniz bitiyorsa sonuna sonuna Ibir ekleyebilirsiniz U. (ör. MI -> MIU)

  2. Dizeniz ile başlıyorsa, dizenin Markasına parçanın bir kopyasını ekleyebilirsiniz M.
    (ör. MII -> MIIII)

  3. Dizeniz art arda üç tane içeriyorsa I, bunları bir U.
    (ör. MIII -> MU)

  4. Dizeniz art arda iki tane içeriyorsa Ubunları silebilirsiniz. (örneğin MUUU -> MU).

Göreviniz, bunun herhangi bir başlangıç ​​ve bitiş dizesi için geçerli olup olmadığını belirleyen bir program oluşturmaktır.

Programınız girdi olarak iki dize alacaktır. Her dize aşağıdakilerden oluşur:

  • bir M.

  • en fazla yirmi dokuz Is ve Us.

trueİkinci dizeye ilk dizeden erişilebilirse programınız geri döner (veya programlama dilinizin temsili / YPLRT) ve değilse false(veya YPLRT).

Örnek giriş ve çıkışlar:

MI  MII
true

MI  MU
false

MIIIIU  MI
true

Bunu yapmak için herhangi bir dilde en kısa kod kazanır.


8
Şu anda Gödel, Escher, Bach okuyorum ve daha sonra bölümlerine dayanarak "18 delikli bir golf sahası" yapmayı düşündüm. Sanırım şimdi yeni bir "delik 1" bulmalıyım. ;)
Martin Ender

Bu sadece özü daha önce birçok kez sorulmuş bir grafik erişilebilirlik sorusudur.
Peter Taylor

1
@PeterTaylor Bence bu, erişilebilirlik grafiğinin açık bir aramasıyla çözülmeyecek iyi bir şans var. MIU kuralları çok fazla yapıya sahiptir ve ara düğümleri aramadan erişilebilirliği test etmek için doğrudan bir algoritma varsa şaşırmam. Örneğin, erişilebilir düğümleri MItam olarak M(I|U)*sayısı nerede I3'ün katı değil Ve böyle bir direkt onay mutlaka kısa kodu için yapar. Ayrıca, ara adımlar için gerekli dizelerin uzunluklarına bağlı bir a priori bilmiyorum, bu yüzden doğrudan arama sadece pratik olmayabilir.
xnor

1
Bu sorunu bir süredir düşündüm ve kaba kuvvet olmayan bir çözüme yaklaşmadım. Kimse ısırmazsa, sorunun daha kolay bir versiyonunu göndermenizi öneririm, belki de MIbelirli bir ulaşılabilir dizeden başlayarak bir türetme ver .
xnor

1
IMVerilmişse çıkış ne olmalı veya MUMMI?
Beta Çürüğü

Yanıtlar:


7

SWI Prolog, 183 karakter

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

Bazı Prologlara ne dersin, (kimse 6 ay içinde cevap vermediğinden). Çalıştırmak için sadece "s (mi, mu)" kullanın. Kod atomları karakterlere ayırır, sonra çözümü arar.


2
Bu yanlış olarak yanlış döndürür s(mi,miiii)ve genel olarak kanıtlamak için birden fazla kural 2 uygulaması gerektiren her şey.
algorithmmshark
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.