128 năm? Giả thuyết cải cách năm nhuận


23

Năm mặt trời là 365 ngày, 5 giờ, 48 phút, 45 giây và 138 mili giây, theo video này . Với lịch Gregorian hiện tại, các quy tắc cho năm nhuận như sau:

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

Thật không may, phương pháp này bị tắt một ngày cứ sau 3216 năm.

Một phương pháp có thể cải cách lịch là quy tắc sau:

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

Điều này có lợi ích là không yêu cầu chúng ta thay đổi lịch một lần nữa trong 625.000 năm nữa, cho hoặc nhận.

Giả sử toàn bộ thế giới quyết định rằng, bắt đầu từ bây giờ, chúng tôi sử dụng hệ thống này của mỗi năm thứ tư là một năm nhuận trừ mỗi năm thứ 128, thay đổi lịch của chúng tôi như sau:

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

Làm thế nào điều này sẽ ảnh hưởng đến thuật toán ngày trong tuần của chúng tôi?

Các thách thức

  • Cho một ngày từ năm 2000 đến năm 100000, tìm ngày trong tuần theo lịch mới này.
  • Bất kỳ định dạng đầu vào và đầu ra đều được cho phép miễn là bạn xác định rõ định dạng bạn đang sử dụng.
  • Đây là mã golf, vì vậy hãy cố gắng làm cho các giải pháp của bạn càng tốt càng tốt!

Các trường hợp thử nghiệm

"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

Đề xuất và phản hồi về các thách thức được chào đón. Chúc may mắn và chơi golf tốt!


Đối với trường hợp thử nghiệm # 4, bạn có nghĩa là 1 chỉ mục, phải không? Nếu không thì sẽ phải có 8 ngày trong tuần đó.
Sebastian

Ngoài ra, bạn nói "chơi golf tốt", vậy đây có phải là một thử thách # code-golf không? Nếu vậy, hãy đặt tiêu chí chiến thắng (ví dụ: số byte / ký tự thấp nhất) và thêm nó dưới dạng thẻ.
Sebastian

@Sebastian Bạn đúng cả hai cách tính. Tôi đã chỉnh sửa thử thách. Cảm ơn phản hồi của bạn
Sherlock9

1
Khi đọc tiêu đề, tôi vô tình mặc dù video của Matt Park. Rất vui khi thấy nó được liên kết trong chuỗi cũng: D
PattuX

1
Chỉ cần lấy các thư viện tiêu chuẩn trong tuần và sửa đổi các hằng số toàn cầu cho phù hợp, phải không? ;)
tự đại diện

Câu trả lời:


8

C (gcc) , 60 byte

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

Hãy thử trực tuyến!

Sửa đổi đơn giản phương pháp của Sakamoto . Lấy đầu vào dưới dạng đối số nguyên theo thứ tự month, day, yearvà xuất số ngày trong ngày (được lập chỉ mục 0 vào Chủ nhật).


Phần này "-bed=pen+mad."làm gì?
ericw31415

@ ericw31415 Nó chiếm độ dài mỗi tháng tính theo ngày và đơn giản là vì vẻ bề ngoài, nó được tăng lên bằng bội số 7 thay vì là ký tự tại các số thứ tự (31, 28 ...).
notjagan

Phải, tôi quên rằng charvẫn đại diện cho một số, vì vậy bạn có thể làm mod 7trực tiếp.
ericw31415

6

Ngôn ngữ Wolfram (Mathicala) , 57 55 53 byte

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

Hãy thử trực tuyến!

Có ba đầu vào: năm, tháng và ngày, theo thứ tự đó. Ví dụ: nếu bạn lưu chức năng trên dưới dạng fun, thì sẽ fun[2048,2,28]cho bạn biết ngày trong tuần của ngày 28 tháng 2 năm 2048.

Làm thế nào nó hoạt động

Công thức m=#~Mod~128;6+Mod[(9#-m)/8-6Clip@m,28]chuyển đổi năm thành một năm tương đương (một năm với chính xác các ngày trong tuần) giữa 6 AD và 33 AD. Để làm điều này, chúng tôi trừ đi một phần bù và sau đó lấy năm mod 28; nhưng phần bù thay đổi sau mỗi 128 năm và trong những năm chia hết cho 128, chúng ta phải điều chỉnh thêm vì năm tương đương không nên là năm nhuận.

Dù sao, một khi đã xong, chúng tôi tìm kiếm tháng và ngày trong năm tương đương bằng cách sử dụng tích hợp DayName.



3

JavaScript, 65 59 byte

(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)

Sử dụng phương pháp của Sakamoto. Tặng0=Sunday, 1=Monday, 2=Tuesday...

-2 byte nhờ Misha Lavrov
-4 byte nhờ Arnauld


1
Tôi nghĩ rằng ~~ychỉ có thể được thay đổi để y. Bạn sẽ không nhận được một năm phân số trong đầu vào, phải không? Nhưng tôi thừa nhận tôi không rành về JavaScript.
Misha Lavrov

2
Thế còn +y+(y>>2)-(y>>7)?
Arnauld

@MishaLavrov Vâng, đó là sự thật. Vì một số lý do tôi quyết định tôi nên lên sàn mọi thứ.
ericw31415

2

Trên thực tế , 37 byte

Đây là một cảng sửa đổi notjagan của các thuật toán của Sakamoto , nhưng với một vài thủ thuật dựa trên stack như mô tả dưới đây. Định dạng đầu vào là day, year, month. Định dạng đầu ra là 0-indexed with Sunday as 0. Gợi ý chơi golf chào mừng! Hãy thử trực tuyến!

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

Giải trình

                     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

Thạch , 32 31 30 28 byte

Một cảng sửa đổi notjagan của các thuật toán của Sakamoto nhưng với một số cơ sở-250 thay cho 032503514624(không cần thêm 0vì Jelly là 1-lập chỉ mục). Định dạng đầu vào là month, year, day. Định dạng đầu ra là 0-based with Sunday as 0. Gợi ý chơi gôn rất được hoan nghênh vì cách các liên kết khó sắp xếp và vẫn có thể chơi được. Hãy thử trực tuyến!

Chỉnh sửa: -1 byte từ việc sử dụng dịch chuyển bit thay vì chia số nguyên. -1 byte từ sắp xếp lại đầu và định dạng đầu vào. -2 byte nhờ Erik the Outgolfer và caird coinheringaahing.

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

Giải trình

         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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.