7

バラバラの文字の束からアナグラムを見つける必要があるいくつかのゲームでは、可能なすべてのアナグラムを見つけて、必要に応じてそれらを既知の文字位置にフィルターする順列アルゴリズムを実装することになりまし-matchた (ちなみに、これは素晴らしいことです)。しかし、意味不明な単語の膨大なリストをざっと読んでも、その中に隠されていた適切な単語が実際には明らかにならないため、長い単語の場合、これは非常にエラーが発生しやすいことがわかりました。

そこで、英語の単語の大きなリスト (どこかで入手できるはずです) があれば、順列のリストと適切な単語のリストを交差させて、(できれば) 順列リストからすべての実際の単語を取得できると考えました。

PS の多くの演算子はコレクションに対して異なる働きをするので、次のようなことができると思いました。

$wordlist -contains $permlist

そして交差点を戻します。残念ながら、それはそれほど簡単ではありません。私が考えた他のオプションは、1つのリストを繰り返し処理し-contains、各項目に対して実行することです:

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

これはおそらく機能しますが、非常に遅いと思います(特に$wordlistが a の結果である場合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))

明らかに、誰かがこの static-generic-reflection がらくたを使いやすいコマンドレットにラップする必要があります! 心配しないで、私はそれに取り組んでいます...

于 2009-07-20T16:46:15.253 に答える
0

単語のリストをスペル チェックし、標準の辞書と照らし合わせてすべてのスペル ミスを排除できます。

GNUaspellパッケージをインストールすると、

 cat text.txt | aspell list

スペルミスのあるすべての単語のリストが表示されます。
で他の辞書を操作できaspellます。


または、スクラブル プレーヤー向けに作られたこのようなアナグラム ジェネレーターをピックアップするだけです。

Revolution Word Finder には 2 つのオプションがあります。アナグラム ファインダーとスクラブル ソルバー。アナグラム ファインダーは、文字のリストを取得し、それらを使用して作成できるすべての有効なアナグラムを、固定された単語のリストに関連付けて返します。各アナグラムは、現在の国際スクラブル トーナメントで使用されている単語リストであるSOWPODS単語リストに対して有効性がチェックされます。

于 2009-07-20T10:25:39.063 に答える