1 điểm bởi GN⁺ 2024-05-26 | 1 bình luận | Chia sẻ qua WhatsApp

Phương pháp tính ngày tháng do Lewis Carroll đề xuất

Bức thư Lewis Carroll gửi cho Nature ngày 31 tháng 3 năm 1887:

Tôi gửi đến bạn đọc vì nghĩ rằng có thể gây hứng thú: tôi đã phát hiện ra một cách để tính nhẩm thứ của một ngày cho trước theo phương pháp sau. Tôi không phải người tính nhanh, và trung bình mất khoảng 20 giây để giải những bài như thế này. Vì vậy tôi tin rằng một người tính nhanh sẽ không mất đến 15 giây.

Cách tính

  • Chia ngày đã cho thành 4 phần: thế kỷ, năm, tháng và ngày.
  • Tính 4 hạng mục sau, rồi cộng từng hạng mục vào tổng của hạng mục trước đó. Nếu hạng mục hoặc tổng vượt quá 7, hãy chia cho 7 và chỉ giữ phần dư.

Hạng mục thế kỷ

  • Kiểu cũ (trước ngày 2 tháng 9 năm 1752): lấy 18 trừ đi.
  • Kiểu mới (sau ngày 14 tháng 9 năm 1752): chia cho 4, lấy 3 trừ phần dư, rồi nhân phần dư đó với 2.
  • Ví dụ: với năm 1811, hạng mục thế kỷ là 18.

Hạng mục năm

  • Cộng bội số của 12, phần dư và bội số của 4 của phần dư.

Hạng mục tháng

  • Nếu bắt đầu hoặc kết thúc bằng nguyên âm, lấy vị trí của tháng đó trừ khỏi 10. Cộng thêm số ngày của tháng tương ứng vào giá trị này.
  • Ví dụ: hạng mục của tháng 1 là '0', tháng 2 hoặc tháng 3 là '3', tháng 12 là '12'.
  • Giá trị cuối cùng: tháng 1 là 0, tháng 2 là 3, tháng 3 là 3, tháng 4 là 6, tháng 5 là 1, tháng 6 là 4, tháng 7 là 6, tháng 8 là 2, tháng 9 là 5, tháng 10 là 0, tháng 11 là 3, tháng 12 là 5.

Hạng mục ngày

  • Số ngày trong tháng tương ứng.

Điều chỉnh năm nhuận

  • Nếu là tháng 1 hoặc tháng 2 của năm nhuận, trừ '1' khỏi tổng cuối cùng. Nếu tổng là '0', trước tiên cộng thêm 7.
  • Năm nhuận: năm chia hết cho 4, nhưng theo kiểu mới thì loại trừ những năm tròn thế kỷ không chia hết cho 4 (ví dụ: năm 1800).

Kết quả cuối cùng

  • Kết quả cuối cùng biểu thị thứ trong tuần. '0' là Chủ nhật, '1' là Thứ hai, v.v.

Ví dụ

Ngày 18 tháng 9 năm 1783

  • Hạng mục thế kỷ: 17 chia cho 4 dư '1'. Lấy 3 trừ 1 được '2'. Nhân 2 với 2 được '4'.
  • Hạng mục năm: 83 là 6 tá và 11, tổng là 17. Cộng thêm 2 được 19, chia cho 7 dư '5'. Tổng cộng là 9, chia cho 7 dư '2'.
  • Hạng mục tháng: hạng mục tháng 8 là '10 trừ 8', tức '2'. Hạng mục tháng 9 là '2 cộng 3', tức '5'. Tổng cộng 7, chia cho 7 được '0'.
  • Hạng mục ngày: 18 là '4'.
  • Kết quả cuối cùng: 'Thứ năm'.

Ngày 23 tháng 2 năm 1676

  • Hạng mục thế kỷ: lấy 18 trừ 16 được '2'.
  • Hạng mục năm: 76 là 6 tá và 4, tổng là 10. Cộng thêm 1 được 11, chia cho 7 dư '4'. Tổng cộng là '6'.
  • Hạng mục tháng: hạng mục tháng 2 là '3'. Tổng cộng 9, chia cho 7 dư '2'.
  • Hạng mục ngày: 23 là '2'. Tổng cộng là '4'.
  • Điều chỉnh năm nhuận: '3'.
  • Kết quả cuối cùng: 'Thứ tư'.

