Мінімальні домовленості, що нагадують богль


14

Поміркуйте, як слово могло бути впорядковане на довільно великій сітці Boggle, якщо правило про використання одного і того ж кубика літер не один раз ігнорується . Також припустимо, що у вас є необмежена кількість кубиків букв (з усіма літерами), і Quце просто Q.

Слово MISSISSIPPIможна було впорядкувати, використовуючи лише 6 кубів. Ось одна з можливих домовленостей:

 S
MIS
 PP

Починаючи з Mми, ми неодноразово робимо будь-який крок по горизонталі, вертикалі чи по діагоналі, поки все слово не прописано.

Дивно, але на більш довгу фразу, як AMANAPLANACANALPANAMAі, потрібно лише 6 кубів:

MAN
PLC

Однак мінімальна кількість кубів, необхідних для довших, складніших рядків, не завжди очевидна.

Виклик

Напишіть програму, яка займає рядок, і упорядкуйте її таким чином, як Боггл , щоб використовувати мінімальну кількість кубів . (Розміри отриманої сітки та кількість порожніх комірок не мають значення.)

Припустимо, у вас є необмежена кількість кубів для кожного символу ASCII для друку, за винятком простору (шістнадцяткові коди від 21 до 7E), оскільки він використовується як порожня комірка сітки. Будуть введені лише рядки ASCII для друку (без пробілів).

Введення слід брати з stdin або командного рядка. Вихід повинен перейти до stdout (або найближчої альтернативи).

Провідні або остаточні рядки та пробіли у висновку є нормальними (але, сподіваємось, їх немає непомірною кількістю).

Простір пошуку вибухає експоненціально, коли рядок стає довше, але вам не потрібно намагатися зробити свій алгоритм ефективним (хоча це було б непогано :)). Це код-гольф, тому найкоротше рішення в байтах виграє.

Приклад

Якби введення було Oklahoma!(мінімум 8 символів), усі вони були б дійсними виводами, оскільки всі мають точно 8 заповнених комірок сітки і вони відповідають (переглянутому) шаблону читання Boggle:

Oklaho
   !m

або

  !
Oamo
klh

або

   lkO   
  !amo              
    h    

тощо.


4
Це звучить як жорстка проблема оптимізації. Я думаю, що це зробило б хороший виклик коду.
Мартін Ендер

1
Я не можу редагувати, тому що існує очікувана редакція від користувача з низькою кількістю представників, але у Міссісіпі є два подвійних.
Пітер Тейлор

Що щодо чутливості до справ?
гордий haskeller

1
@proudhaskeller Я впевнений, що вхід нечутливий до регістру, тому що: 1) вхід - це просто будь-який друкований ASCII 2) ОП не згадував інакше 3) Приклад oklahoma не був би мінімальним, якби вхід був нечутливим до регістру.
Мартін Ендер

@ 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'sHobbies thx знову, акуратний наконечник :) Щоб отримати ранній вихід, ви можете просто змінити elifна, elif not c and (not A or len(b)<len(A[-1])):і він працює набагато швидше
буде

1
якщо "Oklahoma!"все в порядку, ви можете просто використовуватиinput() замість raw_input().
FryAmTheEggman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.