为什么这个红宝石测试失败了?

时间:2015-10-12 14:23:29

标签: ruby

我正在代码战中做一些kata挑战:

  

这是一个挑战: isogram 是一个没有重复字母,连续或不连续的单词。实现一个函数,确定只包含字母的字符串是否是等值线图。假设空字符串是等值线图。忽略字母案例。

我有以下代码:

def is_isogram(string)
  string.downcase!
  ('a'..'z').each do |letter|
    return string.count(letter) <= 1 || string.length == 0 ? true : false
  end
end

进行以下测试:

Test.assert_equals(is_isogram("Dermatoglyphics"), true )
Test.assert_equals(is_isogram("isogram"), true )
Test.assert_equals(is_isogram("aba"), false, "same chars may not be adjacent" )
Test.assert_equals(is_isogram("moOse"), false, "same chars may not be same case" )
Test.assert_equals(is_isogram("isIsogram"), false )
Test.assert_equals(is_isogram(""), true, "an empty string is a valid isogram" )

我的代码在第四次测试时失败了。有人可以说清楚我做错了什么以及如何让测试通过?

2 个答案:

答案 0 :(得分:3)

您将在第一次迭代结束时从方法返回。因此,您的代码与isogram无关。您的代码将检查范围中的第一个字符(即"a")是否重复。

前两个示例只有一个"a",因此返回true。第三个有多个"a",因此返回false。第四个没有"a",因此返回true

要使代码正常工作,请将其更改为:

def is_isogram(string)
  string.downcase!
  ('a'..'z').each do |letter|
    return false if string.count(letter) > 1
  end
  return true
end

但是写一个更为Rubyish的方式是:

def is_isogram(string)
  string = string.downcase
  ('a'..'z').none?{|letter| string.count(letter) > 1}
end

答案 1 :(得分:0)

试试这个

 def is_isogram(string)
  string.downcase.chars.uniq == string.downcase.chars
 end