최소 보글 형 배열


14

동일한 문자 큐브를 두 번 이상 사용하지 않는 규칙이 무시되는 경우 임의의 큰 Boggle 격자 에 단어를 배열하는 방법을 고려하십시오 . 당신이 (존재하는 모든 문자) 편지 큐브의 무제한을 가지고 또한 가정 및 단지입니다 .QuQ

단어 MISSISSIPPI는 6 개의 큐브 만 사용하여 배열 할 수 있습니다. 가능한 배열은 다음과 같습니다.

 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
이것은 어려운 최적화 문제처럼 들립니다. 나는 그것이 좋은 코드 도전을했을 것이라고 생각합니다.
Martin Ender

1
저 응답 사용자의 보류중인 편집이 있기 때문에 편집 할 수 없지만 미시시피에는 두 개의 더블이 있습니다.
피터 테일러

대소 문자 구분은 어떻습니까?
자랑스런 Haskeller

1
@proudhaskeller 1) 입력이 인쇄 가능한 ASCII 일뿐이므로 2) OP가 달리 언급하지 않았기 때문에 3) 입력이 대소 문자를 구분하지 않으면 오클라호마 예제는 최소가 아닙니다.
Martin Ender

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

네 칸 들여 쓰기는 실제로 탭 문자입니다.

AMANAPLANACANALPANAMA:

MC 
NA 
PL

MISSISSIPPI:

S  
SI 
PPM

Oklahoma!:

oh    
 ma   
 ! l  
    k 
     O

Llanfairpwllgwyngyll치사 )


외모 정말 느린 지금 좋은 : /
칼빈의 취미

1
당신은 제거하여 조금을 단축 할 수 import sys및 교체 sys.argv[1]와 함께 raw_input().
Calvin 's Hobbies

@ Calvin'sHobbies 들으 다시, 깔끔한 팁 : 당신은 단지를 변경할 수 있습니다에서 일찍를 얻으려면 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.