[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Help with a program to determin leap years.

Shiloh Madsen

11/7/2006 5:16:00 PM

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?

8 Answers

Morton Goldberg

11/7/2006 8:09:00 PM

0

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

> 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?

Here is simple way:

1. 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

2. <range>.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

dblack

11/7/2006 8:33:00 PM

0

Josef 'Jupp' Schugt

11/7/2006 8:49:00 PM

0

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

* Morton Goldberg, 11/07/2006 09:09 PM:
> 1. 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-----

Wilson Bilkovich

11/7/2006 8:52:00 PM

0

On 11/7/06, dblack@wobblini.net <dblack@wobblini.net> wrote:
> Hi --
>
> On Wed, 8 Nov 2006, Shiloh Madsen wrote:
>
> > 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?
>
> 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.
>

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

Morton Goldberg

11/7/2006 9:33:00 PM

0

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

> 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?

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

Shiloh Madsen

11/7/2006 11:21:00 PM

0

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, Morton Goldberg <m_goldberg@ameritech.net> wrote:
> On Nov 7, 2006, at 12:15 PM, Shiloh Madsen wrote:
>
> > 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?
>
> 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
>
>

Sergey Volkov

11/8/2006 12:12:00 AM

0

----- Original Message -----
From: <dblack@wobblini.net>
To: "ruby-talk ML" <ruby-talk@ruby-lang.org>
Sent: Tuesday, November 07, 2006 3:33 PM
Subject: Re: Help with a program to determin leap years.


> Hi --
>
> On Wed, 8 Nov 2006, Shiloh Madsen wrote:
>
>> 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?
>
> 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
>
> --
> David A. Black | dblack@wobblini.net
> 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... | [3] http://www.rubypoweran...
> [2] http://dablog.r... | [4] http://www.rubyc...
>

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

Peña, Botp

11/8/2006 4:33:00 AM

0

dblack@rubypal.com [mailto:dblack@rubypal.com]:
# 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