最小限のボッグルのような配置


14

同じ文字キューブを複数回使用しないというルールが無視される場合、任意の大きなBoggleグリッドに単語を配置する方法を検討してください。また、無制限の数の文字キューブ(すべての文字が存在する)があり、ちょうどであると仮定します。QuQ

単語MISSISSIPPIは6個のキューブのみを使用して配置できます。可能な取り決めの1つを次に示します。

 S
MIS
 PP

から始めて、M単語全体が綴られるまで、水平、垂直、または斜めに任意のステップを繰り返し実行します。

驚いたことに、次のような長いフレーズでAMANAPLANACANALPANAMAも必要なキューブは6つだけです。

MAN
PLC

ただし、より長く複雑な文字列に必要なキューブの最小数は必ずしも明らかではありません。

チャレンジ

文字列を取り込んで、最小数のキューブが使用されるように、このBoggleのような方法でそれを配置するプログラムを作成します。(結果のグリッドの寸法と空のセルの数は関係ありません。)

空のグリッドセルとして使用されるため、スペース(16進コード21〜7E)を除く各印刷可能ASCII文字に対して無制限の数のキューブがあると仮定します。印刷可能なASCII文字列(スペースなし)のみが入力されます。

入力は、stdinまたはコマンドラインから取得する必要があります。出力はstdout(または最も近い代替)に送られます。

出力の先頭または末尾の改行とスペースは問題ありません(ただし、異常な量がないことが望ましいです)。

検索スペースは、文字列が長くなるにつれて指数関数的に爆発しますが、アルゴリズムを効率的にしようとする必要はありません(それはいいことですが:))。これはコードゴルフであるため、バイト単位の最短ソリューションが優先されます

入力がOklahoma!(最小8文字)の場合、これらはすべて正確に8つの塗りつぶされたグリッドセルを持ち、(改訂された)Boggle読み取りパターンに従うため、これらはすべて有効な出力になります。

Oklaho
   !m

または

  !
Oamo
klh

または

   lkO   
  !amo              
    h    


4
これは難しい最適化問題のように聞こえます。それは素晴らしいコードの挑戦をしたと思います。
マーティンエンダー14

1
低解像度のユーザーからの保留中の編集があるため編集できませんが、ミシシッピには2つのダブルがあります。
ピーターテイラー14

大文字と小文字の区別はどうですか?
誇りに思ってhaskeller 14

1
@proudhaskeller:入力は大文字と小文字を区別しないので、1)入力は印刷可能なASCIIだけである2)OPは言及していない3)入力が大文字と小文字を区別しない場合、oklahomaの例は最小限ではない
マーティンエンダー14

MartinBüttner@私はあなたが意味を考える場合に敏感
Ypnypn

回答:


5

パイソン342 355 398

R=(-1,0,1)
A=[];b={}
def s(w,x,y):
 if w: # not at the end of the word yet?
  for I in R: # search adjacent squares
   for j in R:
    if I|j: # skip the square we are on
     i=I+x;j+=y;c=b.get((i,j)) # get square in board
     if c==w[0]:s(w[1:],i,j) # square is what we are looking for?
     elif not c:b[i,j]=w[0];s(w[1:],i,j);del b[i,j] # we can set square?
 else:A.append(dict(b)) # all solutions
s(raw_input(),9,9) # run the search
A=min(A,key=len) # A is now the shortest solution
C=sum(map(list,A),[]) # put all board coords together
C=range(min(C),max(C)+1) # find the board biggest square bound
for r in C:print"".join(A.get((c,r)," ") for c in C)

4つのスペースでのインデントは、実際にはタブ文字です。

AMANAPLANACANALPANAMA

MC 
NA 
PL

MISSISSIPPI

S  
SI 
PPM

Oklahoma!

oh    
 ma   
 ! l  
    k 
     O

Llanfairpwllgwyngyllある致死 ;)


今は良さそうに見えますが、本当に遅いです:/
カルビンの趣味14

1
あなたは削除することによって、それを少し短くすることができますimport sysし、交換するsys.argv[1]raw_input()
カルビンの趣味14

Calvin'sHobbiesのTHX再び、きちんとした先端:)早いうちあなただけ変更することができます取得するには、@ elifelif not c and (not A or len(b)<len(A[-1])):、それははるかに高速に実行
ウィル

1
"Oklahoma!"入力がOKの場合、のinput()代わりに使用できますraw_input()
FryAmTheEggman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.