128 년? 가상의 윤년 개혁

이 비디오 에 따르면 태양 년은 365 일, 5 시간, 48 분, 45 초 및 138 밀리 초 입니다. 현재 그레고리력으로 윤년의 규칙은 다음과 같습니다.

if      year is divisible by 400, LEAP YEAR
else if year is divisible by 100, COMMON YEAR
else if year is divisible by 4,   LEAP YEAR
else,                             COMMON YEAR

불행히도이 방법은 3216 년마다 하루 씩 중단됩니다.

일정을 수정하는 한 가지 가능한 방법은 다음 규칙입니다.

if      year is divisible by 128, COMMON YEAR
else if year is divisible by 4,   LEAP YEAR
else,                             COMMON YEAR

이로 인해 625,000 년 동안 일정을 다시 바꾸거나 줄 필요가 없다는 이점이 있습니다.

전 세계가 지금부터 4 년마다이 시스템을 128 년을 제외한 윤년으로 결정하여 달력을 다음과 같이 변경한다고 가정 해 봅시다.

YEAR    GREGORIAN    128-YEAR
2044    LEAP         LEAP
2048    LEAP         COMMON
2052    LEAP         LEAP
 ...
2096    LEAP         LEAP
2100    COMMON       LEAP
2104    LEAP         LEAP
 ...
2296    LEAP         LEAP
2300    COMMON       LEAP
2304    LEAP         COMMON
2308    LEAP         LEAP

이것이 요일 알고리즘에 어떤 영향을 미칩니 까?

도전

  • 2000 년부터 100000 년까지의 날짜가 주어지면이 새 달력에서 요일을 찾으십시오.
  • 사용중인 형식을 명확하게 지정하는 한 모든 입력 및 출력 형식이 허용됩니다.
  • 이것은 코드 골프이므로 가능한 한 골프 솔루션을 만들어보십시오!

테스트 사례

"28 February 2048" -> "Friday"
"March 1, 2048"    -> "Sat"
(2100, 2, 29)      -> 0           # 0-indexed with Sunday as 0
"2100-02-29"       -> 7           # 1-indexed with Sunday as 7
"28 Feb. 2176"     -> "Wednesday"
"1-Mar-2176"       -> "Th"
"28/02/100000"     -> "F"         # DD/MM/YYYYYY
"Feb. 29, 100000"  -> 6           # 1-indexed with Sunday as 7
"03/01/100000"     -> 1          # MM/DD/YYYYYY and 1-indexed with Sunday as 1

도전 과제에 대한 제안과 피드백을 환영합니다. 행운과 좋은 골프!



답변

C (gcc) , 60 바이트

f(m,d,y){y-=m<3;return(y+y/4-y/128+"-bed=pen+mad."[m]+d)%7;}

온라인으로 사용해보십시오!

사카모토 방법의 간단한 수정 . order에서 정수 인수로 입력 month, day, year을 받고 일 수를 출력합니다 (일요일에는 0 색인화 됨).


답변

Wolfram Language (Mathematica) , 57 55 53 바이트

DayName@{m=#~Mod~128;6+Mod[(9#-m)/8-6Clip@m,28],##2}&

온라인으로 사용해보십시오!

연도, 월, 일의 순서로 세 가지 입력을받습니다. 예를 들어, 위 함수를로 저장하면 2048 년 2 월 28 일 요일 funfun[2048,2,28]알려줍니다.

작동 원리

이 수식 m=#~Mod~128;6+Mod[(9#-m)/8-6Clip@m,28]은 연도를 서기 6 년에서 서기 33 년 사이의 동등한 해 (정확히 동일한 요일이있는 연도)로 변환합니다. 이를 위해 오프셋을 뺀 다음 mod 28을 사용합니다. 그러나 오프셋은 128 년마다 바뀌고 128 년으로 나눌 수있는 해에는 해당 연도가 윤년이 아니므로 추가 조정을해야합니다.

어쨌든 일단 완료되면 built-in을 사용하여 해당 연도의 월과 일을 찾습니다 DayName.


답변

파이썬 2 , 67 바이트

def f(m,d,y):y-=m<3;return(y+y/4-y/128+int("0032503514624"[m])+d)%7

온라인으로 사용해보십시오!

int("..."[m])로 대체 할 수 있습니다 ord("-bed=pen+mad."[m]).


답변

자바 스크립트, 65 59 바이트

(d,m,y)=>(y-=m<3,(+"0032503514624"[m]+y+(y>>2)-(y>>7)+d)%7)

(d,m,y)=>(y-=m<3,(+"0032503514624"[m]+~~y+~~(y/4)-~~(y/128)+d)%7)


사카모토의 방법을 사용합니다. 준다0=Sunday, 1=Monday, 2=Tuesday...

Misha Lavrov 덕분에 -2 바이트
Arnauld 덕분에 -4 바이트


답변

실제로 37 바이트

이것은 notjaganSakamoto 알고리즘을 수정 한 포트 이지만 아래에 설명 된 것처럼 스택 기반 트릭이 몇 가지 있습니다. 입력 형식은 day, year, month입니다. 출력 형식은 0-indexed with Sunday as 0입니다. 골프 제안을 환영합니다! 온라인으로 사용해보십시오!

;"0032503514624"Ei)3>±+;¼L;¼¼½L±kΣ7@%

설명

                     Implicit input: day, year, month (month is at TOS)
;"0032503514624"Ei)  Get the month code, convert to float, rotate to bottom of the stack
3>±+                 If 3>month, add -1 to year
;¼L                  Push floor(year/4) to stack
;¼¼½L±               Push floor(year/4) and append -floor(year/128) to stack.
kΣ                   Wrap the stack (y/128, y/4, y, month_code, d) in a list and sum
7@%                  Get the sum modulo 7
                     Implicit return

답변

젤리 , 32 31 30 28 바이트

NotjaganSakamoto 알고리즘을 수정 한 또 다른 포트 이지만 기본 250 숫자 대신에 Jelly가 1 인덱싱되므로 032503514624추가가 필요하지 않습니다 0. 입력 형식은 month, year, day입니다. 출력 형식은 0-based with Sunday as 0입니다. 골프장 제안은 링크를 조정하기가 어려웠으며 여전히 골프를 즐길 수있는 방식이므로 매우 환영합니다. 온라인으로 사용해보십시오!

편집 : 정수 나누기 대신 비트 시프트를 사용하여 -1 바이트. 시작과 입력 형식을 재정렬하여 -1 바이트. Outgolfer Erik과 caird coinheringaahing 덕분에 -2 바이트.

3>_@µæ»7,2I+µ“Ṿ⁵Ḥ9{’D³ị+⁵+%7

설명

         Three arguments: month, year, day
3>_@     Subtract (month<3) from year. Call it y.
µ        Start a new monadic chain.
æ»7,2    Bit shift y by both 7 and 2 (equivalent to integer division by 128 and by 4).
I+       y + y/4 - y/128
µ        Start a new monadic chain.
“Ṿ⁵Ḥ9{’  The number 732573514624 in base 250.
D        The list [7, 3, 2, 5, 7, 3, 5, 1, 4, 6, 2, 4].
³ị       Get the month code from the list (1-based indexing).
+⁵+      Add y, our month code, and day together.
%7       Modulus 7.