Question

Pour un jeu où l'on aurait besoin de trouver des anagrammes à partir d'un tas de lettres en vrac, je fini par mettre en œuvre un algorithme de permutation pour trouver tous les anagrammes possibles et filtrer les si nécessaire pour les postes de lettres connues (-match est grand, par la voie). Mais pour les mots plus cela a prouvé très sujette aux erreurs, comme l'écrémage une grande liste de charabia ne révèle pas vraiment les mots appropriés qui ont été cachés dans.

Je pensais que si J'aurais une grande liste de mots anglais (qui devrait être obtenir quelque part) I pourrait juste recouper ma liste de permutations avec la liste des bonne mots et obtenir (espérons-le) tous les mots de la liste de permutation.

Depuis de nombreux opérateurs dans le travail de PS différemment avec des collections je pensais que je pouvais faire quelque chose comme

$wordlist -contains $permlist

et obtenir l'intersection arrière. Malheureusement, il est pas facile. D'autres options que j'ai pensé seraient à itérer sur une liste et faire une -contains pour chaque élément:

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

Ce ne fonctionnerait probablement, mais est aussi très lent, je pense (surtout quand $wordlist est le résultat d'un gc wordlist.txt). Ou je pouvais construire une expression régulière gigantesque:

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

Mais ce ne serait probablement pas très rapide non plus. Je pourrais peut-être utiliser aussi findstr avec regex gigantesque au-dessus, mais qui se sent juste mal.

Y a-t-il des solutions intégrées que je pourrais utiliser et qui sont mieux que mes tentatives à ce jour? Sinon, je serais probablement mis la liste de mots dans une table de hachage et utilise l'approche itérative -contains qui devrait être assez rapide alors.

Était-ce utile?

La solution

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

(empruntant New-HashSet de Josh Einstein )

Attention: ces méthodes sur les algorithmes HashSet sont en place qui modifient la collection originale. Si vous voulez transformer style fonctionnel sur des objets immuables, vous devrez apporter LINQ à la partie:

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

Il est clair que quelqu'un a besoin d'envelopper cette merde réflexion statique générique dans une applet de commande convivial! Ne vous inquiétez pas, je travaille ...

Autres conseils

Vous pouvez vérifier l'orthographe de votre liste de mots et d'éliminer toutes les fautes d'orthographe sur un dictionnaire standard.

Avec le paquet GNU aspell installé ,

 cat text.txt | aspell list

vous donnera une liste de tous les mots épeautre miss.
Vous pouvez travailler avec d'autres dictionnaires avec aspell.


Ou pick-up juste un générateur de comme celui-ci fait pour les joueurs de Scrabble .

  

La Parole Revolution Finder a deux options; un Anagram Finder et un Scrabble Solver. Le Anagram Finder prend une liste de lettres et renvoie tous les anagrammes valides qui peuvent être créés en les utilisant par rapport à une liste fixe de mots. Chaque anagram est vérifié pour opposabilité la liste de mots SOWPODS qui est la liste de mots utilisés dans internationaux en cours Scrabble Tournois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top