Algoritmo del gioco di parole

2

Ai tempi di macchine a 8 bit esisteva un gioco di parole educativo. Non ho idea di cosa sia stato effettivamente chiamato ma per il gusto di questa domanda (dato che coinvolge piramidi) chiamiamolo Stones of Giza .

Il gioco era semplice. A partire dal livello superiore, una lettera è stata aggiunta a una singola parola e si è formata un'altra parola. Una lettera è stata quindi aggiunta a quella parola e così via, ogni volta facendo una parola. I livelli sono passati da 3 a 7.

Un esempio di livello 3 potrebbe essere.

  A
 A T
B A T

Letters: AAABTT

Come il gioco degli anni 80 mente> , hai segnato per indovinare una lettera a un livello correttamente ma più per indovinare la posizione correttamente.

Non è difficile vedere che gli unici candidati per la prima pietra sono A, I e O - dal momento che queste sono le uniche parole in un'unica lettera nella lingua inglese.

La mia domanda riguarda gli algoritmi per l'approvvigionamento di schede di gioco. Il mio algoritmo di forza bruta attualmente cerca le parole N di lunghezza con una delle 3 lettere sopra e poi controlla la parola di lunghezza N-1 sul lato sinistro / destro contenente la lettera di pinnacolo (A, I o O ).

Questo mi sembra leggermente inefficiente dal momento che ci saranno molte false ricerche.

Come posso migliorare questo algoritmo non elaborato? Livelli più alti impiegano molto tempo in un dizionario di buone dimensioni.

Naturalmente mi rendo conto che il gioco a 8 bit probabilmente non stava analizzando i dati ogni volta e aveva un certo numero di schede, ma sto solo cercando di ottimizzare la creazione dei dati di origine per curiosità.

EDIT # 1:

Ho già filtrato le parole nel dizionario sorgente che non contengono A, I o O.

    
posta Robbie Dee 04.02.2016 - 23:28
fonte

1 risposta

1

Una possibilità è di (ab) usare mappe e set (o liste).

Hai una mappa con "parola corrente" come chiave e "elenco o insieme di parole successive" come valore.

Quindi puoi popolare la tua mappa usando qualcosa come la seguente:

for word in dictionary:
  for 0 <= position < length(word):
    key = drop_letter(word, position) ## drop_letter("bath", 3) -> bat
    successors[key].append(word)

Ovviamente, questo potrebbe richiedere un po 'più di codice per passare dallo pseudo-codice al codice funzionante.

Quindi hai le tue possibili posizioni di partenza in successors[""] e puoi continuare a scegliere semplicemente un successore da lì. Se il gioco consente una ri-sistemazione arbitraria delle lettere da una riga all'altra (in modo che "bath" sia un successore valido di "tab") ordina la chiave prima di usarla (quindi le chiavi da "bath" sarebbero "aht" , "bht", "abh" e "abt").

La generazione dell'elenco iniziale è ammortizzata O (n * m) per "n parole, di lunghezza max m", la ricerca durante il gioco dovrebbe essere relativamente veloce.

Se lo fai offline e lo memorizzi in un file di dati, potresti anche essere in grado di filtrare i tasti "senza parole", riducendo la quantità di dati necessari nella RAM.

    
risposta data 05.02.2016 - 11:54
fonte

Leggi altre domande sui tag