Ruby 如何检测字符串是否为pangram并返回true或false

Ruby 如何检测字符串是否为pangram并返回true或false,ruby,methods,pangram,Ruby,Methods,Pangram,pangram是一个包含字母表中每个字母至少一次的句子。例如,“敏捷的棕色狐狸跳过懒惰的狗”这句话就是一个pangram,因为它至少使用了一次字母a-Z,大小写不相关。我试图创建一个方法,该方法接受一个字符串并返回true或false,如果它是pangram。这就是我到目前为止所尝试的 def pangram?(string) letters = string.chars.downcase.uniq letters.uniq.all? {|c| string.count(c)==26}

pangram是一个包含字母表中每个字母至少一次的句子。例如,“敏捷的棕色狐狸跳过懒惰的狗”这句话就是一个pangram,因为它至少使用了一次字母a-Z,大小写不相关。我试图创建一个方法,该方法接受一个字符串并返回true或false,如果它是pangram。这就是我到目前为止所尝试的

def pangram?(string)
  letters = string.chars.downcase.uniq
  letters.uniq.all? {|c| string.count(c)==26}
end

def pangram?(string)
  string.downcase
  ("a".."z").all?{|c| string.count(c) <= 1}
end

还有更好的建议吗?提前谢谢

您可以选择以下内容:

s.downcase.scan(/[a-z]/).uniq.size == 26 
这将对字符串扫描的所有字符a到z进行降级,并检查这些字符的uniq大小是否等于26

当前解决方案的问题

第一个永远不会像现在这样工作

chars返回一个数组,Arraydowncase不是一个方法 您正在检查原始字符串中的每个字母都是字符串的26倍。countc==26,因此'a'*26将通过此测试,但快速的棕色狐狸跳过懒惰的狗不会。 第二个问题也有:

第一行没有用。它对字符串进行降档并处理结果 Stringcount将效率低下; 将通过此测试,因为每个字母出现0次。例如 为了加快计算速度,我将“a”…“z”转换为集合而不是数组

如果字符串很长,则在找到26个不同的字符后,返回true可能会更快:

def pangram?(str)
  str.downcase.each_char.with_object(('a'..'z').to_set) do |c,st|
    st.delete(c)
    return true if s.empty?
  end
  false
end

在第二个示例中,string.downcase不会更改原始字符串。使用downcase!。。。。或a=a..z.至a;a&string.downcase.chars==a,但更喜欢您所拥有的。@CarySwoveland a=[*'a'..'z']和a.&string.downcase.chars.size==a.sizeengineersmnky,这两种方法都有效。Cary Swoveland抱歉,这是可行的,但我不明白为什么。@ChiaraAni&is Arrayintersection它将返回原始数组和参数数组中的所有元素,例如[b,c]&[c]=>[c]。在Cary的例子中,交叉点必须与原始交叉点相等,才能使情况成立。这项工作之所以有效,是因为在制作过程中保留了原作的顺序intersection@ChiaraAni因为这只是为了好玩。就像这个“a”…'z“。然后{a | a.to_a-string.downcase.chars}.empty?我误读了你的答案,不知道如何…@engineersmnky,是的,我考虑过了,并进行了编辑,但在保存之前改变了主意。我会提到的。
require 'set'
def pangram?(str)
  str.downcase.each_char.with_object(('a'..'z').to_set) {|c,st| st.delete(c)}.empty?
end
pangram?("The quick brown dog jumps over the lazy fox")          #=> true
pangram?("The quick brown dog jumps over the lazy fo.")          #=> false
pangram?("The quick brown dog, Saffi, jumps over the lazy fox.") #=> true
def pangram?(str)
  str.downcase.each_char.with_object(('a'..'z').to_set) do |c,st|
    st.delete(c)
    return true if s.empty?
  end
  false
end