1 คะแนน โดย GN⁺ 2024-05-26 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ความคิดเห็น

 
GN⁺ 2024-05-26
ความคิดเห็นใน 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=4
    • คำอธิบายนี้จำได้ทันที แต่พอลองกับ 7 กุมภาพันธ์ 2032 จะได้ 20+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]
    • วิธีของ Lewis Carroll ดูเรียบง่ายและเร็วกว่าเยอะ ฉันเลยไม่ค่อยเห็นว่าวิธีนี้มีข้อดีเหนือกว่านั้นตรงไหน และดูเหมือนความซับซ้อนจะเพิ่มขึ้นพอสมควร
  • พออ่านบทความก็เลยไปค้นเรื่องความต่างระหว่างวันที่แบบ Old Style/New Style และสิ่งที่เกิดขึ้นในปี 1752 ตาม Calendar (New Style) Act 1750 จนถึงศตวรรษที่ 18 ตามกฎหมายของอังกฤษ ปีใหม่เริ่มต้นในวันที่ 25 มีนาคม หรือ Lady Day มาหลายศตวรรษ
    ดังนั้นตัวอย่างเช่น วันที่ 24 มีนาคม 1707 วันถัดไปทันทีคือ 25 มีนาคม 1708 และหลังวันที่ 31 ธันวาคม 1708 วันถัดไปก็ยังคงเป็น 1 มกราคม 1708 โดยปี 1709 จะมาอีกเกือบสามเดือนให้หลัง ดีจริง ๆ ที่มีการเปลี่ยนแปลง

    • เหตุผลที่ ปีภาษี ของสหราชอาณาจักรยังเริ่มในวันที่ 6 เมษายนจนถึงทุกวันนี้ ก็เกี่ยวข้องกับการเปลี่ยนจากปฏิทินจูเลียนเป็นเกรกอเรียนเมื่อเกือบ 300 ปีก่อน: https://theconversation.com/why-the-uk-tax-year-begins-on-april-6-its-a-very-strange-tale-57247
      ฉันสงสัยว่าประเทศอื่น ๆ ก็ยังมีแพตช์มรดกจากอดีตแบบนี้เหลืออยู่อีกมากไหม
    • หน้า wiki ของวิธี Carroll ที่ Lewis Carroll's method ก็ยกตัวอย่างวันที่ 23 กุมภาพันธ์ 1676 และอธิบายว่าวันที่ในอังกฤษก่อนปี 1752 เขียนแบบ Old Style ที่ถือให้วันที่ 25 มีนาคมเป็นวันแรกของปี
      แต่เนื่องจากวิธีของ Carroll สมมติให้วันที่ 1 มกราคมเป็นวันแรกของปี จึงไปไม่ถึงคำตอบที่ถูกต้องคือ “Friday” น่าสนใจที่คนซึ่งนำวิธีของ Carroll มาตีพิมพ์ซ้ำไม่ได้ชี้ให้เห็นข้อผิดพลาดนี้ และบทความที่ลิงก์ไว้ก็มีข้อบกพร่องเดียวกัน
    • ยูทิลิตี cal ของ Linux มีการจัดการกรณีพิเศษสำหรับ กันยายน 1752 อยู่: https://github.com/util-linux/util-linux/blob/9f15d2de8117732845b2e891a2d24d987ee4e3ed/misc-utils/cal.c#L1079
    • พอลองรัน cal 1752 ก็เห็นว่าในปฏิทินเดือนกันยายน วันที่ระหว่างวันพุธที่ 2 กับวันพฤหัสบดีที่ 14 หายไป
      แม้จะยังมีข้อถกเถียง แต่ก็มีคำอธิบายว่าการเปลี่ยนมาใช้ปฏิทินเกรกอเรียนคือที่มาของ April Fools' Day: https://en.wikipedia.org/wiki/April_Fools%27_Day, https://en.wikipedia.org/wiki/Gregorian_calendar
    • โรมันก็เคยนับปีโดยยึดเดือนมีนาคมเป็นหลักเช่นกัน จึงเป็นเหตุผลว่าทำไมเดือนกุมภาพันธ์ถึงมีวันน้อย และ October จึงมีความหมายตามตัวอักษรว่าเป็นเดือนที่แปด
  • ตาม วิธีคำนวณหมวดของเดือน ในบทความนั้นเข้าใจตามได้ยาก บทความอธิบายว่าถ้าเป็นเดือนที่ขึ้นต้นหรือลงท้ายด้วยสระ ให้นำลำดับของเดือนนั้นในปีไปลบออกจาก 10 แล้วบวกจำนวนวันของเดือนนั้นเข้าไป ก็จะได้หมวดของเดือนถัดไป
    แต่เดือนก่อนหน้า January คือ December ซึ่งไม่ได้ขึ้นต้นหรือลงท้ายด้วยสระ จึงไม่ควรลบจาก 10 และควรได้ 12+31 ≡ 1 แต่ในบทความกลับเป็น 0 ส่วน February ก็เพราะ January ลงท้ายด้วยสระ จึงน่าจะเป็น 10-1+31 ≡ 4 แต่บทความบอกว่าเป็น 3 และ March ก็ยังคำนวณไม่ตรงถ้าอิงจาก February
    April กับ May ถูกต้อง แต่ June ก็กลับไม่ตรงอีก เลยไม่แน่ใจว่าตัวเองเข้าใจอะไรผิดไป

    • ดูเหมือนว่า January จะเป็นค่าคงที่ 0, February กับ March เป็นค่าคงที่ 3 และ December ก็ดูเหมือนจะถือเป็นค่าคงที่ที่บทความให้มาโดยตรง
      ตรรกะ (10-ลำดับ)+จำนวนวัน mod 7 ดูจะใช้ได้กับแค่บางเดือนสลับเดือนอย่าง May, July, September, November หากอิงจากเดือนก่อนหน้า และกฎเรื่องสระก็ดูใกล้เคียงกับเป็น ตัวช่วยจำ สำหรับจำว่าควรใช้การคำนวณนี้กับเดือนไหนมากกว่า ส่วนเดือนที่เหลือดูเหมือนจะใช้ item+days mod 7 ของเดือนก่อนหน้า แต่ก็ยังไม่ชัดว่าตีความแบบนี้ได้มาจากตรงไหนในบทความ
    • ฉันก็ติดตรงนี้เหมือนกัน และความเข้าใจที่ดูสมเหตุสมผลที่สุดคือแบบนี้ หมายเลขหมวดของทุกเดือนคำนวณได้จากการเอาหมายเลขหมวดของเดือนก่อนหน้ามาบวกจำนวนวันของเดือนก่อนหน้า แล้วหา 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 จึงเป็นวันศุกร์

    • ฉันคาดหวังให้มีการอธิบายขยายความตรงที่ May=1 ด้วย ต่อให้อ่านคำอธิบายแล้วก็ยังไม่เข้าใจเลย
  • สำหรับคนที่บอกว่าสัญกรณ์ไม่สำคัญ ฉันอยากบอกว่าคณิตศาสตร์ก่อนจะได้สัญกรณ์ใหม่ที่ดีกว่านี้ก็มีสภาพแบบนี้แทบทั้งหมด
    ถึงขั้นพูดได้เลยว่าในคณิตศาสตร์แทบไม่มีอะไรสำคัญไปกว่าสัญกรณ์ และวิทยาการคอมพิวเตอร์ก็เช่นกัน นี่เองคือเหตุผลที่ภาษาในตระกูล Lisp เป็นตัวเลือกที่เห็นได้ชัดเมื่อมีการระบุตัวแปรอย่างชัดเจน

    • หมากรุกก็เป็นแบบนั้น ลองนึกถึงการเดินที่ฝ่ายขาวย้ายม้าซึ่งอยู่ใกล้คิงขาวที่สุดไปยังช่องที่อยู่ข้างหน้าสองช่องและทางซ้ายหนึ่งช่องจากจุดเริ่มต้น จะเห็นว่าสัญกรณ์ของการเดินนี้สั้นลงเรื่อยๆ ตั้งแต่ศตวรรษที่ 17 จนถึงปัจจุบัน
      ต้นคริสต์ศตวรรษที่ 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 วินาทีก็ถือว่าน่าทึ่งแล้ว เขาเองก็ไม่ได้มองว่าตัวเองเป็น นักคำนวณเร็ว

    • คนที่เขาใช้เป็นมาตรฐานเปรียบเทียบน่าจะเป็นศาสตราจารย์คนอื่นๆ ที่สอนคณิตศาสตร์ใน Oxbridge
  • ลองเขียนสคริปต์ Python สำหรับคำนวณวันในสัปดาห์ แล้วใส่ 2024-05-24 ก็ได้ Friday ออกมา วิธีคือเอาหมวดศตวรรษ หมวดปี อาร์เรย์หมวดเดือน และหมวดวันมาบวกกัน แล้วใช้การปรับปีอธิกสุรทินสำหรับเดือน 1~2
    ก่อนวันที่ 14 กันยายน 1752 จะใช้หมวดศตวรรษอีกแบบหนึ่ง

    • การรวม ปี 1752 เข้าไปด้วยเป็นเรื่องชวนปวดหัว ในจักรวรรดิอังกฤษมีการข้ามวันที่ 3~13 กันยายนไปตอนเปลี่ยนมาใช้ปฏิทินเกรกอเรียน ทำให้ปีนั้นเป็นปีเดียวที่มีเพียง 355 วัน
      วันที่ที่หายไปเหล่านี้ไม่ได้ถูกใช้พร้อมกันทั่วโลก และเวลาที่แต่ละแห่งเปลี่ยนมาใช้ก็แตกต่างกันตามประเทศและศาสนาของผู้บันทึก จึงยังเป็นปัญหาชวนปวดหัวในการอ่านบันทึกประวัติศาสตร์ต่อไป