5

ruby 1.9.3 で、任意の文字セットからn個の文字を含むすべての単語を検索するプログラムを作成しようとしています。たとえば、文字 [ b、a、h、s、v、i、e、y、k、s、a ] と n = 5 が与えられた場合、次のことができる 5 文字の単語をすべて見つける必要があります。それらの文字のみを使用して作成されます。http://wordlist.sourceforge.net/の 2of4brif.txt 単語リストを使用して(英国の単語とスペルも含めるため)、次のコードを試しました。

a = %w[b a h s v i e y k s a]
a.permutation(5).map(&:join).each do |x|
  File.open('2of4brif.txt').each_line do |line|
    puts line if line.match(/^[#{x}]+$/)
  end
end

これは何もしません (フリーズしたかのように、エラー メッセージも出力もありません)。また、次のスレッドに基づいてバリエーションを試みました。

ファイル内の文字列を検索する最良の方法は何ですか?

Rubyはファイル内の文字列を見つけて結果を出力します

Rubyを使用してテキストファイルで正確に一致する文字列を検索するには?

正規表現に一致するテキスト ファイル内の行を検索する

ファイル内のコンテンツを正規表現と一致させますか?

ファイルを開いて単語を検索する方法

私が試したすべてのバリエーションは、次のいずれかになりました。

1) 凍結;

2) 5 文字の順列を含むリストからすべての単語を出力します (これが実行されていると思います。何千もの出力された単語をすべて確認したわけではありません)。また

3) リスト内の単語内で見つかったすべての 5 文字の順列を出力します (繰り返しますが、それが実行されていると思います)。

繰り返しますが、私は5 文字の順列を含む単語を探しているのではなく、それ自体が完全な単語である 5 文字の順列を探しているので、テキスト ファイルの行は、順列との完全一致。

私は何を間違っていますか?前もって感謝します!

4

4 に答える 4

2

ここでは実際には正規表現を使用していません。指摘されているように、単一の順列ごとにファイルを再度開いているだけでなく、プログラムは非常に非効率的です(55kあります!)。でも何よりもあなたがしたいのは

/^[bahsvieyksa]{5}$/

ファイルの各行に対して。

したがって、私は提案します:

File.open('2of4brif.txt').each_line do |line|
  puts line if line.match(/^[bahsvieyksa]{5}$/)
end

はるかに効率的な代替手段として

于 2013-02-20T14:47:12.553 に答える
1

これは、そのページのenglish.0ファイルを使用して機能します(申し訳ありませんが、あなたが言及した特定のファイルが見つかりませんでした):

a = %w[b a h s v i e y k s a l d n]
dict = {}
a.permutation(5).each do |p|
  dict[p.join('')] = true
end

File.open('english.0').each_line do |line|
  line.chomp!.downcase!
  puts line if dict[line]
end

構造は非常に明確なはずです-順列の辞書を1つの巨大なハッシュで事前に構築し(入力サイズによってはこれを再検討する必要があるかもしれませんが、最近はメモリが安価です)、入力が「 1 行に 1 語」を使用して、単純にそのハッシュにキーを入力します。

また、私のバージョンでは、ファイルを一度だけ読んだことに注意してください。あなたのものでは、順列ごとに 1 回ファイルをスキャンし、何千もの順列があります。

于 2013-02-20T14:50:26.177 に答える
0

私にとっては、次のことがうまくいきました

File.open('file.txt').each_line do |line|
  puts line if line[/<regexp>/]
end
于 2017-03-15T21:14:49.813 に答える
0

より簡単なのは、各文字の出現回数を数えて比較することです。

a = %w[b a h s v i e y k s a l d n]
File.read('2of4brif.txt').split("\n").each do |line|
  puts line if line.size == 5 && line.chars.all?{|x| line.count(x) <= a.count(x)}
end
于 2013-02-21T00:05:16.677 に答える