1P by neo 5달전 | favorite | 댓글 1개

루이스 캐럴이 제안한 날짜 계산법

루이스 캐럴이 1887년 3월 31일 _Nature_에 보낸 편지:

다음과 같은 방법으로 주어진 날짜의 요일을 정신적으로 계산하는 방법을 발견했기에, 독자들에게 흥미를 줄 수 있을 것 같아 보냄. 나는 빠른 계산가는 아니며, 평균적으로 이러한 문제를 푸는 데 약 20초가 걸림. 따라서 빠른 계산가는 15초도 걸리지 않을 것이라 확신함.

계산 방법

  • 주어진 날짜를 4개의 부분으로 나눔: 세기, 년도, 월, 일.
  • 다음 4가지 항목을 계산하고, 각 항목을 이전 항목의 합계에 더함. 항목이나 합계가 7을 초과하면 7로 나누고 나머지만 유지함.

세기 항목

  • 구식(1752년 9월 2일 이전): 18에서 뺌.
  • 신식(1752년 9월 14일 이후): 4로 나누고, 3에서 나머지를 뺀 후, 나머지를 2로 곱함.
  • 예: 1811년의 경우, 세기 항목은 18임.

년도 항목

  • 12의 배수, 나머지, 나머지의 4의 배수를 더함.

월 항목

  • 모음으로 시작하거나 끝나는 경우, 해당 월의 위치를 10에서 뺌. 이 값에 해당 월의 일 수를 더함.
  • 예: 1월의 항목은 '0', 2월 또는 3월은 '3', 12월은 '12'.
  • 최종 값: 1월 0, 2월 3, 3월 3, 4월 6, 5월 1, 6월 4, 7월 6, 8월 2, 9월 5, 10월 0, 11월 3, 12월 5.

일 항목

  • 해당 월의 일 수.

윤년 조정

  • 윤년의 1월 또는 2월인 경우, 최종 합계에서 '1'을 뺌. 합계가 '0'인 경우, 먼저 7을 더함.
  • 윤년: 4로 나누어지는 해, 단 신식에서는 세기년이 4로 나누어지지 않는 경우 제외 (예: 1800년).

최종 결과

  • 최종 결과는 요일을 나타냄. '0'은 일요일, '1'은 월요일, 등등.

예시

1783년 9월 18일

  • 세기 항목: 17을 4로 나누면 나머지 '1'. 3에서 1을 빼면 '2'. 2를 2로 곱하면 '4'.
  • 년도 항목: 83은 6 다스와 11, 합계 17. 2를 더하면 19, 7로 나누면 '5'. 총합 9, 7로 나누면 '2'.
  • 월 항목: 8월 항목은 '8에서 10을 뺀 값', 즉 '2'. 9월 항목은 '2에 3을 더한 값', 즉 '5'. 총합 7, 7로 나누면 '0'.
  • 일 항목: 18은 '4'.
  • 최종 결과: '목요일'.

1676년 2월 23일

  • 세기 항목: 16에서 18을 빼면 '2'.
  • 년도 항목: 76은 6 다스와 4, 합계 10. 1을 더하면 11, 7로 나누면 '4'. 총합 '6'.
  • 월 항목: 2월 항목은 '3'. 총합 9, 7로 나누면 '2'.
  • 일 항목: 23은 '2'. 총합 '4'.
  • 윤년 조정: '3'.
  • 최종 결과: '수요일'.

(출처: Edward Wakeling, Rediscovered Lewis Carroll Puzzles, 1995.)

GN⁺의 의견

  • 루이스 캐럴의 날짜 계산법은 수학적 사고를 키우는 데 유용함.
  • 이 방법은 컴퓨터 없이도 날짜를 계산할 수 있는 흥미로운 방법임.
  • 윤년 계산과 같은 세부 사항을 이해하면 더 정확한 결과를 얻을 수 있음.
  • 현대의 달력 계산과 비교해보는 것도 재미있을 것임.
  • 수학적 퍼즐을 좋아하는 사람들에게는 도전적인 문제로 다가올 수 있음.
Hacker News 의견

해커뉴스 댓글 모음 요약

  • 사용자 A: 이 방법은 내가 사용하는 방법과 매우 유사하며, Art Benjamin도 사용하는 방법임. 10~15초 내에 할 수 있지만 연습과 약간의 암기, 그리고 간단한 산수가 필요함. 이 기술을 익히면 매우 유용함.

    • 예시: 2024년 5월 24일의 요일 계산
      2012년 이후 12년
      윤년 3회
      마법의 월 번호 2
      날짜 24
      합산 후 7로 나눈 나머지: 금요일
      
  • 사용자 B: JH Conway는 다른 기술을 사용했으며, 현재 연도의 요일을 계산할 때 더 빠르고 쉬움. 그러나 다른 연도의 "Doomsday"를 계산할 때는 어려움이 있어 기본 방법으로 돌아감.

  • 사용자 C: 1752년에 일어난 구식과 신식 날짜의 차이에 대해 읽으며 흥미로웠음. 18세기에는 영국의 법적 연도가 3월 25일에 시작되었음.

  • 사용자 D: 월 번호 계산 알고리즘을 이해하는 데 어려움을 겪고 있음. 각 월의 번호를 계산하는 방법을 설명하며, 자신의 시도와 기사에서 제시된 결과가 일치하지 않음을 지적함.

  • 사용자 E: Carroll의 알고리즘이 시간이 지나면서 진화해왔음. 최신 개선 사항을 포함한 First Sunday Doomsday Algorithm을 소개함.

  • 사용자 F: 더 간단한 방법을 설명한 블로그 글을 작성했음. 링크를 통해 자세한 내용을 확인할 수 있음.

  • 사용자 G: Art Benjamin이 TED 강연에서 이 기술을 시연하는 것을 보는 것이 매우 흥미로웠음. 그의 손 움직임을 통해 중간 계산을 추적할 수 있음.

  • 사용자 H: Lewis Carroll의 방법을 사용하여 2024년 5월 24일의 요일을 계산함.

    • 예시:
      세기 항목: 6
      연도 항목: 2
      월 항목: 1
      날짜 항목: 24
      총합: 금요일
      
  • 사용자 I: Python 코드를 사용하여 날짜의 요일을 계산하는 방법을 공유함.

    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}.")
    
  • 사용자 J: 수학에서 표기법이 얼마나 중요한지 강조함. 표기법이 수학과 컴퓨터 과학에서 매우 중요한 요소임을 언급함.

  • 사용자 K: 20초 내에 이 작업을 할 수 있다면 놀라운 일임. 자신을 "빠른 계산기"로 여기지 않았음.