Ruby 排列

Ruby permutations

简单来说,我想输入一个字母,输出一个设定长度范围内所有可能的组合。 例如: 长度范围 1 - 2 输入 a, b, c ... 输出 a, b, c, aa, ab, ac, bb, ba, bc, cc, ca, cb

我正在尝试制作一个 anagram/spell 检查求解器,以便我可以 'automate' 纽约时报的拼字比赛。因此,我想将给定的字母输入到我的程序中,获取特定长度的所有可能组合的数组(它们的最小字长为 4),然后根据所有英文单词的数组检查该数组。我到目前为止是:

letters = ["m","o","r"]
words = []

# Puts all the words into an array
File.open('en_words.txt') do |word|
   word.each_line.each do |line|
      words << line.strip
   end
end

class String
  def permutation(&block)
    arr = split(//)
    arr.permutation { |i| yield i.join }
  end
end

letters.join.permutation do |i|
  p "#{i}" if words.include?(i)
end

=>"mor"
=>"rom"

上面代码的问题是它停止了 s 是我给它的字母数。例如,它不会重复 return “room”或“moor”。所以,我想做的是获得更完整的组合列表,然后对照我的单词列表检查它们。

感谢您的帮助。

走另一条路怎么样?检查每个单词以确保它只使用允许的字母? 我用 3000 个最常用的单词尝试了这个,效果很快。

words = [..]
letters = [ "m", "o", "r" ]
words.each do |word|
  all_letters_valid = true
  word.chars.each do |char|
    unless letters.include?(char)
      all_letters_valid = false
      break
    end
  end
  if all_letters_valid
    puts word
  end
end

如果字母可以重复,则排列的数量不是有限的,因此该方法没有意义。

假设:仅英文 ascii 字符

如果目标不是为了教育目的重新编码组合:

在 ruby 标准库中,数组 class 有一个 combination 方法。

这里有一个例子:

letters = ["m","o","r"]

letters.combination(2).to_a
#  => [["m", "o"], ["m", "r"], ["o", "r"]]

你还有神奇的排列法:


letters.permutation(3).to_a
#  => [["m", "o", "r"], ["m", "r", "o"], ["o", "m", "r"], ["o", "r", "m"], ["r", "m", "o"], ["r", "o", "m"]] 

如果目标是重新编码这些方法。也许您可以将它们用作验证。例如,通过计算您的方法和标准库方法中的元素。