Hacker Newsnew | past | comments | ask | show | jobs | submit | mxtopher's commentslogin

I wouldn't be surprised if it was just a for loop checking for all the years in a range, whether they start on the same day of week, and are/are not leap years :)


The calculations are actually really easy. Note that the length of a (regular) year is 1 mod 7, which means weekdays slip by 1 day each year, except for leap years. Over the 400-year Gregorian calendar cycle, there are 97 leap years, for a total of 497 days of slip... so adding 400 years to the current calendar year will always yield the same calendar.

More specifically, there are 14 possible calendars. The leap year cycle is 4 days (excluding the 100 year skips), and the weekday cycle is 7 days, so the leap year×weekday cycle is 28 years. So the starting weekdays are on a 28-year cycle, but you have to slip your resulting calculation by the number of centuries from the beginning of the 400-year cycle (i.e., integer division of year by 100). You'll reuse a leap year calendar in 28 years (40 years, if it crosses a round-hundred year), and you'll reuse a non-leap year calendar in 6 or 11 years (12 or 6 years, if it cross a round-hundred year).

The easiest way to code it is to just precompute the year % 400 table and report the results.


> The easiest way to code it is to just precompute the year % 400 table and report the results.

If you are interested, Chrono [1] internally uses the exact table. Constants there refer to dominical letters [2].

[1] https://github.com/chronotope/chrono/blob/a4488007272569f752...

[2] https://en.wikipedia.org/wiki/Dominical_letter


> The leap year cycle is 4 days (excluding the 100 year skips)

I think you mean “The leap year cycle is 4 days (excluding the 100 year skips, except every fourth 100 years when they don’t),” eg how 2000 was a leap year despite this individual rule.

(I know it’s accounted for elsewhere in the modulo logic, but you shouldn’t resist the impulse to point out just how crazy it all is!)


The 400 year rule is already accounted for by taking the year mod 400. 2000, 2400, 2800, etc. will all use the same calendar.


Yes, I did mention you had it taken care of, just not explicitly pointed out :)


Or the calculations where done once and now it's stored in a database.


Once and manually. On an oily napkin in canteen.



Readability, there it is.


Hi there, take a look on position: sticky; It does exactly what you want. Please note it is still experimental though.


so tick calls requestAnimationFrame that calls tick that... Doesn't it create an ever growing stack? Isn't there a way to do it with a while loop?


requestAnimationFrame just queues up the callback for later, it doesn't actually call into it. There's no stack growth.


It doesn't create an ever-growing stack.

tick calls requestAnimationFrame, tick returns, the browser waits for the next frame and calls tick...


Indeed. It's using docco, most likely: http://jashkenas.github.io/docco/


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: