【问题标题】:Testing for pangram测试 pangram
【发布时间】:2018-10-10 13:42:29
【问题描述】:

我已经看到了一种测试字符串是否为 pangram 的方法——一个包含字母表中每个字母的句子——但我不太明白。我想知道为什么我的方法行不通。

def is_pangram(string)

  alpha = ("a".."z").to_a
  i = 0
  while i < string.length
    if string.downcase[i] == alpha.any? 
        alpha.delete(string.downcase[i])
    end
    i += 1
  end

  if alpha.length > 0
    puts "This string is not a pangram"
  else
    puts "This string is a pangram"
  end

  puts alpha.length
  puts alpha
end

is_pangram("The quick brown fox jumps over the lazy dog")

【问题讨论】:

  • 问题出在这里:string.downcase[i] == alpha.any? LHO 是一个字母,而alpha.any? 返回布尔值,表示数组是否为空。这个条件永远不会满足。应该是alpha.include?(string.downcase[i])
  • @Aleksei,你做了什么?当然,您必须认识到,我过去提到的“mudsie”现在会遭到空洞的注视! (读者:直到最近,Aleksei 使用 SO 用户名“mudasobwa”。)
  • @Cary 如果你继续称我为 mudsie,我将不胜感激,我绝对喜欢它。

标签: ruby pangram


【解决方案1】:

Aleksei 已经回答了这个问题……这里有一种更简洁的方法。

def is_pangram(string)

  alpha = ("a".."z").to_a
  string.downcase.split("").each do |i|
    alpha.delete(i) if alpha.include?(i)
  end

  if alpha.empty?
    puts "This string is a pangram"
  else
    puts "This string is not a pangram"
  end

  puts alpha.length
  puts alpha
end

is_pangram("The quick brown fox jumps over the lazy dog")

【讨论】:

  • 为什么这么干净?
  • 还有你为什么要先拆分字符串?
  • 它不跟踪i 变量,while 循环已减少为一行代码。您需要先split 才能对其进行迭代。 Ruby 可以在数组上运行 each,但不能在字符串上运行。
  • 目前迭代字符串的方式非常手动。一个简单的each 就可以搞定。
【解决方案2】:

下面的呢?

def is_pangram?(str)
  str.downcase.scan(/[a-z]/).uniq.size == 26
end

is_pangram? "The quick brown dog jumps over the lazy fox."
  #=> true
is_pangram? "The quick brown dog jumps over the wary fox."
  #=> false

【讨论】:

    【解决方案3】:

    但我不是很明白

    (预期的)算法构建一个包含所有 (26) 个字母的数组。然后它逐个字符地处理字符串,从第一个数组中删除该字符(如果它仍在其中)。之后,它只是测试第一个数组是否为空。如果是这样,则字符串中的字符导致数组中的所有字符都被删除,因此该字符串是一个 pangram。如果不是,则字符串中“缺少”某个字符,而该字符仍在数组中。

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      相关资源
      最近更新 更多