Pour un jeu où l'on aurait besoin de trouver des anagrammes à partir d'un tas de lettres, j'ai fini par implémenter un algorithme de permutation pour trouver tous les anagrammes possibles et les filtrer si nécessaire pour les positions de lettres connues (-match
). Mais pour des mots plus longs, cela s'est avéré très sujet aux erreurs, car écrémer une grande liste de charabia ne révèle pas vraiment les mots appropriés qui étaient cachés à l'intérieur.Powershell, type d'intersection encastrée?
donc je pensais que si j'aurais une grande liste de mots anglais (qui devrait être obtenir quelque part) Je pouvais recouper juste ma liste des permutations avec la liste des mots appropriés et d'obtenir (je l'espère) 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, ce n'est pas si 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 $_ }
Cela marcherait probablement, mais est aussi très lent, je pense (surtout quand $wordlist
est le résultat d'une gc wordlist.txt
). Ou je pourrais 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 également utiliser findstr
avec regex gigantesque ci-dessus, mais cela se sent tout simplement faux.
Y a-t-il des solutions intégrées que je pourrais utiliser et qui sont meilleures que mes tentatives jusqu'ici? Sinon, je mettrais probablement la liste de mots dans une table de hachage et j'utiliserais l'approche itérative -contains
qui devrait être assez rapide.
Ok, ça aurait été à propos de mon approche. Certainement pas joli. (Et certainement pas bien adapté pour une utilisation déballée de la cmdline lui-même). – Joey