2009-07-20 12 views
6

Para algún juego donde uno necesite encontrar anagramas de un montón de letras sueltas terminé implementando un algoritmo de permutación para encontrar todos los anagramas posibles y filtrarlos si es necesario para las posiciones de letras conocidas (-match es genial, por cierto). Pero para las palabras más largas esto probó ser propenso a errores, ya que robar una gran lista de galimatías no revela realmente las palabras adecuadas que estaban ocultas dentro.Powershell, tipo de intersección de conjunto incorporada?

Así que pensé que si tendría una larga lista de palabras en inglés (debe ser obtenible en algún lugar) me podía simplemente se cruzan mi lista de permutaciones con la lista de palabras adecuadas y obtener (con suerte) todas las palabras reales de la lista de permutación.

Dado que muchos operadores en el trabajo PS diferente con colecciones pensé que yo podría hacer algo como

$wordlist -contains $permlist 

y obtener la intersección de vuelta. Desafortunadamente no es tan fácil. Otras opciones que he pensado sería iterar sobre una lista y hacer un -contains para cada elemento:

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

Esto probablemente funcionaría, pero también es muy lento, creo que (sobre todo cuando $wordlist es el resultado de una gc wordlist.txt) O podría construir una expresión regular gigantesca:

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

Pero eso probablemente tampoco sea muy rápido. También podría usar findstr con la expresión mágica superior, pero eso parece estar mal.

¿Hay alguna solución integrada que pueda usar y que sea mejor que mis intentos hasta ahora? De lo contrario, probablemente pondría la lista de palabras en una tabla hash y usaría el enfoque iterativo -contains que debería ser lo suficientemente rápido.

Respuesta

6
$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) 

(por Préstamos New-HashSet de Josh Einstein)

Advertencia: esos métodos en HashSet son algoritmos en el lugar que modifican la colección original.Si quieres estilo funcional transforman en objetos inmutables, que tendrá que llevar LINQ a la fiesta:

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)) 

Claramente, alguien tiene que terminar con esto porquería genérico-reflejo estático en un cmdlet de usar! No se preocupe, estoy trabajando en ello ...

+0

Ok, eso hubiera sido sobre mi enfoque. Definitivamente no es lindo. (Y definitivamente no es adecuado para usar sin encriptar desde la línea del cm). – Joey

0

Puede revisar la ortografía de su lista de palabras y eliminar todos los errores ortográficos contra un diccionario estándar.

Con el paquete GNU aspell instalado,

cat text.txt | aspell list 

le dará una lista de todas las palabras faltar-deletreados.
Puede trabajar con otros diccionarios con aspell.


O simplemente levante un anagram generator like this one made for Scrabble players.

The Revolution Word Finder tiene dos opciones; un buscador de anagramas y un solucionador de Scrabble. El Buscador de Anagramas toma una lista de letras y devuelve todos los anagramas válidos que pueden crearse usando una relativa a una lista fija de palabras. Cada anagrama se comprueba con respecto a la validez de la lista de palabras SOWPODS, que es la lista de palabras utilizada en los Torneos internacionales actuales de Scrabble.

+0

"Puede revisar la ortografía de su lista de palabras y eliminar todos los errores de ortografía contra un diccionario estándar." Bueno, eso es exactamente lo que estaba intentando. Sin embargo, eso no me dice nada acerca de cómo exactamente lograr esto, dejando de lado mi pregunta al menos parcialmente. – Joey

+0

Lo siento, no quise dar un paso al costado de su punto de revisión ortográfica, he agregado una referencia sobre lo que quise decir. Estaba diciendo que tienes herramientas estándar para que la lista de partidos funcione. – nik

+0

Hmm, a la derecha, aunque no es una solución "Powershell incorporada". Probablemente también podría obligar al corrector ortográfico de Office a funcionar, pero eso probablemente sea más de lo que estaría dispuesto a hacer por eso. Además, darme una lista de palabras mal escritas no me ayudará ya que prefiero una lista de palabras correctamente deletreadas :) (El juego en cuestión es http://www.kongregate.com/games/Morpheme/ blocks-with-letters-on y en algunos niveles me costó incluso encontrar la palabra que necesitaba para construir, por eso me decidí por forzar brutales cada permutación y buscar palabras en la lista resultante. – Joey

Cuestiones relacionadas