Trovare le parole ambigue più lunghe con un determinato set di lettere

1

Da un po 'di tempo gioco l'impiccato con il mio amico per un'app, e abbiamo una comprensione da gentiluomini tra noi che stiamo entrambi "barando" usando il software online sia per risolvere la parola data (parole di ricerca con una determinata lunghezza , filtra le parole con lettere in posizioni note) e forma nuove parole con il set casuale di lettere che ti viene dato.

Gli algoritmi funzionano la maggior parte del tempo. A entrambi viene assegnato un numero variabile di tentativi errati prima di perdere una vita. L'unico problema si presenta con parole "ambigue", cioè ci sono meno ipotesi errate rimaste del necessario per restringere la ricerca a una parola. Ad esempio, con una possibilità rimasta,

_are

potrebbe essere sia "nuda" sia "cura" con uguale probabilità (insieme ad almeno altre 8 parole). Voglio trovare parole che abbiano un'ambiguità di almeno 1.

La mia domanda è: come andrei sulla progettazione di un algoritmo che, dato un certo insieme di lettere, forma una parola con una lunghezza minima 4 che è al massimo ambigua?

    
posta Luke Salamone 21.05.2016 - 08:06
fonte

1 risposta

1

Ci sono alcune sottigliezze in questa domanda che non sono state ancora chiarite.

Tuttavia, ho un prototipo funzionante che sembra approssimare ciò che l'OP sta chiedendo.

Prima di descrivere il mio approccio, ecco un caso di test.

Per questo test case, l'elenco di parole è ottenuto da: link
(Dichiarazione di non responsabilità: i risultati dei motori di ricerca potrebbero contenere collegamenti a materiali protetti da copyright.)

Vengono applicati i seguenti criteri di filtro:

  • Lunghezza almeno 4
  • Tutte le lettere (nessuno spazio, trattino, apostrofi)
  • Tutto in minuscolo (per saltare le inizializzazioni)

Quindi, a ogni parola univoca viene assegnato un numero intero, a partire da zero.

Per ogni parola, ne viene generata una piccola lista di modelli, sostituendo ogni volta un personaggio con un segnaposto. Ad esempio, dalla parola care verrà generato un elenco di 4 pattern:

?are
c?re
ca?e
car?

Ogni modello viene quindi utilizzato per cercare nuovamente l'elenco di parole. I colpi unici sono contati. Sottraendo uno da questo numero si ottiene il numero di amici per questa parola.

Ci sono altri aspetti che sono semplicemente ottimizzazioni delle prestazioni. Poiché l'ottimizzazione è principalmente un gusto personale, salterò i dettagli a meno che non ci sia un consenso sul fatto che dovrei includerli con la mia risposta.

Ho anche il codice sorgente C #, ma non so se dovrei pubblicarlo qui o meno, a meno che non ci sia un consenso.

Tra le classi C #, ne menzionerei due per la loro particolare utilità:

  • Uno è una mappa bidirezionale tra una stringa e un valore intero assegnato sequenzialmente (che inizia con zero). In sostanza un List<string> più un Dictionary<string, int> più una logica.
  • Un'altra è una multi-mappa bidirezionale tra due serie di numeri interi da spazi dei nomi separati (Nota) . Questo è usato per memorizzare tuple di (wordIndex, patternIndex) e consentire la ricerca usando uno dei due.

(Nota) dite, Tuple.Item1 significa indice di parole, Tuple.Item2 significa indice di pattern e dove la coincidenza di un indice di parole uguale a un indice di pattern è completamente irrilevante. (Ti prego, aiutami a migliorare questa descrizione.)

Primo caso di test: care dovrebbe restituire 22 corrispondenze, a sua volta incluse (quindi 21 amici veri)

care : 22
bare
cafe
cage
cake
came
cane
cape
card
care
carp
cart
case
cave
core
cure
dare
fare
hare
mare
pare
rare
ware

Secondo test case: butter dovrebbe restituire 10 corrispondenze, incluse di per sé (quindi 9 amici veri)

butter : 10
batter
better
bitter
buster
butler
butter
cutter
gutter
mutter
putter
    
risposta data 21.05.2016 - 11:03
fonte

Leggi altre domande sui tag