在ruby中实现我自己的闰年课程

时间:2015-07-02 11:40:02

标签: ruby

我正在exercism.io上进行一些练习,对于当前的练习,我们需要实现自己的闰年课程(并忽略Ruby内置的功能)。提供测试,我无法通过所有测试。

总结一个闰年是除以4之外的任何一年,除非该年可被100整除,除非它可以被400整除。这就是我到目前为止所拥有的:

class Year
  def self.leap?(year)
    if (year % 400 == 0 && year % 100 == 0) || (year % 100 != 0 && year % 4 == 0)
      return "Yes, #{year} is a leap year"
    else
      return "No, #{year} is not a leap year"
    end
  end
end

失败的测试是在1900年,1997年和1998年。它不是一个非常大的文件,所以这里是测试装置:

class YearTest < Minitest::Test
  def test_leap_year
    assert Year.leap?(1996), 'Yes, 1996 is a leap year'
  end

  def test_non_leap_year
    refute Year.leap?(1997), 'No, 1997 is not a leap year'
  end

  def test_non_leap_even_year
    refute Year.leap?(1998), 'No, 1998 is not a leap year'
  end

  def test_century
    refute Year.leap?(1900), 'No, 1900 is not a leap year'
  end

  def test_fourth_century
    assert Year.leap?(2400), 'Yes, 2400 is a leap year'
  end
end

我并不完全相信我的逻辑是合理的,所以任何帮助都会非常感激。

4 个答案:

答案 0 :(得分:3)

class Year
  def self.leap?(year)
    return "Yes, #{year} is a leap year" if (year % 400).zero?
    return "No, #{year} is not a leap year" if (year % 100).zero?
    return "Yes, #{year} is a leap year" if (year % 4).zero?
    return "No, #{year} is not a leap year"
  end
end

class Year
  def self.leap?(year)
    yes, no = "Yes, #{year} is a leap year", "No, #{year} is not a leap year"
    return yes if (year % 400).zero?
    return no if (year % 100).zero?
    return yes if (year % 4).zero?
    return no
  end
end

答案 1 :(得分:2)

问题是Year.leap?应该返回true或false,而不是返回一个字符串,根据你的测试。

class Year
  def self.leap?(year)
    (year % 400 == 0 && year % 100 == 0) || (year % 100 != 0 && year % 4 == 0)
  end
end

您的测试现在将通过。

assert正在寻找真实的回复,refute正在寻找错误的回应。

我们可以让原始代码更完整,但是说......

if (condition_to_test) == true
  return true
else
  return false
end
只需

就可以更简洁地呈现

condition_to_test

这将自动返回truefalse

答案 2 :(得分:0)

根据您的描述,它应该如下所示

if year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)
  return "Yes, #{year} is a leap year"
else
  return "No, #{year} is not a leap year"
end

答案 3 :(得分:0)

这个发现闰年在几年内。

(start_year..end_year).each do |year|
  next if year % 4   != 0
  next if year % 100 == 0 && year % 400 != 0
  puts year
end