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"]]
如果目标是重新编码这些方法。也许您可以将它们用作验证。例如,通过计算您的方法和标准库方法中的元素。
简单来说,我想输入一个字母,输出一个设定长度范围内所有可能的组合。 例如: 长度范围 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"]]
如果目标是重新编码这些方法。也许您可以将它们用作验证。例如,通过计算您的方法和标准库方法中的元素。