Lewis Carroll – เทคนิคคำนวณวันในสัปดาห์ของวันที่หนึ่ง ๆ (1887)
(futilitycloset.com)- Lewis Carroll เสนอขั้นตอนหา วันในสัปดาห์ด้วยการคิดในใจ สำหรับวันที่ใด ๆ ในจดหมายที่ส่งถึง Nature เมื่อวันที่ 31 มีนาคม 1887
- แยกวันที่ออกเป็น 4 รายการคือ ศตวรรษ·ปี·เดือน·วัน แล้วนำมาบวกกัน โดยระหว่างคำนวณให้เหลือไว้เฉพาะเศษจากการหารด้วย 7 เพื่อลดความซับซ้อน
- Carroll ระบุว่าแม้แต่เขาเองก็ใช้เวลาเฉลี่ยประมาณ 20 วินาที และมองว่านักคำนวณที่รวดเร็วน่าจะทำได้ภายใน 15 วินาที
- กฎประกอบด้วยความแตกต่างระหว่าง Old Style และ New Style, การปรับแก้ปีอธิกสุรทิน, และค่าประจำเดือน โดยตีความค่าผลลัพธ์สุดท้ายเป็น 0=Sunday, 1=Monday ตามลำดับ
- ในตัวอย่างการคำนวณ วันที่ 18 กันยายน 1783 ได้เป็น Thursday และวันที่ 23 กุมภาพันธ์ 1676 หลังปรับแก้ปีอธิกสุรทินแล้วได้เป็น Wednesday
วิธีแบ่งวันที่ออกเป็นสี่รายการ
- Lewis Carroll นำเสนอวิธีหา วันในสัปดาห์ของวันที่หนึ่ง ๆ ด้วย การคำนวณในใจ ในจดหมายประจำวันที่ 31 มีนาคม 1887 ที่ส่งถึง Nature
- แบ่งวันที่อินพุตออกเป็นสี่ส่วน
- Century-Item: สองหลักแรกของปี
- Year-Item: ปีหลังจากศตวรรษ
- Month-Item: เดือน
- Day-Item: วันที่ในเดือนนั้น
- คำนวณแต่ละรายการแล้วบวกเข้ากับผลรวมสะสม และถ้ารายการหรือผลรวมเกิน 7 ให้คงไว้เฉพาะ เศษจากการหารด้วย 7
กฎการคำนวณของแต่ละรายการ
-
Century-Item
- ถือว่า Old Style สิ้นสุดในวันที่ 2 กันยายน 1752 และนำค่าศตวรรษไปลบออกจาก 18
- ถือว่า New Style เริ่มในวันที่ 14 กันยายน 1752 ให้นำเศษจากการหารค่าศตวรรษด้วย 4 ไปลบออกจาก 3 แล้วคูณด้วย 2
- เช่น Century-Item ของปี 1811 ใช้ 18 ซึ่งเป็นสองหลักแรก
-
Year-Item
- นำจำนวนชุดของ 12 ในปีหลังจากศตวรรษ, ค่าที่เหลือ, และจำนวนชุดของ 4 ในค่าที่เหลือนั้นมาบวกกัน
-
Month-Item
- หากชื่อเดือนขึ้นต้นหรือลงท้ายด้วยสระ ให้นำลำดับของเดือนนั้นในปีไปลบออกจาก 10
- เมื่อนำจำนวนวันของเดือนนั้นมาบวก จะได้ค่ารายการของเดือนถัดไป
- ค่ารายเดือนที่ใช้หลังหารด้วย 7 มีดังนี้
- January 0, February 3, March 3, April 6, May 1, June 4
- July 6, August 2, September 5, October 0, November 3, December 5
-
Day-Item
- ใช้ตัววันที่ในเดือนนั้นเอง
-
การปรับแก้ปีอธิกสุรทิน
- หากวันที่อยู่ใน January หรือ February ของปีอธิกสุรทิน ให้ลบ 1 ออกจากผลรวมสุดท้าย
- หากผลรวมเป็น 0 ให้บวก 7 ก่อนแล้วจึงลบ 1
- ปีอธิกสุรทินคือปีที่หารด้วย 4 ลงตัว แต่ใน New Style ปีศตวรรษจะเป็นข้อยกเว้นหากจำนวนศตวรรษหารด้วย 4 ไม่ลงตัว
- ตัวอย่างเช่น ปี 1800 เข้าข้อยกเว้นนี้ใน New Style
- ตีความผลลัพธ์สุดท้ายเป็นหมายเลขวันในสัปดาห์ โดย 0 คือ Sunday, 1 คือ Monday และวันถัด ๆ ไปเรียงตามลำดับ
ตัวอย่างการคำนวณและแหล่งที่มา
- ผลการคำนวณของวันที่ 18 กันยายน 1783 คือ Thursday
- วันที่ 23 กุมภาพันธ์ 1676 หลังการปรับแก้ปีอธิกสุรทินแล้วได้เป็น Wednesday
- ขั้นตอนนี้ถ่ายทอดผ่าน Rediscovered Lewis Carroll Puzzles ของ Edward Wakeling, 1995
1 ความคิดเห็น
ความคิดเห็นใน Hacker News
วิธีนี้คล้ายกับวิธีที่ฉันใช้มาก และพอคุยกับ Art Benjamin ก็พบว่าเขาใช้วิธีคล้ายกันด้วย ทำให้เสร็จภายใน 10~15 วินาที ได้ไม่ยาก แต่ต้องอาศัยการฝึก การท่องจำเพียงเล็กน้อย และการคิดเลขในใจนิดหน่อย
ฉันยังใช้มันบ่อย ๆ เพื่อรักษาความชำนาญไว้ และพอชำนาญแล้วมันกลับมีประโยชน์อย่างน่าประหลาด เลยยังใช้ต่อไป J. H. Conway ใช้อีกเทคนิคหนึ่งคือ Doomsday rule และเวลาคำนวณวันที่ของปีนี้ฉันก็เปลี่ยนไปใช้แบบนั้น มันเร็วและง่ายกว่า แต่การหา “Doomsday” ของปีอื่นยากกว่า ดังนั้นในกรณีนั้นฉันก็กลับมาใช้วิธีเดิม
ตัวอย่างเช่น 2024/05/24 คือผ่านไป 12 ปีจากปี 2012, มีปีอธิกสุรทิน 3 ครั้ง, เลขมหัศจรรย์ของเดือนพฤษภาคมคือ 2, แล้วบวกวันที่ 24 และนำไป mod 7 จะได้
(12+3+2+24)=6ซึ่งก็คือวันศุกร์ โดย เลขมหัศจรรย์ ของแต่ละเดือนสามารถท่องเป็น144 / 025 / 036 / 146ได้ และถ้าจำเป็นก็ยังคำนวณจากหลักการได้ด้วย144 : Jan, Feb, Marเข้าใจได้ว่าแปลว่า Jan=1, Feb=4, Mar=420+5+4+7 ≡ 1เลยคาดว่าจะเป็นวันอาทิตย์ ทั้งที่จริงเป็นวันเสาร์ เพราะปี 2032 เป็นปีอธิกสุรทินและวันดังกล่าวอยู่ก่อนวันที่ 29 กุมภาพันธ์ในกรณีแบบนี้ คือก่อนหรือในวันที่ 29 กุมภาพันธ์ของปีอธิกสุรทิน ต้องลบ 1
0, 1, -1, 0, 0, 1, 1, 2, 3, 3, 4, 4คือ ออฟเซ็ต ระหว่างลำดับวันของวันที่ 1 ของแต่ละเดือนในปี กับลำดับวันที่จะได้ถ้าสมมติว่าเดือนก่อนหน้าทุกเดือนมี 30 วันเท่ากันตัวอย่างเช่น ถ้า 11 เดือนแรกมี 30 วันหมด วันที่ 25 ธันวาคมจะเป็นวันที่
30×11+25=355ของปี และเมื่อนำออฟเซ็ตตัวที่ 12 คือ 4 มาบวก จะได้วันที่จริงลำดับที่ 359 ลำดับออฟเซ็ตนี้จำง่าย และเมื่อจำได้แล้ว เลขมหัศจรรย์รายเดือนจะได้จากMagic(n)=2n+Offset(n)+cสำหรับเลขมหัศจรรย์
1 4 4 0 2 5 0 3 6 1 4 6จะมีc=-1และเดือนธันวาคมจะเป็น2×12+4-1 ≡ 6 (mod 7)ในทางกลับกัน ยังสามารถคำนวณMagic(n)-2n-cจากเลขมหัศจรรย์ที่จำไว้เพื่อกู้ออฟเซ็ตกลับมาได้เช่นกัน โดยแค่จำว่าออฟเซ็ตอยู่ในช่วง[-1,4]พออ่านบทความก็เลยไปค้นเรื่องความต่างระหว่างวันที่แบบ Old Style/New Style และสิ่งที่เกิดขึ้นในปี 1752 ตาม Calendar (New Style) Act 1750 จนถึงศตวรรษที่ 18 ตามกฎหมายของอังกฤษ ปีใหม่เริ่มต้นในวันที่ 25 มีนาคม หรือ Lady Day มาหลายศตวรรษ
ดังนั้นตัวอย่างเช่น วันที่ 24 มีนาคม 1707 วันถัดไปทันทีคือ 25 มีนาคม 1708 และหลังวันที่ 31 ธันวาคม 1708 วันถัดไปก็ยังคงเป็น 1 มกราคม 1708 โดยปี 1709 จะมาอีกเกือบสามเดือนให้หลัง ดีจริง ๆ ที่มีการเปลี่ยนแปลง
ฉันสงสัยว่าประเทศอื่น ๆ ก็ยังมีแพตช์มรดกจากอดีตแบบนี้เหลืออยู่อีกมากไหม
แต่เนื่องจากวิธีของ Carroll สมมติให้วันที่ 1 มกราคมเป็นวันแรกของปี จึงไปไม่ถึงคำตอบที่ถูกต้องคือ “Friday” น่าสนใจที่คนซึ่งนำวิธีของ Carroll มาตีพิมพ์ซ้ำไม่ได้ชี้ให้เห็นข้อผิดพลาดนี้ และบทความที่ลิงก์ไว้ก็มีข้อบกพร่องเดียวกัน
calของ Linux มีการจัดการกรณีพิเศษสำหรับ กันยายน 1752 อยู่: https://github.com/util-linux/util-linux/blob/9f15d2de8117732845b2e891a2d24d987ee4e3ed/misc-utils/cal.c#L1079cal 1752ก็เห็นว่าในปฏิทินเดือนกันยายน วันที่ระหว่างวันพุธที่ 2 กับวันพฤหัสบดีที่ 14 หายไปแม้จะยังมีข้อถกเถียง แต่ก็มีคำอธิบายว่าการเปลี่ยนมาใช้ปฏิทินเกรกอเรียนคือที่มาของ April Fools' Day: https://en.wikipedia.org/wiki/April_Fools%27_Day, https://en.wikipedia.org/wiki/Gregorian_calendar
ตาม วิธีคำนวณหมวดของเดือน ในบทความนั้นเข้าใจตามได้ยาก บทความอธิบายว่าถ้าเป็นเดือนที่ขึ้นต้นหรือลงท้ายด้วยสระ ให้นำลำดับของเดือนนั้นในปีไปลบออกจาก 10 แล้วบวกจำนวนวันของเดือนนั้นเข้าไป ก็จะได้หมวดของเดือนถัดไป
แต่เดือนก่อนหน้า January คือ December ซึ่งไม่ได้ขึ้นต้นหรือลงท้ายด้วยสระ จึงไม่ควรลบจาก 10 และควรได้
12+31 ≡ 1แต่ในบทความกลับเป็น 0 ส่วน February ก็เพราะ January ลงท้ายด้วยสระ จึงน่าจะเป็น10-1+31 ≡ 4แต่บทความบอกว่าเป็น 3 และ March ก็ยังคำนวณไม่ตรงถ้าอิงจาก FebruaryApril กับ May ถูกต้อง แต่ June ก็กลับไม่ตรงอีก เลยไม่แน่ใจว่าตัวเองเข้าใจอะไรผิดไป
ตรรกะ
(10-ลำดับ)+จำนวนวัน mod 7ดูจะใช้ได้กับแค่บางเดือนสลับเดือนอย่าง May, July, September, November หากอิงจากเดือนก่อนหน้า และกฎเรื่องสระก็ดูใกล้เคียงกับเป็น ตัวช่วยจำ สำหรับจำว่าควรใช้การคำนวณนี้กับเดือนไหนมากกว่า ส่วนเดือนที่เหลือดูเหมือนจะใช้item+days mod 7ของเดือนก่อนหน้า แต่ก็ยังไม่ชัดว่าตีความแบบนี้ได้มาจากตรงไหนในบทความสำหรับ January นั้นไม่มีเดือนก่อนหน้า จึงถือให้ทุกอย่างเป็น 0 และผลลัพธ์ก็เป็น 0 ไปด้วย ไม่จำเป็นต้องคำนวณไล่จาก January ทุกครั้งจนถึงเดือนที่ต้องการ เพราะสำหรับเดือนที่ขึ้นต้นหรือลงท้ายด้วยสระ สามารถใช้ทางลัดว่าหมายเลขหมวดของเดือนนั้นคือ
10-เลขเดือนได้ โดยในที่นี้yไม่นับเป็นสระ หรือไม่ก็อาจจะจำตรงๆ ง่ายกว่าอัลกอริทึมของ Carroll ได้พัฒนาต่อมาตามกาลเวลา First Sunday Doomsday Algorithm(https://firstsundaydoomsday.blogspot.com/2009/12/quick-start-guide.html) รวมการปรับปรุงที่เผยแพร่ถึงปี 2023 และยังมีเกณฑ์ “odd+11” ของ Fong & Walters สำหรับคำนวณรหัสปีด้วย: https://arxiv.org/abs/1010.0765
มีบทความที่สรุปไว้โดยมองว่าเป็นวิธีคำนวณนี้ในแบบที่เข้าใจง่ายกว่า: https://gcanyon.wordpress.com/2013/04/09/a-better-way-to-calculate-the-day-of-the-week/
ช่วงที่ Art Benjamin ทำสิ่งนี้ใน TED talk น่าสนใจมาก ถ้าดูดีๆ จะเห็นว่าเขาใช้ ท่าทางมือ เพื่อติดตามการคำนวณระหว่างทาง
พอรู้แล้วจะดูเหมือนเป็นเรื่องธรรมดา แต่จริงๆ แล้วฉลาดมาก เริ่มที่เวลา 7:47 ใน https://www.ted.com/talks/arthur_benjamin_a_performance_of_mathemagic
ถ้าคำนวณวันนี้คือ 24 พฤษภาคม 2024 ด้วยวิธีของ Lewis Carroll จะได้แบบนี้ หมวดศตวรรษคือศตวรรษที่ 20 จึงเป็น
20/4=5, เหลือเศษ 0,3-0=3,3×2=6หมวดปีคือ
24/12=2, เหลือเศษ 0, จำนวน 4 ที่อยู่ในนั้นมี 0 ดังนั้น2+0+0=2หมวดเดือนตามบทความคือ May=1 และหมวดวันคือ 24 เอาทั้งหมดมาบวกกันได้6+2+1+24=33,33 mod 7 = 5จึงเป็นวันศุกร์สำหรับคนที่บอกว่าสัญกรณ์ไม่สำคัญ ฉันอยากบอกว่าคณิตศาสตร์ก่อนจะได้สัญกรณ์ใหม่ที่ดีกว่านี้ก็มีสภาพแบบนี้แทบทั้งหมด
ถึงขั้นพูดได้เลยว่าในคณิตศาสตร์แทบไม่มีอะไรสำคัญไปกว่าสัญกรณ์ และวิทยาการคอมพิวเตอร์ก็เช่นกัน นี่เองคือเหตุผลที่ภาษาในตระกูล Lisp เป็นตัวเลือกที่เห็นได้ชัดเมื่อมีการระบุตัวแปรอย่างชัดเจน
ต้นคริสต์ศตวรรษที่ 1600 เขียนว่า “The white king commands his owne knight into the third house before his owne bishop.”, กลางคริสต์ศตวรรษที่ 1700 เป็น
K. knight to His Bishop's 3d., ต้นคริสต์ศตวรรษที่ 1800 เป็นK.Kt. to B.third sq., ราวปี 1890 เป็นKKt-B3, กลางคริสต์ศตวรรษที่ 1900 เป็นN-KB3, ปัจจุบันเป็นNf3หรือถ้าอยากเลี่ยงชื่อหมากตามภาษา ก็ใช้♘f3: https://www.knightschessclub.org/the_history_of_notation.htmlถ้าทำได้ภายใน 20 วินาทีก็ถือว่าน่าทึ่งแล้ว เขาเองก็ไม่ได้มองว่าตัวเองเป็น นักคำนวณเร็ว
ลองเขียนสคริปต์ Python สำหรับคำนวณวันในสัปดาห์ แล้วใส่
2024-05-24ก็ได้ Friday ออกมา วิธีคือเอาหมวดศตวรรษ หมวดปี อาร์เรย์หมวดเดือน และหมวดวันมาบวกกัน แล้วใช้การปรับปีอธิกสุรทินสำหรับเดือน 1~2ก่อนวันที่ 14 กันยายน 1752 จะใช้หมวดศตวรรษอีกแบบหนึ่ง
วันที่ที่หายไปเหล่านี้ไม่ได้ถูกใช้พร้อมกันทั่วโลก และเวลาที่แต่ละแห่งเปลี่ยนมาใช้ก็แตกต่างกันตามประเทศและศาสนาของผู้บันทึก จึงยังเป็นปัญหาชวนปวดหัวในการอ่านบันทึกประวัติศาสตร์ต่อไป