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

Joh*_*ohn 1 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
Run Code Online (Sandbox Code Playgroud)

不知道还有什么可以尝试.

tor*_*o2k 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
Run Code Online (Sandbox Code Playgroud)

要回答你的问题:你只得到三个字谜,因为方法中的while循环anagram_maker执行了三次(字符串的长度).此外,我想只是改组字符不是产生排列的正确方法,有关实现anagram算法的更多信息,请参阅" 生成字谜的算法".

  • 由于SO显然是Ruby的新手,你应该解释`@ word.chars.to_a.permutation.map(&:join).uniq.each`.这样做可以使答案对SO更有用,并避免了许多本来可以预料到的后续问题和答案.最好的方法就是用一个例子来解决它,例如,对于`@ 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`和`&:join`. (3认同)