最小的类似Boggle的安排


14

如果忽略关于不多次使用同一字母多维数据集的规则,请考虑如何将单词排列在任意大的Boggle网格上。还要假设您有无限数量的字母立方体(所有字母都存在),并且是。QuQ

MISSISSIPPI可以仅使用6个立方体来排列单词。这是一种可能的安排:

 S
MIS
 PP

从开始,M我们反复在水平,垂直或对角线上采取任何步骤,直到拼出整个单词。

令人惊讶的是,更长的短语AMANAPLANACANALPANAMA也只需要6个立方体:

MAN
PLC

但是,较长,更复杂的字符串所需的最小多维数据集并不总是很明显。

挑战

编写一个程序,该程序接受一个字符串,并以类似于Boggle的方式对其进行排列,以便使用最少的多维数据集。(生成的网格的尺寸和空单元格的数量无关。)

假设除了空格(十六进制代码21至7E)之外,每个可打印ASCII字符都具有无限数量的多维数据集,因为它用作空网格单元。仅输入可打印的ASCII字符串(无空格)。

输入应从标准输入或命令行中获取。输出应转到stdout(或最接近的备用输出)。

输出中的前导或尾随换行符和空格都可以(但希望没有多余的数量)。

当字符串变长时,搜索空间将呈指数级增长,但是您无需尝试提高算法的效率(尽管那会很不错:))。这是代码高尔夫球,因此以字节为单位的最短解决方案为准。

如果输入是Oklahoma!(最少8个字符),则它们都是有效的输出,因为它们都具有正好8个填充的网格单元,并且它们遵循(修订)的Boggle读取模式:

Oklaho
   !m

要么

  !
Oamo
klh

要么

   lkO   
  !amo              
    h    

等等


4
这听起来像一个艰难的优化问题。我认为这将是一个不错的代码挑战。
马丁·恩德2014年

1
我无法编辑,因为低重复用户正在等待编辑,但是密西西比州有两个double-s。
彼得·泰勒

区分大小写怎么办?
自豪的haskeller 2014年

1
@proudhaskeller我确定输入不区分大小写,因为:1)输入只是任何可打印的ASCII 2)OP否则未提及3)如果输入不区分大小写,俄克拉荷马州的例子就不会太少。
Martin Ender 2014年

@MartinBüttner我认为您的意思是区分大小写
Ypnypn

Answers:


5

Python的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)

缩进四个空格实际上是一个制表符。

AMANAPLANACANALPANAMA

MC 
NA 
PL

MISSISSIPPI

S  
SI 
PPM

Oklahoma!

oh    
 ma   
 ! l  
    k 
     O

Llanfairpwllgwyngyll致命的 ;)


现在看起来不错,真的很慢:/
卡尔文的爱好2014年

1
您可以通过删除import sys并替换sys.argv[1]为来将其缩短一点raw_input()
卡尔文的爱好2014年

@ Calvin'sHobbies THX再次,整齐的尖:)要早点出来你可以改变的elif,以elif not c and (not A or len(b)<len(A[-1])):和它运行快了很多
威尔

1
如果"Oklahoma!"输入正确,则可以使用input()代替raw_input()
FryAmTheEggman 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.