我正在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
我并不完全相信我的逻辑是合理的,所以任何帮助都会非常感激。
答案 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
这将自动返回true
或false
。
答案 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