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

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(&amp;:join) 是什么意思? 我会注意到可能需要调用 .uniq I.E. @word.chars.permutation.map(&amp;:join).uniq 这样可以删除重复的排列。 @vgoff Array#permutation(无)存在。有重复字符时需要uniq 调用。 是的,我知道,但因为它是代码行不通。它需要编辑才能工作。据报道,我们被告知“它适用于 2.0.0”,而实际上它没有。至于独特的发生,取决于您所说的独特,因为当您可以通过相同字母的不同用法创建相同的字面词时,重复相同的字面词可能是完全有效的,只要相同的字母出现不止一次在单词的集合中。 (想想拼字游戏)。 由于 SO 对 Ruby 来说显然是新的,你应该解释一下@word.chars.to_a.permutation.map(&amp;:join).uniq.each。这将使答案对 SO 更加有用,并避免了许多本来可以预料到的后续问题和答案。做到这一点,imo,最好的方法是用一个例子来分解它,例如,@word等于"ant"e = @word.chars =&gt; ["a", "n", "t"]ee = e.permutation =&gt; #&lt;Enumerator: ["a", "n", "t"]:permutation&gt;eee = ee.map(&amp;:join) =&gt; ["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

这比前面提到的效率低得多,但仍然相关。

【讨论】:

以上是关于你怎么能找到一个单词的所有字谜?的主要内容,如果未能解决你的问题,请参考以下文章

搜索字谜的最快方法是啥?

字词字谜生成器

如何在不递归的情况下找到所有可能的字谜?

Python:字谜查找器

查找单词字谜数量的算法?

字谜/部分字谜检测算法找到不正确的答案