(Nguồn: Edward Wakeling, Rediscovered Lewis Carroll Puzzles, 1995.)

Ý kiến của GN⁺

  • Phương pháp tính ngày tháng của Lewis Carroll hữu ích để rèn luyện tư duy toán học.
  • Đây là một cách thú vị để tính ngày tháng mà không cần máy tính.
  • Nếu hiểu các chi tiết như cách tính năm nhuận, bạn có thể đạt kết quả chính xác hơn.
  • So sánh với cách tính lịch hiện đại cũng sẽ rất thú vị.
  • Với những người thích câu đố toán học, đây có thể là một thử thách hấp dẫn.

1 bình luận

 
GN⁺ 2024-05-26
Ý kiến trên Hacker News

Tóm tắt các bình luận trên Hacker News

  • Người dùng A: Phương pháp này rất giống với cách tôi dùng, và cũng là cách Art Benjamin sử dụng. Có thể làm trong 10–15 giây, nhưng cần luyện tập, ghi nhớ một chút và vài phép tính nhẩm đơn giản. Khi thành thạo kỹ thuật này, nó sẽ rất hữu ích.

    • Ví dụ: tính thứ trong tuần của ngày 24 tháng 5 năm 2024
      12 năm sau 2012
      3 năm nhuận
      số tháng ma thuật 2
      ngày 24
      cộng lại rồi lấy phần dư khi chia cho 7: Thứ Sáu
      
  • Người dùng B: JH Conway dùng một kỹ thuật khác, nhanh và dễ hơn khi tính thứ của các ngày trong năm hiện tại. Tuy nhiên, khi tính "Doomsday" của các năm khác thì lại khó hơn, nên cuối cùng quay về phương pháp cơ bản.

  • Người dùng C: Thấy thú vị khi đọc về sự khác biệt giữa lịch cũ và lịch mới xảy ra vào năm 1752. Trong thế kỷ 18, năm pháp lý ở Anh bắt đầu vào ngày 25 tháng 3.

  • Người dùng D: Đang gặp khó khăn trong việc hiểu thuật toán tính số tháng. Người này giải thích cách mình tính số cho từng tháng và chỉ ra rằng kết quả thử của mình không khớp với kết quả được đưa ra trong bài viết.

  • Người dùng E: Thuật toán của Carroll đã phát triển theo thời gian. Người này giới thiệu First Sunday Doomsday Algorithm có kèm các cải tiến mới nhất.

  • Người dùng F: Đã viết một bài blog giải thích một phương pháp đơn giản hơn. Có thể xem chi tiết qua liên kết.

  • Người dùng G: Xem Art Benjamin trình diễn kỹ thuật này trong một bài TED talk rất thú vị. Có thể theo dõi các phép tính trung gian qua chuyển động tay của ông ấy.

  • Người dùng H: Dùng phương pháp của Lewis Carroll để tính thứ trong tuần của ngày 24 tháng 5 năm 2024.

    • Ví dụ:
      mục thế kỷ: 6
      mục năm: 2
      mục tháng: 1
      mục ngày: 24
      tổng: Thứ Sáu
      
  • Người dùng I: Chia sẻ cách dùng mã Python để tính thứ trong tuần của một ngày.

    def compute_day_of_week(date):
        day, month, year = date
        century = year // 100
        year_part = year % 100
    
        # 세기 항목 계산
        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
    
        # 연도 항목 계산
        year_item = (year_part + (year_part // 4)) % 7
    
        # 월 항목 계산
        month_items = [0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5]
        month_item = month_items[month - 1]
    
        # 날짜 항목 계산
        day_item = day % 7
    
        # 총합
        total = (century_item + year_item + month_item + day_item) % 7
    
        # 윤년 보정
        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]
    
    # 날짜 입력 받기
    date_input = input("Enter a date (yyyy-mm-dd): ")
    year, month, day = map(int, date_input.split('-'))
    date = (day, month, year)
    
    # 요일 계산 및 출력
    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}.")
    
  • Người dùng J: Nhấn mạnh rằng ký pháp quan trọng đến mức nào trong toán học. Người này nói rằng ký pháp là một yếu tố cực kỳ quan trọng trong toán học và khoa học máy tính.

  • Người dùng K: Nếu có thể làm việc này trong vòng 20 giây thì thật đáng kinh ngạc. Người này không tự xem mình là một "máy tính nhanh".