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

结构应该非常清晰 - 我在一个巨大的哈希中预先构建了排列字典(您可能需要根据输入大小重新访问它,但现在内存很便宜),然后我使用了输入是“每行一个单词”来简单地键入该哈希。

另请注意,在我的版本中,我只通读了一次文件。在您的文件中,您按排列扫描文件一次,并且有数千种排列。

于 2013-02-20T14:50:26.177 回答
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 回答
0

对我来说,以下工作

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