2009-07-20 10 views
6

ルーズ文字の束からアナグラムを見つける必要のあるゲームでは、置換アルゴリズムを実装して、すべてのアナグラムを見つけ出し、既知の文字位置(-matchが大丈夫です)に必要なフィルタをフィルタリングしました。しかし、より長い言葉では、これは非常に間違っている傾向があることを証明しました。大量の不気味なリストを隠すことは、その中に隠された適切な言葉を実際には明らかにしません。 Powershell、セット交差点が内蔵されていますか?

は、だから、私は(どこかで入手する必要があります)英語の単語の大規模なリストを持っているでしょう 場合、私は すべて本当の言葉をちょうど適切な単語のリストと順列の私のリストを交差し、(たぶん)を得ることができると考えました置換リストから。

コレクションとは異なるPSの仕事の多くの事業者が、私はちょうど

$wordlist -contains $permlist 

ような何かをして戻って交差点を得ることができると思ったので。残念ながらそれは簡単ではありません。私が考えている他のオプションは、1つのリストを反復することで、各項目について-containsをするでしょう:

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

これはおそらく仕事だろうが、私は考えても非常に遅い($wordlistgc wordlist.txtの結果である場合は特に)。または、私は巨大な正規表現を構築することができます:

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

しかし、それはおそらく非常に高速でもないでしょう。私はおそらくfindstr上記の巨大な正規表現を使用することもできますが、それは間違って感じる。

私が使用できる組み込みソリューションはありますか?これまでの試みより優れていますか?それ以外の場合は、おそらく単語リストをハッシュテーブルに入れて、反復的な-containsのアプローチを使用してください。

答えて

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

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

明らかに、誰かが優しいのコマンドレットには、この静的な汎用反射がらくたをラップする必要があります!心配しないで、私はそれに取り組んでいます...

+0

これは私のアプローチについてのことでした。確かにきれいではありません。 (そして、明らかに、cmdline自体からのラップされていない使用には適していません)。 – Joey

0

あなたの単語のリストをスペルチェックして、標準的な辞書に対してすべてのスペルミスを排除することができます。インストールGNU aspellパッケージに

cat text.txt | aspell list 

はあなたにすべてのミス綴られた単語のリストが表示されます。
aspellで他の辞書で作業することができます。


またはちょうどピックアップanagram generator like this one made for Scrabble playersです。

Revolution Word Finderには2つのオプションがあります。アナグラムファインダ、スクラブルソルバなどがあります。 Anagram Finderは文字のリストを取得し、有効なアナグラムを返します。これらのアナグラムは固定された単語リストを基準に作成できます。各アナグラムは現在のInternational Scrabbleトーナメントで使用されている単語リストであるSOWPODSワードリストに対して有効かどうかがチェックされます。 (Josh Einsteinから新HashSetのを借りて)

+0

"単語のリストをスペルチェックし、標準的な辞書に対するすべてのスペルミスを排除することができます。まあ、それはまさに私が試みていたものです。しかし、それはどのように正確にこれを達成するために、私の質問を少なくとも部分的に回避して何かを教えてくれません。 – Joey

+0

申し訳ありませんが、私はあなたのスペルチェックポイントの段階を踏み出すことを意味しなかった、私が意味したことについての参考文献を追加しました。マッチリストを作成するための標準的なツールがあると言っていました。 – nik

+0

ええ、そうですね、それはあまり「Powershell組み込み」のソリューションではありません。私はおそらくOfficeスペルチェッカーの動作を強制することもできますが、それはおそらく私がそのためにやっていることを超えています。また、私に誤ったスペルの単語のリストを与えても、私は正しいスペルの単語のリストが必要になりますので、私を助けません:)(問題のゲームはhttp://www.kongregate.com/games/Morpheme/です。 block-with-letters-onといくつかのレベルで私は構築する必要があるという言葉を見つけようと苦労したので、すべての順列をブルートフォースし、結果リストの単語を探して解決したのです。 – Joey