This problem teaches valuable lessons: Complex conditions need careful parentheses. a and b or c is different from a and (b or c).
Return booleans directly. If your condition is already True/False, just return it.
Test edge cases. The boundaries (, ) are where bugs hide.
Read specifications precisely. The leap year rules have exceptions to exceptions. When you encounter complex boolean logic, break it down piece by piece. Write out what each part means in plain English, then translate to code.