Leap year

Rustom Mody rustompmody at gmail.com
Mon Sep 29 08:58:42 CEST 2014


On Saturday, September 27, 2014 9:21:15 AM UTC+5:30, Seymore4Head wrote:
> Still practicing.  Since this is listed as a Pseudocode, I assume this
> is a good way to explain something.  That means I can also assume my
> logic is fading with age.
> http://en.wikipedia.org/wiki/Leap_year#Algorithm

> Me trying to look at the algorithm, it would lead me to try something
> like:
> if year % 4 !=0:
> 	return False
> elif year % 100 !=0:
> 	return True
> elif year % 400 !=0:
> 	return False

> ****   Since it is a practice problem I have the answer:
> def is_leap_year(year):
> return ((year % 4) == 0 and ((year % 100) != 0 or (year % 400) == 0))

> I didn't have any problem when I did this:

> if year % 400 == 0:
> 	print ("Not leap year")
> elif year % 100 == 0:
> 	print ("Leap year")
> elif year % 4 == 0:
> 	print ("Leap year")
> else:
> 	print ("Not leap year")

Python has an if-expression distinct from the if-statement.
However its confusing because its order is 'upside down'

So below I use C's if-expression a?b:c to state some 'laws' of programming and leave it as an exercise to pythonify them

a?T:F ≡ a       A
a?F:T ≡ not a   B

a?T:b ≡ a or b     C
a?b:F ≡ a and b    D

if p:              E
   return x
else:
   return y

≡

return (p ? x : y)

Likewise

if p              F
   print x
else
   print y

≡

print (p ? x : y)
----------------------------
Now putting:
a ≜ y%4==0
b ≜ y%100!=0
c ≜ y%400 == 0

the expression that is the (given) answer is
a and (b or c)

Lets use the above laws to open it up
"by C"
a and (b ? T: c)
"by D"
a?(b?T:c):F


year%4==0 ? (y%100!=0 ? T: y%400==0) :  F

--------------------------
Now lets take your version:

if year % 400 == 0:
        print ("Not leap year")
elif year % 100 == 0:
        print ("Leap year")
elif year % 4 == 0:
        print ("Leap year")
else:
        print ("Not leap year") 


And now 'de-print' it [A good idea though I wont suggest it to you again!]

print (!c ? F : (b? T : (a? T : F)))

Forget about the print since its irrelevant and concentrate on

 (!c ? F : (b? T : (a? T : F)))
"by A"
= (!c ? F : (b? T : a))
"by B"
= (c ? (b? T : a) : F)
"by D"
= (c and (b?T:a)
"by C"
= c and (b or a)

Lets re-substitute a,b,c

= y%400==0 and (y%100 !=0 or y%4 == 0)

which interpreted says that ONLY years divisible by 400 are leap
and not even all those!!



More information about the Python-list mailing list