你怎么能找到一个单词的所有字谜?

时间:2013-12-11 12:15:21

标签: ruby anagram

我正在尝试使用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

不确定还有什么可以尝试。

2 个答案:

答案 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

这远不如前面提到的那么有效,但相关的却不是那么好。