代码之家  ›  专栏  ›  技术社区  ›  Joey Gumbo

Powershell,内置的集合交集?

  •  7
  • Joey Gumbo  · 技术社区  · 16 年前

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

    所以我想 我会有一大堆英语单词(应该可以在某个地方找到) 可以

    由于PS中的许多运算符对集合的处理方式不同,我想我可以做这样的事情

    $wordlist -contains $permlist
    

    -contains 对于每个项目:

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

    $wordlist 是a的结果 gc wordlist.txt

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

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

    是否有任何内置的解决方案我可以使用,并且比我迄今为止的尝试更好?否则,我可能会把单词列表放在一个标签表中,并使用迭代 -包含 这种方法应该足够快。

    2 回复  |  直到 16 年前
        1
  •  6
  •   NateJ Richard Berg    8 年前
    $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 )

    警告: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))
    

        2
  •  0
  •   nik    16 年前

    你可以根据标准词典拼写检查单词列表,消除所有拼写错误。

    随着 GNU aspell 软件包已安装,

     cat text.txt | aspell list
    

    会给你一个所有拼写错误单词的列表。
    拼写检查器 .


    anagram generator like this one made for Scrabble players .

    Revolution Word Finder有两个选项;Anagram Finder和拼字游戏求解器。Anagram Finder获取一个字母列表,并返回所有可以使用它们相对于固定单词列表创建的有效字谜。根据以下内容检查每个字谜的有效性 SOWPODS