Some notes:
- I assume that, for some reason, you want to write your own function/method instead of the existing Date#leap? that @Flambino linked above.
kabisat?
We all love our mother tongue, but in computing English is the lingua franca, specially when you share your code with people around the world. It's a nice word to learn, though :-)
- This is a personal advice, not all Ruby programmers agree: don't use inline returns. Use the good old full-fledged conditionals, it's much more clear. In general, use expressions instead of statements.
Let's see the standard algorithm. Ok, I'll just translate it to Ruby (if I felt fancy I'd even add Integer#divisible_by?(n)
for a fully declarative code):
def is_leap_year?(year)
if year % 400 == 0
true
elsif year % 100 == 0
false
elsif year % 4 == 0
true
else
false
end
end
Too verbose? use boolean logic:
def is_leap_year?(year)
(year % 400 == 0) || (year % 100 != 0 && year % 4 == 0)
end
Date#leap?
method? In any event, yourkabisat_1
function is broken. It'll returntrue
for, say, 2013, because it's not divisible by 100. But 2013 certainly isn't a leap year. \$\endgroup\$y%4!=0
first, so it'll return the right thing. But reversing the checks is suspect. The logic is that "if a year is divisible by 100, it's not a leap year". But that does not mean, that every year that isn't divisible automatically is a leap year. I.e. the check against 100 can only can only tell you if something's not a leap year; it can't tell you if it is. \$\endgroup\$