Minimal Boggle Benzeri Düzenlemeler


14

Aynı harf küpünü birden fazla kullanmama kuralı göz ardı edilirse, bir kelimenin keyfi olarak büyük Boggle ızgarasında nasıl düzenlenebileceğini düşünün . Ayrıca sınırsız sayıda harf küpünüz olduğunu (tüm harflerin mevcut olduğu) ve sadece olduğunu varsayalım .QuQ

Kelime MISSISSIPPIsadece 6 küp kullanılarak düzenlenebilir. İşte olası bir düzenleme:

 S
MIS
 PP

MBiz başlayarak tüm kelime yazılana kadar yatay, dikey veya çapraz olarak herhangi bir adımı tekrar tekrar atıyoruz.

Şaşırtıcı bir şekilde, daha uzun bir deyimin AMANAPLANACANALPANAMAde sadece 6 küpe ihtiyacı var:

MAN
PLC

Bununla birlikte, daha uzun, daha karmaşık dizeler için gereken minimum küp sayısı her zaman açık değildir.

Meydan okuma

Bir dizeyi alan ve bu Boggle benzeri bir şekilde minimum sayıda küp kullanılacak şekilde düzenleyen bir program yazın . (Ortaya çıkan ızgaranın boyutları ve boş hücre sayısı önemsizdir.)

Boş bir ızgara hücresi olarak kullanıldığından, boşluk ( her biri 21 - 7E altıgen kodları) dışında yazdırılabilir her ASCII karakteri için sınırsız sayıda küpünüz olduğunu varsayın . Yalnızca yazdırılabilir ASCII dizeleri (boşluklar olmadan) girilir.

Giriş stdin'den veya komut satırından alınmalıdır. Çıktı stdout'a (veya en yakın alternatife) gitmelidir.

Çıktıda satırbaşları veya sondaki satır satırları ve boşluklar iyi (ancak umarım aşırı bir miktar yoktur).

Dize uzadıkça arama alanı katlanarak patlar, ancak algoritmanızı verimli hale getirmeye çalışmanız gerekmez (bu hoş olurdu). Bu yüzden en kısa çözüm kod golf, olduğu bayt içinde kazanır.

Misal

Giriş Oklahoma!(minimum 8 karakter) olsaydı, bunların hepsi tam olarak 8 doldurulmuş ızgara hücresine sahip oldukları ve (revize edilmiş) Boggle okuma modelini izledikleri için geçerli çıktılar olurdu:

Oklaho
   !m

veya

  !
Oamo
klh

veya

   lkO   
  !amo              
    h    

vb.


4
Bu zor bir optimizasyon problemi gibi geliyor. Ben güzel bir kod meydan okuma olurdu düşünüyorum.
Martin Ender

1
Düzenleme yapamıyorum çünkü düşük rep kullanıcılı bir beklemede düzenleme var, ancak Mississippi'de iki çift s var.
Peter Taylor

Vaka duyarlılığı ne olacak?
proud haskeller

1
@proudhaskeller Eminim giriş büyük / küçük harfe duyarsızdır, çünkü: 1) giriş sadece herhangi bir yazdırılabilir ASCII'dir 2) OP aksi belirtilmedikçe 3) Giriş büyük / küçük harfe duyarlı değilse, oklahoma örneği minimum olmaz.
Martin Ender

@ MartinBüttner Sanırım büyük / küçük harfe duyarlı
istediniz

Yanıtlar:


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)

Dört boşluğa girinti aslında bir sekme karakteri.

AMANAPLANACANALPANAMA:

MC 
NA 
PL

MISSISSIPPI:

S  
SI 
PPM

Oklahoma!:

oh    
 ma   
 ! l  
    k 
     O

Llanfairpwllgwyngyllolduğu öldürücü ;)


Şimdi iyi görünüyor, sadece gerçekten yavaş: /
Calvin'in Hobileri

1
Sen kaldırarak biraz kısaltın olabilir import sysve değiştirilmesi sys.argv[1]ile raw_input().
Calvin'in Hobileri

@ Calvin'sHobbies thx yine düzgün ucu :) sadece değiştirebilir dışarı erken bir elde etmek elifiçin elif not c and (not A or len(b)<len(A[-1])):ve çok daha hızlı çalışır
Will

1
"Oklahoma!"Tamam girdiyse , input()yerine kullanabilirsiniz raw_input().
FryAmTheEggman
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.