Accordi minimali simili a boggle


14

Considera come una parola potrebbe essere disposta su una griglia Boggle arbitrariamente grande se la regola di non usare lo stesso cubo di lettere più di una volta viene ignorata . Supponi anche di avere un numero illimitato di cubetti di lettere (con tutte le lettere presenti) ed Què giusto Q.

La parola MISSISSIPPIpotrebbe essere organizzata usando solo 6 cubi. Ecco una possibile disposizione:

 S
MIS
 PP

A partire dal Mripetiamo ripetutamente qualsiasi passo in senso orizzontale, verticale o diagonale fino a quando l'intera parola non viene scritta.

Sorprendentemente, una frase più lunga come AMANAPLANACANALPANAMArichiede anche solo 6 cubi:

MAN
PLC

Tuttavia, il numero minimo di cubi necessari per stringhe più lunghe e complesse non è sempre evidente.

Sfida

Scrivi un programma che accetta una stringa e la organizza in questo modo simile a Boggle in modo tale che venga utilizzato il numero minimo di cubi . (Le dimensioni della griglia risultante e il numero di celle vuote sono irrilevanti.)

Supponiamo di avere un numero illimitato di cubi per ogni carattere ASCII stampabile ad eccezione dello spazio (codici esadecimali da 21 a 7E), poiché viene utilizzato come cella di griglia vuota. Verranno immesse solo stringhe ASCII stampabili (senza spazi).

L'input deve essere preso da stdin o dalla riga di comando. L'output dovrebbe andare su stdout (o alternativa più vicina).

Le nuove righe e spazi iniziali o finali nell'output vanno bene (ma si spera che non ci sia una quantità eccessiva).

Lo spazio di ricerca esplode esponenzialmente man mano che la stringa si allunga, ma non è necessario tentare di rendere efficiente l'algoritmo (anche se sarebbe bello :)). Questo è code-golf, quindi vince la soluzione più breve in byte .

Esempio

Se l'input fosse Oklahoma!(minimo 8 caratteri), questi sarebbero tutti output validi perché tutti hanno esattamente 8 celle della griglia riempite e seguono il modello di lettura Boggle (rivisto):

Oklaho
   !m

o

  !
Oamo
klh

o

   lkO   
  !amo              
    h    

eccetera.


4
Sembra un grosso problema di ottimizzazione. Penso che avrebbe fatto una bella sfida al codice.
Martin Ender,

1
Non riesco a modificare perché c'è una modifica in sospeso da un utente a bassa reputazione, ma il Mississippi ha due doppi.
Peter Taylor,

Che dire della distinzione tra maiuscole e minuscole?
orgoglioso haskeller il

1
@proudhaskeller Sono sicuro che l'input non fa distinzione tra maiuscole e minuscole, perché: 1) l'input è qualsiasi ASCII stampabile 2) l'OP non ha menzionato altrimenti 3) L'esempio di oklahoma non sarebbe minimo se l'input fosse insensibile al maiuscolo / minuscolo.
Martin Ender,

@ MartinBüttner Penso che intendevi la distinzione tra maiuscole
Ypnypn,

Risposte:


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)

Il rientro in quattro spazi è in realtà un carattere di tabulazione.

AMANAPLANACANALPANAMA:

MC 
NA 
PL

MISSISSIPPI:

S  
SI 
PPM

Oklahoma!:

oh    
 ma   
 ! l  
    k 
     O

Llanfairpwllgwyngyllè letale ;)


Sembra buono ora, solo molto lento: /
Calvin's Hobbies

1
Puoi accorciarlo un po 'rimuovendolo import syse sostituendolo sys.argv[1]con raw_input().
Calvin's Hobbies,

@ Calvin'sHobbies thx di nuovo, suggerimento accurato :) Per iniziare presto puoi semplicemente cambiarlo elifin elif not c and (not A or len(b)<len(A[-1])):e funziona molto più velocemente
Will

1
se "Oklahoma!"è OK, puoi semplicemente usare input()invece di raw_input().
FryAmTheEggman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.