7 ms·
Lewis Carroll – computing the day of the week for any given date (1887)
- beardyw 2y agoIf he could do it in 20 seconds I would call that remarkable! He didn't consider himself a "rapid computer".
- defrost 2y agoHis benchmark would have been other Oxbridge Dons teaching mathematics . .
- ColinWright 2y agoThis 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 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.
- deleted 2y ago[deleted]
- jihadjihad 2y ago> which I have swutch to That's a past participle I've never seent before
- purpleyhippo 2y agoSecond guessed myself and had to look up whether this was actually a word
- OJFord 2y agoIf it was phrased 'to which I have swutch' I don't think I'd bat an eyelid! (i.e. past perfect, I think?)
- seabass-labrax 2y agoIf 'swutch' is the (past) participle of 'to switch': Perfect: "to which I have swutch" Pluperfect/past perfect: "to which I had swutch"
- mattmaroon 2y agoGoogle says the correct term is, in fact, Nintendo Switch.
- lotsoweiners 2y ago
- throwaway211 2y agoReading 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_1750#New_Year's_Day https://en.m.wikipedia.org/wiki/Calendar_(New_Style)_Act_175...
- beardyw 2y agoYes, I have been following Pepys (17th century) and the dates confused me a lot until I got the hang of it.
- tomoyoirl 2y agoThe Romans also used the March-based year; that’s why February has fewer days and why October is literally the eighth month
- zrm 2y agoNot 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.
- Tor3 2y agoSeptember-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.
- omoikane 2y agoThe linux `cal` utility has special handling to recognize September 1752: https://github.com/util-linux/util-linux/blob/9f15d2de8117732845b2e891a2d24d987ee4e3ed/misc-utils/cal.c#L1079 https://github.com/util-linux/util-linux/blob/9f15d2de811773...
- gcanyon 2y agoI 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-calculate-the-day-of-the-week/ https://gcanyon.wordpress.com/2013/04/09/a-better-way-to-cal...
- madjack2024 2y ago[flagged]
- ColinWright 2y agoIt'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_mathemagic https://www.ted.com/talks/arthur_benjamin_a_performance_of_m... ... starts at 7:47
- llm_trw 2y agoTo 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.
- tzs 2y agoChess 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.html https://www.knightschessclub.org/the_history_of_notation.htm...
- SamBam 2y agoSo 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.
- digging 2y ago> 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.
- SamBam 2y agoAgreed. 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.
- ot1138 2y agoNeat but what is this useful for?
- Andruru 2y agoWhat do you mean, what knowing the day of week a date is useful for ?
- ot1138 2y agoYes, that's what people typically use a calendar for. So you agree that this trick isn't useful for anything?
- enasterosophes 2y agoI'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.
- IncreasePosts 2y agoMaking people think you're smarter than you are. That's about it.
- bumbledraven 2y agoCarroll's algorithm has evolved over the years. The First Sunday Doomsday Algorithm (https://firstsundaydoomsday.blogspot.com/2009/12/quick-start-guide.html 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 https://arxiv.org/abs/1010.0765).
- tzs 2y agoFor 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.
- thyrsus 2y agoI'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]
- rrgmitchell 2y agoI 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!
- roland35 2y agoThis is why we need the international fixed calendar!! https://en.m.wikipedia.org/wiki/International_Fixed_Calendar https://en.m.wikipedia.org/wiki/International_Fixed_Calendar
- hasbriwn23 2y agoI made an app to learn this - https://grantas33.github.io/Doomsday-algorithm-practice/ https://grantas33.github.io/Doomsday-algorithm-practice/
- shhsshs 2y agohttps://benjoffe.com/weekle https://benjoffe.com/weekle
- bee_rider 2y agoWhat 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.
- dylan604 2y agoI love very confident explanations that use the word "somehow" as if we're just supposed to ignore it. It adds to the humor
- doubloon 2y agoplenty of non-pedophiles did a lot more interesting work, not sure why we have to even mention him.
- brcmthrowaway 2y agoCan an LLM come up with a novel algorithm for this?
- nfw2 2y agoYou would think a professional writer would be able to describe straightforward arithmetic in a coherent way.
- Jimmc414 2y ago# (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}.")
- defrost 2y agoIncluding 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.
- deleted 2y ago[deleted]
- Jimmc414 2y agoYou are right. This code would not be accurate for many regions in the year they transitioned from the Julian to the Gregorian calendar
- 2y ago