你怎么能找到一个单词的所有字谜?
Posted
技术标签:
【中文标题】你怎么能找到一个单词的所有字谜?【英文标题】:How can you find all anagrams for one word? 【发布时间】:2013-12-29 09:52:47 【问题描述】:我正在尝试使用 Ruby 获取一个单词的所有字谜,但我的代码不起作用,我只得到字符串“ant”的三个结果。任何帮助将不胜感激。
class Anagram
attr_reader :word
def initialize(word)
@word = word.downcase
end
def anagram_maker
@word_bank = []
index = @word.length
minus_one = index - 1
while (index * minus_one) != 0
anagram = @word.split('').shuffle.join
@word_bank << anagram
index -= 1
end
@word_bank = @word_bank.uniq
end
def display
anagram_maker
if @word_bank.count > 1
@word_bank.each do |anagram|
puts anagram
end
else
puts "Not enough letters for an anagram"
end
end
end
不知道还能在这里尝试什么。
【问题讨论】:
【参考方案1】:您的代码是非常不地道的 Ruby。
计算字符串的字谜是计算字符串字符的排列,而 Ruby 使这项任务变得非常容易。重现您的 Anagram
类的示例是:
class Anagram
def initialize(word)
@word = word
end
def display
# In Ruby 2.0 @word.chars will return an array, no need for `to_a`.
@word.chars.to_a.permutation.map(&:join).uniq.each do |anagram|
puts anagram
end
end
end
anagram = Anagram.new('ant')
anagram.display
# Output
# ant
# atn
# nat
# nta
# tan
# tna
回答您的问题:您只会得到三个字谜,因为 anagram_maker
方法内的 while
循环执行了三次(字符串的长度)。此外,我猜想只是改组字符不是生成排列的正确方法,请参阅“Algorithm to generate anagrams”了解有关实现字谜算法的更多信息。
【讨论】:
map(&:join)
是什么意思?
我会注意到可能需要调用 .uniq I.E. @word.chars.permutation.map(&:join).uniq
这样可以删除重复的排列。
@vgoff Array#permutation
(无)存在。有重复字符时需要uniq
调用。
是的,我知道,但因为它是代码行不通。它需要编辑才能工作。据报道,我们被告知“它适用于 2.0.0”,而实际上它没有。至于独特的发生,取决于您所说的独特,因为当您可以通过相同字母的不同用法创建相同的字面词时,重复相同的字面词可能是完全有效的,只要相同的字母出现不止一次在单词的集合中。 (想想拼字游戏)。
由于 SO 对 Ruby 来说显然是新的,你应该解释一下@word.chars.to_a.permutation.map(&:join).uniq.each
。这将使答案对 SO 更加有用,并避免了许多本来可以预料到的后续问题和答案。做到这一点,imo,最好的方法是用一个例子来分解它,例如,@word
等于"ant"
、e = @word.chars => ["a", "n", "t"]
、ee = e.permutation => #<Enumerator: ["a", "n", "t"]:permutation>
、eee = ee.map(&:join) => ["ant", "atn", "nat", "nta", "tan", "tna"]
,然后解释uniq
和@987654337 @.【参考方案2】:
另外,如果您想修改自己的代码,以便在自己的写作风格的背景下学习,您可以试试这个:
class Anagram
attr_reader :word, :combinations
def initialize(word)
@word = word.downcase
@combinations = (1..@word.length).inject(:*)
end
def anagram_maker
@word_bank = []
index = @word.length
minus_one = index - 1
while @word_bank.uniq.count < @combinations
anagram = @word.split('').shuffle.join
@word_bank << anagram
end
@word_bank = @word_bank.uniq
end
def display
anagram_maker
if @word_bank.count > 1
@word_bank.each do |anagram|
puts anagram
end
else
puts "Not enough letters for an anagram"
end
end
end
这比前面提到的效率低得多,但仍然相关。
【讨论】:
以上是关于你怎么能找到一个单词的所有字谜?的主要内容,如果未能解决你的问题,请参考以下文章