7

对于一些需要从一堆松散字母中找到字谜的游戏,我最终实施了一种置换算法来找到所有可能的字谜,并在需要时过滤已知字母位置的字谜(-match顺便说一句,这很棒)。但是对于较长的单词,这被证明非常容易出错,因为浏览大量乱码并不能真正揭示隐藏在其中的正确单词。

所以我想,如果我有一个大的英语单词列表(应该可以在某个地方获得),我可以将我的排列列表与正确的单词列表相交,并(希望)从排列列表中获取所有真实的单词。

由于 PS 中的许多运算符对集合的工作方式不同,我想我可以做类似的事情

$wordlist -contains $permlist

并让路口回来。不幸的是,这并不容易。我想到的其他选项是遍历一个列表并-contains为每个项目执行一个:

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

我认为这可能会起作用,但也很慢(尤其是当$wordlista 的结果时gc wordlist.txt)。或者我可以构建一个巨大的正则表达式:

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

但这也可能不会很快。我也许也可以使用findstr上述巨大的正则表达式,但这感觉是错误的。

有没有我可以使用的内置解决方案,并且比我迄今为止的尝试更好?否则,我可能会将单词列表放入哈希表并使用迭代-contains方法,这种方法应该足够快。

4

2 回答 2

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

(借用Josh Einstein的 New-HashSet )

警告:HashSet 上的那些方法是修改原始集合的就地算法。如果您想对不可变对象进行函数式转换,则需要将 LINQ 带入聚会:

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

显然,有人需要将这种静态通用反射废话包装到一个友好的 cmdlet 中!别担心,我正在努力...

于 2009-07-20T16:46:15.253 回答
0

您可以对您的单词列表进行拼写检查,并根据标准字典消除所有拼写错误。

安装GNUaspell软件包后,

 cat text.txt | aspell list

会给你一个所有拼写错误的单词的列表。
您可以使用aspell.


或者只是拿起一个像这样为拼字游戏玩家制作的字谜生成器

革命词查找器有两个选项;一个字谜查找器和一个拼字游戏求解器。Anagram Finder 获取一个字母列表并返回所有可以使用它们相对于固定单词列表创建的有效字谜。每个字谜都会根据SOWPODS单词列表检查其有效性,该单词列表是当前国际拼字游戏比赛中使用的单词列表。

于 2009-07-20T10:25:39.063 回答