So, I’m trying to go through the Teach Yourself Programming book by

Pragmatic Press and I am encountering a few hurdles. The chapter I am

working on now is asking me to create a program which will ask for a

start and end year and then calculate all leap years in that range.

The logic behind leap years (for those who need a refresher) is all

years divisible by for are leap years EXCEPT those that are divisible

by 100 UNLESS they are also divisible by 400. I am somewhat at a loss

for how to handle the logic for this…finding all numbers that are

divisible by 4 and removing those divisible by 100 is easy. Its adding

in that third condition which adds some of the removed numbers back

into the “true” group that I am having trouble with…or maybe I am

just not wrapping my mind around the problem well

enough…suggestions?

On Nov 7, 2006, at 12:15 PM, Shiloh M. wrote:

into the “true” group that I am having trouble with…or maybe I am

just not wrapping my mind around the problem well

enough…suggestions?

Here is simple way:

- Write a is_leap? method.

def is_leap?(y)

return true if y % 400 == 0

return false if y % 100 == 0

return true if y % 4 == 0

false

end

- .select { |y| is_leap?(y) }

For example,

(1895…1905).select { |y| is_leap?(y) } # => [1896, 1904]

(1995…2005).select { |y| is_leap?(y) } # => [1996, 2000, 2004]

Regards, Morton

-----BEGIN PGP SIGNED MESSAGE-----

Hash: SHA1

- Morton G., 11/07/2006 09:09 PM:

- Write a is_leap? method.
def is_leap?(y)

return true if y % 400 == 0

return false if y % 100 == 0

return true if y % 4 == 0

false

end

YAWOFOIAYIALY:

def is_leap?(y)

return true if y % 400 == 0

return false if y % 100 == 0

return y % 4 == 0

end

Jupp

YAWOFOIAYIALY: Yet another way of finding out if a year is a leap year.

-----BEGIN PGP SIGNATURE-----

Version: GnuPG v1.4.5 (GNU/Linux)

iD8DBQFFUPEXrhv7B2zGV08RAg/HAJ9GqtURKVlnjqFwH7UzRo2X+LMnXgCgoIG5

XFMK3EpMrOjM05IAD8UfHTE=

=N0Le

-----END PGP SIGNATURE-----

Hi –

On Wed, 8 Nov 2006, Shiloh M. wrote:

into the “true” group that I am having trouble with…or maybe I am

just not wrapping my mind around the problem well

enough…suggestions?

require ‘date’

Date.leap?(year) #

See Morton’s implementation. Here, just for fun, is another:

def leap?(year)

year % 4 == 0 unless (year % 100 == 0 unless year % 400 == 0)

end

It returns nil/true rather than false/true, so it’s a bit

non-slick. But I thought the semantics might be interesting.

David

On Nov 7, 2006, at 12:15 PM, Shiloh M. wrote:

into the “true” group that I am having trouble with…or maybe I am

just not wrapping my mind around the problem well

enough…suggestions?

The key point of all the methods proposed in this thread is: deal

with the years divisible by 400 first, the years divisible by 100

second, and the years divisible by 4 last of all.

Regards, Morton

AH! i was looking at it wrong…startin from validating divisible by 4

is the wrong direction…thank you all. I think I can make it work now

(many of you posted rather more advanced ways to do it. I am trying to

stick within the confines of the chapters ive done so far). Basically

I needed the way to approach the problem. Thanks all!

S.

On 11/7/06, [email protected] [email protected] wrote:

by 100 UNLESS they are also divisible by 400. I am somewhat at a loss

See Morton’s implementation. Here, just for fun, is another:def leap?(year)

year % 4 == 0 unless (year % 100 == 0 unless year % 400 == 0)

endIt returns nil/true rather than false/true, so it’s a bit

non-slick. But I thought the semantics might be interesting.

You can fix that with the fun !! trick to convert nils back to false:

def leap?(year)

!!(year % 4 == 0 unless (year % 100 == 0 unless year % 400 == 0))

end

----- Original Message -----

From: [email protected]

To: “ruby-talk ML” [email protected]

Sent: Tuesday, November 07, 2006 3:33 PM

Subject: Re: Help with a program to determin leap years.

by 100 UNLESS they are also divisible by 400. I am somewhat at a loss

See Morton’s implementation. Here, just for fun, is another:–

David A. Black | [email protected]

Author of “Ruby for Rails” [1] | Ruby/Rails training & consultancy [3]

DABlog (DAB’s Weblog) [2] | Co-director, Ruby Central, Inc. [4]

[1] http://www.manning.com/black | [3] http://www.rubypowerandlight.com

[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org

what about small optimization (just for fun);

it works faster in most cases - non leap year happens more often:

def leap?(y)

(y%4).zero? && !(y%100).zero? || (y%400).zero?

end

sergey

[email protected] [mailto:[email protected]]:

# year % 4 == 0 unless (year % 100 == 0 unless year % 400 == 0)

heheh thanks, this one should go to my bag of tricks, a (first) example

of cascading unlesseses

kind regards -botp