Hacker News new | past | comments | ask | show | jobs | submit login
Lewis Carroll – computing the day of the week for any given date (1887) (futilitycloset.com)
199 points by beardyw 4 months ago | hide | past | favorite | 101 comments



This is very similar to the method I use and, after conversation with him, the method Art Benjamin uses. It's trivial to do in 10 to 15 seconds, though it requires practice, a very small amount of memorisation[0], and a small amount of mental arithmetic. I use it regularly, partly to keep in practice, and partly because once you have the skill you find it's surprisingly useful.

JH Conway used a different technique[1] which I have swutch to when computing days in the current year. It's quicker and easier, but I find that it's harder to compute "The Doomsday" for other years (it's Thursday this year), so I revert to my standard method[2].

Example: Today is 2024/05/24

    Years since 2012 is 12
    Leap years is 12/4 = 3
    Magic month number = 2
    Date is 24
    Add mod 7 is (12+3+2+24) = (-2)+3+2+3 = 6 = Friday
[0] A "magic number" for each month. There are mnemonics, and they can be computed from first principles if needed. It's also easy to remember a few and then compute the others.

  144 : Jan, Feb, Mar
  025 : Apr, May, Jun
  036 : Jul, Aug, Sep
  146 : Oct, Nov, Dec
[1] https://en.wikipedia.org/wiki/Doomsday_rule

[2] All values computed mod 7. Take years since 1900. Add number of leap years since 1900 (so (YYYY-1900)/4 rounded down). Add the magic number for the month. Add the day of the month. Then Sunday=1, Wednesday=4, etc.

Because the calendar repeats every 28 years, for more recent dates you can start with 2012 instead of 1900.


> which I have swutch to

That's a past participle I've never seent before


Like the joke of the guy returning to Boston after being away for years; asks his cab driver "Do you know where I can get scrod" and the driver says "Sure, but I've never heard that in the past perfect before!"


This might be the first time I get a joke's punchline but not the setup


Scrod is the name for a small whitefish; he was looking for a seafood restaurant.


You can create infinite such jokes that end with:

…and the duck said to the bartender, “put it on my bill”


Hmmm. When I heard that joke long ago, the driver said it was the pluperfect subjunctive. And here I took his word for it.


Same thing. From Wikipedia: "The pluperfect (shortening of plusquamperfect), usually called past perfect in English"


Another especially funny part of that joke for me is that this is set in Boston (which has a couple of important colleges) ... because someone once told me that a lot of post-graduates of that college I was attending were driving taxicabs in that city.


For some reason part participles are particularly hard for me too (native English speaker who speaks no other languages fluently). (they must just be a mess in English? I can't imagine how non-native speakers ever get any of them)

I'm going to go with swutcheted


English verbs are pretty tame compared to Slavic verbs that can be modified with all kinds of perfective prefixes.

On the other hand, Chinese verbs are even easier. They don't even have a tense!


I wouldn’t say that Chinese verbs have no tense so much as that they are uninflected and that tense is marked with particles (which admittedly do not cause difficulties with irregular infexions).


Chinese technically does not have grammar tenses, but it has aspects indicated by particles. They mark the completion status, direction, presence, and so on.

However, the verbs themselves don't have tense. So these sentences can be identical: "I will walk home, then I will eat a cake" and "I walked home, then I ate a cake".

The overall timeframe can be given by a larger context: "Once my shift is over, I ..." / "I drank too much yesterday, that's all I remember: ".

It's simply not possible in English because every verb has a grammar tense built into it.


For entertainment look up Germanic string and weak verbs.


autocorrect unspelling above: string -> strong

( https://en.wikipedia.org/wiki/Germanic_strong_verb )


I find this all much ado ablaut nothing.


Second guessed myself and had to look up whether this was actually a word


Google says the correct term is, in fact, Nintendo Switch.


I assume it lets you know where to buy one as well.


How’d you guess?


Trust Google with the facts.


If it was phrased 'to which I have swutch' I don't think I'd bat an eyelid!

(i.e. past perfect, I think?)


If 'swutch' is the (past) participle of 'to switch':

Perfect: "to which I have swutch"

Pluperfect/past perfect: "to which I had swutch"


Let's go crazy and do: to whuch I have swutch.


Oh yes, thanks.


maybe you haven't liveth long enough


"swutch"

Compilation error at line 173.


I assume by

  144 : Jan, Feb, Mar
  025 : Apr, May, Jun
  036 : Jul, Aug, Sep
  146 : Oct, Nov, Dec
You mean: Jan = 1, Feb = 4, Mar = 4, etc.


Exactly so.

I remember them in this table because they are squares (except for December), as well as "highlights" ... May=2 and August=3 are two that I have "to hand".


Yeah, since they’re all mod 7.


This was the first explanation that I immediately memorised. Thank you for sharing. I got quite a few right, but as I experimented I failed on February 7th 2032. My math was:

    Years since 2012 is 20
    Leap years is 20/4 = 5
    Magic month number = 4
    Date is 7
    (20 + 5 + 4 + 7) % 7 = 1
So I was expecting Sunday, but the answer is Saturday. After some thought I realised: 2032 is a leap year and the chosen date is before February 29th. In those cases (on or before that day), it is necessary to subtract 1.


Exactly so ...

> Leap years is 20/4 = 5

... but because you are in February you have not yet had that leap year, so it's only 4, and then the sums work.


> A "magic number" for each month. There are mnemonics, and they can be computed from first principles if needed. It's also easy to remember a few and then compute the others.

  > 144 : Jan, Feb, Mar
    025 : Apr, May, Jun
    036 : Jul, Aug, Sep
    146 : Oct, Nov, Dec
It can be useful to combine mnemonics and computation. Consider this sequence:

  0, 1, -1, 0, 0, 1, 1, 2, 3, 3, 4, 4
It is the offset between the day of the year of the 1st of each month and the day of the year the 1st would be if the preceding months had all been 30 day months. For example if the first 11 months had all been 30 day months Christmas, December 25, would be day 30 x 11 + 25 = 355. Add the 12th item from the offset sequence, 4, to that to get the real day of the year for December 25th, which is 359.

The offset sequence is fairly easy to memorize.

Once you have that sequence memorized its easy to get the month magic numbers for day of week calculations. There are a few different sets of month magic numbers in use, but for all of them:

  Magic(n) = 2 n + Offset(n) + c
where Magic(n) is the magic number for month n (1 ≤ n ≤ 12), Offset(n) is the n'th item in the offset sequence, and c is a constant that depends on just what set of magic month numbers you use. For the 1 4 4 0 2 5 0 3 6 1 4 6 magic numbers c = -1.

For example for month 12, December, we get 2 x 12 + 4 + -1 = 6 mod 7.

By memorizing the offset sequence and using that to get the month magic numbers you get, at the cost a small amount of calculation to get the month numbers, easy day of year and days between dates calculations.

Of course it works both ways. Given memorized month magic numbers you can compute Magic(n) - 2 n - c and that will equal Offset(n) mod 7. As long as you remember that Offset(n) is in [-1,4] and so adjust anything outside that range by adding/subtracting multiples of 7 to get into range it should be fine.


I am struggling to understand the advantages over the Lewis Carroll method, which I find very simple and quick. It seems to add quite a lot of complexity.


I'm struggling to see why you think this is more complex ... the methods seem completely equivalent to me. The Carroll method does:

1: A calculation for the Century-Item ... divide by 4, take overplus from 3, multiply remainder by 2.

2: A calculation for the Year-Item ... Add together the number of dozens, the overplus, and the number of 4’s in the overplus.

3: A calculation for the Month-Item ... alternatively, memorise a table: the required final numbers after division by 7 are January, 0; February, 3; March, 3; April, 6; May, 1; June, 4; July, 6; August 2; September, 5; October, 0; November, 3; and December, 5.

Note that these numbers are exactly those in my table, minus 1.

4: Include the Day-Item.

Then add them all (mod 7) and convert the number to a month.

It's exactly equivalent to what I described, except the Carroll method has additional calculations for the year.


Possibly it was in the clarity of his explanation. That makes sense, thank you.


Really? Colin's method seems pretty simple to memorize and work with. Especially since it's all addition mod 7. Given that the mod operator distributes over addition you can work answers out easily while working with small numbers.

For example, what day of week was September 2, 1945?

    45/4 = 11 (mod 7 = 4)
    45 mod 7 = 3 (easy to work out from 7 times table)
    September = 6
    2
So you've got 4 + 3 (disappears under mod 7) and 6 + 2 mod 7 = 1. So, the second world war ended on a Sunday.


I think it's unreasonable for you to have been downvoted, and I've given you an upvote to do what I can to balance that. Expressing confusion over something like this is perfectly reasonable.


> Then Sunday=1, Wednesday=4, etc.

That's a helpful encoding because it matches up with numbering that's routinely used in Portuguese, Hebrew, Greek, and by Quakers, among many others.

https://en.wikipedia.org/wiki/Names_of_the_days_of_the_week#...

These are mostly ultimately because of the Hebrew Bible account in which Sunday is the first day of creation (e.g. Genesis 1:5, 1:8, 1:13, ...).


The numbering itself has little or nothing to do with the Bible. The practice of numbering days of the week is, as the page you linked suggests earlier, widespread and much older than the Bible.

Sunday is the day of creation in the Bible because it was the first day in the calendar being used where Genesis was written and translated, so "Day 1" became "Sunday" because to the translator "Sunday" was the first day. That calendar itself was not mathematical - the Hebrew calendar was an empirical lunisolar calendar with arbitrary intercalarion for thousands of years until it was fixed in 2CE in Judea, and it took another thousand years for this practice to become consensus, so Sunday being the day of creation is purely incidental and not a necessary intersection.

Ascribing the Bible into it is gratuitous and useless. While it might be a reason why a small proportion Christians use it, it only explains a tiny minority of its usage, not most of it. It's just explained by it being an obvious way to name days.


He didn't ascribe the Biblical narrative to the convention, he mentioned that they match. They could match due to coincidence, due to having a common ancestor, or due to the Biblical narrative itself following the extent (as you claim) standard.


I wrote "mostly ultimately because of", so I did mean to say that I thought the Biblical narrative was the historical reason that most cultures and languages that use this numbering did so.

I'm pretty curious about this question, which I've previously asked in the form of "for how long has there been a worldwide consensus about which day of the week it is?". One answer that I heard is sort of akin to sudosysgen's account, in that some people suggested that the question might not be meaningful: there may have been different cultures with a seven-day week and, when they made sustained contact, instead of debating with each other about "which day of the week it is", they may have understood themselves to be translating their existing names for the weekdays -- some of which were based on numbers.

To the extent that that's a good way of talking about it, I also don't have a good understanding of when those translations would have happened, or who would have made them.


It most likely comes from Greek, as the first time the Bible would be translated in a language where days had names. Some Greek calendars used the seven day week which seems to originate from the Sumerians, and naturally the day of the Sun would be the choice for the first day in the Greek pantheon.


I just looked in the Septuagint and (I guess unsurprisingly) it uses ἡμέρα μία, ἡμέρα δευτέρα, ἡμέρα τρίτη. So it wasn't literally directly in the translation process. One could also say that the Genesis text is counting days rather than naming them, as Genesis 1:5 for says יוֹם אֶחָד ('one day') whereas the "name" of the day in Hebrew is יוֹם רִאשׁוֹן ('first day').

This author argues that the "the Jewish, biblical week and the planetary week of astrological origin" were combined in Rome rather than Greece, while agreeing that there are earlier antecedents for the use of the seven-day week.

https://blogs.fu-berlin.de/zodiacblog/2022/05/02/the-origins...

Wikipedia on "nundinae" seems to roughly agree with this interpretation:

> The 7-day week first came into use in Italy during the early imperial period. For a time, both systems were used together, but the nundinae are seldom mentioned in extant sources after the Julio-Claudian period. The nundinal cycle had probably fallen out of use by the time Constantine adopted the Hebrew weeks for official use in AD 321, altering the day of rest by declaring the Lord's day the Day of the Sun (dies Solis) a legal holiday. Different scholars have placed the end of 8-day markets at various dates from the late 1st to early 5th centuries.


A little pressed with time, but does it handle leap years properly? Since every year divisible by 100 is not a leap year, unless it is also divisible by 400?

(E.g. 1900 is not a leap year but 2000 is)


There is a small correction needed for January and February in leap years, and I haven't included the corrections for pre-1900. The Carroll method does deal with these issues and I have internalised them, but I find I never use them, so I retain only the simpler version.


One simple way to do January and February is to treat them as part of the previous year (with an adjustment for the constant you remember for those months).


I don't quite understand. Your magic month numbers are 3 digits, but you only use one digit in your example. And how does substituting 2012 work, when 2012 was a leap year but 1900 wasn't?


> 144 : Jan, Feb, Mar

So Jan=1, Feb=4, Mar=4

> 025 : Apr, May, Jun

So Apr=0, May=2, Jun=5

... and so on.

And we can substitute 2012 for 1900 because we make a correction in Jan and Feb in leap years. Knowing that 1900 was not a leap year means we don't make the correction, but 2012 was a leap year so we do.


Thanks. Would have been easier to grasp though if you'd phrased it like

> 1,4,4 : Jan, Feb, Mar.


I learned this at MathCamp from Conway himself! The mnemonics he taught us for the “doomsdays” were:

> Even months aside from February, same date as the month, so 4/4, 6/6, 8/8, 10/10, 12/12.

> “Working 9 to 5 at 7-11”: 5/9, 7/11, 9/5, 11/7

> Jan–Mar are a bit arbitrary: Feb is the last day of the month (so 2/28 or 2/29), March is the 0th day (same), and Jan is 1/31 or 1/“32” depending on if it’s a leap year.


Why is it called "doomsday"? Neither the wiki article nor MW dictionary definition explain this etnymology/usage.

https://www.merriam-webster.com/dictionary/doomsday


"When I taught at Princeton five years ago, I asked my old college roommate to get to John Conway and ask. To my surprise it took 3, not 2, degrees of separation to get to him. He said he wanted the name to end in "-day" and "Dooms" popped into his head."

-- https://www.rudy.ca/doomsday.html

Likely that sprung to mind because of the "Domesday Book":

"Domesday Book (/ˈduːmzdeɪ/ DOOMZ-day; the Middle English spelling of "Doomsday Book") is a manuscript record of the Great Survey of much of England and parts of Wales completed in 1086 at the behest of King William the Conqueror."

-- https://en.wikipedia.org/wiki/Domesday_Book


> partly because once you have the skill you find it's surprisingly useful.

A statement I find to be true in general.


You don't have to take the mod 7 of each of the values. You can sum them into one number and take its mod 7. You'll get the same result.


You can take mod 7 anywhere you like as you go. It's a tool to make the arithmetic easier.

No, you don't need to do it relentlessly as you go, but it can be used in an ad hoc manner to keep the numbers small.

Having said that, if you have 24, you can reduce it (mod 7) to 10, which you might find it easier to work with rather than reducing it to 3. Similarly if you start with 27 you can reduce it to -1 (mod 7). You don't always need to reduce things to the range [0..7).

(Note, by convention the square bracket implies "included" and the round bracket implies "excluded", so [0..7) is the collection {0,1,2,3,4,5,6}.)


Judging by that table (month numbers being the same for Feb + March in 2024), you have to adjust -1 for dates before March in leap years?


Yup. The designers of these kind of day of the week systems generally design as if the year started on March 1, so leap year shenanigans just mess with the last day of the year. They take that into account in their formulas for the century-based and year-based terms of the formulas so that each March 1 will be the right number of days after the previous March 1.

That way when using the system you don't have to care about leap years except during January and February. The formulas always give February 28th as the day before March 1 which in leap years is one day too late because of February 29th, and so as you surmised you need to adjust by -1 for dates in those months.


Reading the article, I wandered into the difference of Old Style and New Style dates and what happened in 1752.

From [1]: By the 18th century, the English legal year – used for legal, financial and other civil purposes – had for centuries begun on 25 March, or Lady Day.[13][i] Thus, for example, 24 March 1707 was immediately followed by 25 March 1708, while the day following 31 December 1708 was 1 January 1708, with 1709 still nearly three months away.

Thank goodness that happened.

[1] https://en.m.wikipedia.org/wiki/Calendar_(New_Style)_Act_175...


To this day the UK tax year still begins on April 6th, for reasons [1] that have to do with the migration from Julian to Gregorian calendars almost 300 years ago. I wonder if other countries have so many of these legacy patches from ye olden times.

[1] https://theconversation.com/why-the-uk-tax-year-begins-on-ap...


Though note the wiki page for Carroll's method[1] states:

    1676, February 23
    ...
    Dates before 1752 would in England be given Old Style with 25 March as the
    first day of the new year. Carroll's method however assumes 1 January as
    the first day of the year, thus he fails to arrive at the correct answer,
    namely "Friday".
    ...
    It is noteworthy that those who have republished Carroll's method have
    failed to point out his error"
Indeed, the linked article has this flaw, too (:

[1] https://en.wikipedia.org/wiki/Determination_of_the_day_of_th...


The linux `cal` utility has special handling to recognize September 1752:

https://github.com/util-linux/util-linux/blob/9f15d2de811773...


I just typed "cal 1752" and got a calendar with a September that has no dates between Wednesday the 2nd and Thursday the 14th.

Although disputed by some, apparently the switch to the Gregorian calendar is also the basis for "April Fools' Day."

https://en.wikipedia.org/wiki/April_Fools%27_Day

https://en.wikipedia.org/wiki/Gregorian_calendar


I've been amused by this for a while, although I think when I first saw it I didn't realize that there was so much country-to-country variation in what year the Gregorian calendar was legally adopted.

Maybe a better (or much worse!) behavior would be to show the switch in the current locale, so in ru_RU it happens in 1918, but in es_ES (or es_MX, es_CO, es_AR, es_PY, ...) it happens in 1582.


The Romans also used the March-based year; that’s why February has fewer days and why October is literally the eighth month


September-October-November-December: 7-8-9-10

And July used to be Quintilis (5) and August was Sextilis (6), but then Julius Cesar and Emperor Augustus came.. and got their own month names.


Not just a year starting in March, a year with 10 months -- and 304 days.

It was quite frosty that June and people were hoping for a warm summer come December.


Yes, I have been following Pepys (17th century) and the dates confused me a lot until I got the hang of it.


I'm having trouble following the algorithm for the month number.

From the article:

The Month-Item. — If it begins or ends with a vowel, subtract the number, denoting its place in the year, from 10. This, plus its number of days, gives the item for the following month. The item for January is ‘0’; for February or March (the 3rd month), ‘3’; for December (the 12th month), ’12.’ [So, for clarity, the required final numbers after division by 7 are January, 0; February, 3; March, 3; April, 6; May, 1; June, 4; July, 6; August 2; September, 5; October, 0; November, 3; and December, 5.]

My attempt to implement:

For January, the preceding month is December, which neither begins nor ends with a vowel, so I do not subtract 10. The days in December are 31, so 12+31 = 43 mod 7 = 1, not the 0 of the article.

For February, the preceding month is January, which ends in a vowel, so I subtract 1 from 10, giving 9, add the days in January 1+31 = 32 mod 7 = 4, not the 3 of the article.

For March, the preceding month is February, which ends in a vowel, so I subtract 2 from 10 giving 8 and add February's 28 days 8+28 = 36 mod 7 = 1, not the 3 of the article. Had I used a leap year 29 for the days in February at this step the result would be 2, which still does not match the article result. Since the article has a constant result for March, it is either always using 28 or always using 29 days in February.

For April, the preceding month is March, which neither begins nor ends in a vowel so I do not subtract it from 10. 31 days in March gives 3+31 = 34 mod 7 = 6, which does match the article result.

For May, the preceding month is April, which starts with a vowel, so I subtract its position from 10, 10-4 = 6, add April's 30 days 6+30 = 36 mod 7 = 1 which does match the article.

For June, the preceding month is May, ending in a vowel, so I subtract May's 5 from 10, and adding May's 31 days gives 5+31= 36 mod 7 = 1 which does not match the article.

This should suffice to illustrate my misunderstanding; what have I got wrong?

[edit: typos]


January -- The item for January is ‘0’ = 0

February, March -- The item ... for February or March (the 3rd month), ‘3’ = 3

December -- The item ... for December (the 12th month), ’12.’

So these all use fixed values.

The `(10-place)+days mod 7` logic works for May, July, September, and November using the previous month's values -- effectively every other month. The vowel trick is likely a nmemonic for not having to remember which months to do this for.

The other months are the previous month's `item+days mod 7`, although it is unclear where this interpretation is deduced. -- The "If it begins or ends with a vowel, subtract the number, denoting its place in the year, from 10." text does not apply, so I would have assumed that is was 0 not the calculated item value. Thus, I would have expected it to just use the days in month.


I struggled with this too. The best understanding I've been able to come to is this:

1. Every month's item number can be calculated from the preceding month's item number by the method given. I.e. add the number of days in the preceding month to the preceding month's item number then take mod 7.

2. For January we take it that there is no preceding month. Therefore the numbers in such a calculation are all zero, so we end up with zero.

3. For later months you don't need to start at January and go month by month to the month you want; you can start at a month with a start- or end-vowel and use the shortcut that such a month's item number is ten minus the month number.

4. For the purposes of 3, 'y' does not count as a vowel.

Or maybe it's easier just to learn them!


Also had this issue. I even tried a bunch of different reformulations/reinterpretation of the provided formula and nothing helped :(


Perhaps if someone who gets the language did it for today's date, we'd both get some clarity. I've tried working backwards but the labyrinthine explanation doesn't project


Carroll's algorithm has evolved over the years. The First Sunday Doomsday Algorithm (https://firstsundaydoomsday.blogspot.com/2009/12/quick-start...) includes all the improvements published as of 2023, including Fong & Walters' nifty "odd+11" rule for calculating the year code (https://arxiv.org/abs/1010.0765).


I did a write-up of (what I think is) a more straightforward way to do this here: https://gcanyon.wordpress.com/2013/04/09/a-better-way-to-cal...


It's really interesting watching Art Benjamin do this in his TED talk[0] ... if you watch closely you can see him keeping track of the intermediate calculations in his hand movements.

Very clever, and obvious once you know.

[0] https://www.ted.com/talks/arthur_benjamin_a_performance_of_m... ... starts at 7:47


So Lewis Carroll's method for today (May 24 2024):

The Century-Item:

The year is 2024. The century is 20.

20/4 = 5, with no remainder. Overplus is 0. 3-0 = 3. 3x2 = 6.

The Year-Item:

The year part is 24. Number of dozens: 2

24/12=2. Overplus: 24 mod 12 = 0. Number of 4's in the overplus: 0. 2+0+0 = 2.

The Month-Item: May: 1 (from the text).

The Day-Item: The day is 24.

Adding all items:

6+2+1+24=33. 33 mod 7 = 5, which is Friday.


> The Month-Item: May: 1 (from the text).

This was the part I as hoping you'd write out :) I can't make heads or tails of the explanation.


Agreed. I don't get from the explanation how March is 3 and May is 1, as they are both 31 days and neither begins nor end with a vowel. I assumed there was some missing text about what to do if the month doesn't begin or end with a vowel.


To people who say that notation doesn't matter, this is what all mathematics was like before we got our new better notation.

I'd go as far as saying that in mathematics little other than notation matters and the same is true in computer science.

This is why lisp like languages are the obvious choice when variables are explicit.


Chess was like that too. Consider a game where the first move was for white to move the knight that is closest to the white king to the square that is two squares forward and one square to the left of where the knight started.

Here's how that move would have been written at various times from the 17th century to the present [1].

Early 1600s: The white king commands his owne knight into the third house before his owne bishop.

Mid-1700s: K. knight to His Bishop's 3d.

Early 1800s: K.Kt. to B.third sq.

Around 1850: K.Kt to B's 3rd.

Around 1860: K.Kt to B. 3d.

Around 1870: K.Kt to B3.

Around 1890: KKt-B3.

Early 1900s: Kt-KB3.

Mid 1900s: N-KB3.

Last quarter of 1900s to present: Nf3 or if you want to avoid language-specific piece names ♘f3.

[1] https://www.knightschessclub.org/the_history_of_notation.htm...


If he could do it in 20 seconds I would call that remarkable!

He didn't consider himself a "rapid computer".


His benchmark would have been other Oxbridge Dons teaching mathematics . .


# (jim) C:\Users\Jim>python dow.py

# Enter a date (yyyy-mm-dd): 2024-05-24

# The day of the week for 2024-05-24 is Friday.

def compute_day_of_week(date):

    day, month, year = date
    century = year // 100
    year_part = year % 100

    # Compute Century-Item
    if year < 1752 or (year == 1752 and (month < 9 or (month == 9 and day < 14))):
        century_item = (18 - century) % 7
    else:
        century_item = ((3 - (century % 4)) * 2) % 7
    
    # Compute Year-Item
    year_item = (year_part + (year_part // 4)) % 7
    
    # Compute Month-Item
    month_items = [0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5]
    month_item = month_items[month - 1]
    
    # Compute Day-Item
    day_item = day % 7
    
    # Total
    total = (century_item + year_item + month_item + day_item) % 7
    
    # Correction for Leap Year
    if month <= 2 and (year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)):
        total = (total - 1 + 7) % 7
    
    return total
def day_of_week_string(day_index):

    days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
    return days[day_index]
# Prompt for the date

date_input = input("Enter a date (yyyy-mm-dd): ")

year, month, day = map(int, date_input.split('-'))

date = (day, month, year)

# Compute and print the day of the week

day_index = compute_day_of_week(date) day_name = day_of_week_string(day_index) print(f"The day of the week for {date_input} is {day_name}.")


Including 1752 is problematic, in the British Empire, it was the only year with 355 days, as September 3–13 were skipped when the Empire adopted the Gregorian calendar.

These skipped days were a rolling problem across the world, when they were applied varied by country and religion of the recorder of historic accounts - they were by no means uniformly applied in the same year across the planet.


I like the story of how the portuguese sailed east, and the spanish sailed west, and by the time they met each other (Macau trading with Manila?) there was a day dislocation between the two empires. Nowadays we have timezones and an International Date Line* to solve the underlying issue, but back then it seems as if no one was surprised that calendars would be off by certain numbers of days between ports, and merely took it in stride.

Lagniappe: https://en.wikipedia.org/wiki/List_of_adoption_dates_of_the_...

* shout out to Kiribati (UTC+14)! I'd like to think the bronze age danes rocked their string skirts in much the same way the Kiribati do their "grass" [pandanus] ones. https://www.youtube.com/watch?v=ZUhs1TdHMt0


You are right. This code would not be accurate for many regions in the year they transitioned from the Julian to the Gregorian calendar



What a pain.

We really should just declared the year to be 360 days long, with 12 months, 30 days each, split into 6 day long weeks. The extra 5 days? Everybody take a vacation. Leap days go in there too somehow. Every month starts with a Monday and ends with a Sunday. Wednesday will be removed because it was no good anyway.


I love very confident explanations that use the word "somehow" as if we're just supposed to ignore it. It adds to the humor


You would think a professional writer would be able to describe straightforward arithmetic in a coherent way.


For the part that depends on the last two digits of the year I use a method that I've not seen anywhere else. It is algorithmically more work than Conway's method (Y + Y//4, where Y is the last two digits of the year and // is integer division rounding positive results down), but I think is easier for quick mental computation for most people.

Let Y = 10 T + U, i.e., T is the first digit of the two digit year and U is the second digit.

If T is even, the year part is:

  2 T + U       if U = 0, 1, 2, or 3
  2 T + U + 1   if U = 4, 5, 6, or 7
  2 T + U + 2   if U = 8 or 9
If T is odd:

  3 + 2 T + U       if U = 0 or 1
  3 + 2 T + U + 1   if U = 2, 3, 4, or 5
  3 + 2 T + U + 2   if U = 6, 7, 8 or 9
Algorithmically I compute it something like this:

  Compute 2 T + U
  If T is even
      Add 1 if T >= 4 and add another 1 if T >= 8
  else
      Add 3
      Add 1 if T >= 2 and add another 1 if T >= 6
Those add 1s come from the way leap years are distributed within decades. The 2 T + U takes into account any leap years when U = 0. The add 1s are to take care of the leap years that happen when U != 0. In even decades those occur at 4 and 8, and in odd decades they occur at 2 and 6.

Example: for 2024, T=2 and U=4. Mentally my train of thought would be:

  2 doubles to 4, plus 4 = 8 = 1 mod 7, even decade so add 1 for 4 <= T < 8 giving 2.
For that example there is not really easier than Conway's Y + Y//4, which would be 24 + 6 = 30 = 2 mod 7.

Example: for 2099, T = 9 and U = 9. Mentally that goes something like this:

  9 = 2 mod 7 doubles to 4, add 9 = 2 mod 7 giving 6
  T was odd so add 3 giving 9 = 2 mod 7
  T was odd so the so there were leap years at 2 and 6, which each add 1
  That gives us 4
I find that easier that Conway's 99 + 99/4. I can do that, and at decent speed, but I can make mistakes.

With my method you never have to deal with a number above 32, and that's only if you do no reductions mod 7 along the way. If you reduce mod 7 whenever you can you never have to deal with anything above 12.

Note: when reducing mod 7 along the way it is crucial to remember that whether you take the T is even case or the T is odd case depends on the actual value of T. E.g., when I am doing 2099 I reduce both T and U to 2 right away but first note that 9 is odd so will need to take the odd case.


This is why we need the international fixed calendar!!

https://en.m.wikipedia.org/wiki/International_Fixed_Calendar



Neat but what is this useful for?


Making people think you're smarter than you are. That's about it.


What do you mean, what knowing the day of week a date is useful for ?


Yes, that's what people typically use a calendar for. So you agree that this trick isn't useful for anything?


I'm reminded of the scene in Back To The Future II in which people in the 19th century scoffed that someday someone might "run for fun" despite the ubiquity of motorized transportation.


Can an LLM come up with a novel algorithm for this?


plenty of non-pedophiles did a lot more interesting work, not sure why we have to even mention him.




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

Search: