128 년? 가상의 윤년 개혁


23

이 비디오 에 따르면 태양 년은 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

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


테스트 사례 # 4의 경우 1- 인덱스를 의미합니까? 그렇지 않으면 그 주에 8 일이 있어야합니다.
Sebastian

또한 "좋은 골프"라고 말하면 이것이 # code-golf 도전입니까? 그렇다면 당첨 기준 (예 : 가장 적은 바이트 / 문자 수)을 입력하고 태그로 추가하십시오.
Sebastian

@Sebastian 당신은 두 카운트에 모두 맞습니다. 이미 도전 과제를 편집했습니다. 의견 주셔서 감사합니다
Sherlock9

1
제목을 읽을 때 나는 Matt Parker의 비디오를 믿지 않았다. 스레드에서도 링크가 표시되는 것이
좋습니다

1
표준 요일 라이브러리를 가져 와서 이에 따라 전역 상수를 수정하십시오. ;)
와일드 카드

답변:


8

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 색인화 됨).


그 역할은 무엇입니까 "-bed=pen+mad."?
ericw31415

@ ericw31415 그것은 매월의 길이를 일 단위로 설명하고, 단순히 외형을 위해서 서수 (31, 28 ...)의 문자 대신 7의 배수로 이동합니다.
notjagan

char그래도 여전히 숫자를 나타내는 것을 잊었 으므로 mod 7직접 할 수 있습니다.
ericw31415

6

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.



3

자바 스크립트, 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 바이트


1
~~y로 변경 될 수 있다고 생각 합니다 y. 입력에서 소수의 해를 얻지 못할 것입니다. 그러나 나는 JavaScript에 유창하지 않다는 것을 인정한다.
Misha Lavrov

2
어때요 +y+(y>>2)-(y>>7)?
Arnauld

@MishaLavrov 그렇습니다. 어떤 이유로 나는 모든 것을 바닥으로하기로 결정했다.
ericw31415

2

실제로 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

2

젤리 , 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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.