我正在尝试使用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
不确定还有什么可以尝试。
答案 0 :(得分:7)
你的代码是非常不恰当的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
回答你的问题:你只得到三个字谜,因为while
方法中的anagram_maker
循环执行了三次(字符串的长度)。此外,我想只是改组字符不是生成排列的正确方法,有关实现anagram算法的更多信息,请参阅“Algorithm to generate anagrams”。
答案 1 :(得分:1)
此外,如果您想要修改自己的代码,以便您可以在自己的写作风格的背景下学习,您可以试试这个:
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
这远不如前面提到的那么有效,但相关的却不是那么好。