Domanda

Per qualche gioco in cui si avrebbe bisogno di trovare anagrammi da un mucchio di lettere sciolte ho finito per l'attuazione di un algoritmo di permutazione per trovare tutte le possibili anagrammi e filtrare quelli, se necessario, per le posizioni lettera noti (-match è grande, tra l'altro). Ma le parole più lunghe questo si è rivelato molto soggetto a errori, come scrematura un ampio elenco di parole senza senso in realtà non rivelare le parole appropriate che erano nascoste all'interno.

Così ho pensato che se avrei un ampio elenco di parole inglesi (dovrebbe essere ottenibile da qualche parte) I potrebbero solo intersecano mia lista di permutazioni con l'elenco di una corretta parole e ottenere (si spera) tutte le parole reali dalla lista permutazione.

Dal momento che molti operatori nel lavoro PS in modo diverso con le collezioni ho pensato ho potuto solo fare qualcosa di simile

$wordlist -contains $permlist

e ottenere l'intersezione indietro. Purtroppo non è così facile. Altre opzioni che ho pensato sarebbe quello di iterare una lista e fare un -contains per ogni voce:

$permlist | ? { $wordlist -contains $_ }

Questo probabilmente avrebbe funzionato, ma è anche molto lento, penso che (soprattutto quando $wordlist è il risultato di un gc wordlist.txt). Oppure avrei potuto costruire un'espressione regolare gigantesca:

$wordlist -matches (($permlist | %{ "^$_`$" }) -join "|")

Ma questo non sarebbe probabilmente essere molto veloce sia. Potrei forse anche usare findstr con sopra regex gigantesco, ma che si sente solo sbagliato.

Ci sono soluzioni integrate ho potuto usare e che sono meglio di miei tentativi finora? In caso contrario, probabilmente sarei messo l'elenco di parole in una tabella hash e usare l'approccio iterativo -contains che dovrebbe essere abbastanza veloce quindi.

È stato utile?

Soluzione

$left = New-HashSet string
$left.Add("foo")
$left.Add("bar")
$right = New-HashSet string
$right.Add("bar")
$right.Add("baz")

$left.IntersectWith($right)
$left.UnionWith($right)

(prendendo in prestito New-HashSet da Josh Einstein )

Attenzione: questi metodi su HashSet sono algoritmi in-place che modificano la collezione originale. Se si desidera che funzionale stile di trasformazione su oggetti immutabili, avrete bisogno di portare LINQ al partito:

add-type system.core

$asqueryable = [system.linq.queryable].getmethods() | ? { $_.name -eq "AsQueryable" } | select -first 1
$asqueryable = $asqueryable.MakeGenericMethod([string])
$leftAsQueryable = $asqueryable.Invoke($null, (,$left))

$intersect = [system.linq.queryable].getmethods() | ? { $_.name -eq "Intersect" } | select -first 1
$intersect = $intersect.MakeGenericMethod([string])
$result = $intersect.Invoke($null, ($leftAsQueryable, $right))

Chiaramente, qualcuno ha bisogno di avvolgere questo statico-generic-riflesso merda in un cmdlet amichevole! Non ti preoccupare, sto lavorando su di esso ...

Altri suggerimenti

Si potrebbe controllo ortografico tua lista di parole e di eliminare tutti gli errori di ortografia nei confronti di un dizionario standard.

Con il pacchetto GNU aspell installato ,

 cat text.txt | aspell list

vi darà un elenco di tutte le parole miss-farro.
È possibile lavorare con altri dizionari con aspell.


O solo ritiro di una generatore di anagrammi come questo fatto per i giocatori di Scrabble .

  

La rivoluzione Word Finder ha due opzioni; un anagramma Finder e uno Scrabble Risolutore. L'Anagram Finder prende una lista di lettere e restituisce tutti i anagrammi validi che possono essere creati utilizzando loro rispetto ad un elenco fisso di parole. Ogni anagramma è controllato per la validità contro il SOWPODS elenco di parole che è la parola usata in lista corrente internazionale Scrabble tornei.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top