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