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 ปีให้หรือรับ

สมมติว่าคนทั้งโลกตัดสินใจว่าเริ่มจากตอนนี้เราใช้ระบบนี้ของทุก ๆ ปีที่สี่คือปีอธิกลายกเว้นทุก ๆ ปีที่ 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 ถึงปี 100,000 ค้นหาวันของสัปดาห์ภายใต้ปฏิทินใหม่นี้
  • รูปแบบอินพุตและเอาต์พุตใด ๆ ที่อนุญาตตราบใดที่คุณระบุรูปแบบที่คุณใช้อย่างชัดเจน
  • นี่คือรหัสกอล์ฟดังนั้นพยายามแก้ปัญหาของคุณให้แข็งแรงที่สุด!

กรณีทดสอบ

"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 วันในสัปดาห์นั้น
เซบาสเตียน

นอกจากนี้คุณพูดว่า "การตีกอล์ฟที่ดี" ดังนั้นนี่เป็นความท้าทาย # code-golf หรือไม่ หากเป็นเช่นนั้นให้ใส่เกณฑ์การชนะ (เช่นจำนวนไบต์ต่ำสุด / ตัวอักษร) และเพิ่มเป็นแท็ก
เซบาสเตียน

@ เซบาสเตียนคุณถูกต้องทั้งคู่ ฉันแก้ไขความท้าทายไปแล้ว ขอบคุณสำหรับคำติชมของคุณ
Sherlock9

1
เมื่ออ่านชื่อฉันได้รับผลกระทบอย่างล้นเหลือจากวิดีโอของ Matt Parker's ดีใจที่ได้เห็นมันเชื่อมโยงในเธรดเช่นกัน: D
PattuX

1
เพียงแค่ใช้ห้องสมุดมาตรฐานประจำวันและปรับเปลี่ยนค่าคงที่ส่วนกลางตามนั้นใช่ไหม ;)
สัญลักษณ์ตัวแทน

คำตอบ:


8

C (gcc) , 60 ไบต์

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

ลองออนไลน์!

ปรับเปลี่ยนวิธีการของSakamotoอย่างง่ายดาย รับอินพุตเป็นอาร์กิวเมนต์จำนวนเต็มตามลำดับmonth, day, yearและส่งออกจำนวนวัน (จัดทำดัชนี 0 ในวันอาทิตย์)


สิ่งที่ไม่"-bed=pen+mad."เป็นส่วนหนึ่งทำอย่างไร
ericw31415

@ ericw31415 มันอธิบายความยาวของแต่ละเดือนเป็นวันและเพื่อประโยชน์ในการปรากฏตัวมันถูกเลื่อนขึ้นโดยทวีคูณของ 7 แทนที่จะเป็นตัวละครที่ปกติ (31, 28 ... )
notjagan

ใช่ฉันลืมไปแล้วว่าcharยังคงเป็นตัวเลขดังนั้นคุณสามารถทำได้mod 7โดยตรง
ericw31415

6

ภาษา Wolfram (Mathematica) , 57 55 53 ไบต์

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

ลองออนไลน์!

ใช้สามอินพุต: ปีเดือนและวันตามลำดับ ตัวอย่างเช่นหากคุณบันทึกฟังก์ชั่นด้านบนเป็นfunแล้วfun[2048,2,28]คุณจะบอกวันในสัปดาห์ของวันที่ 28 กุมภาพันธ์ 2048

มันทำงานอย่างไร

สูตรm=#~Mod~128;6+Mod[(9#-m)/8-6Clip@m,28]แปลงปีเป็นปีที่เทียบเท่า (หนึ่งปีกับวันเดียวกันของสัปดาห์) ระหว่าง 6 AD และ 33 AD ในการทำเช่นนี้เราจะลบออฟเซ็ทจากนั้นใช้ปี mod 28 แต่การชดเชยจะเปลี่ยนทุกๆ 128 ปีและสำหรับปีหารด้วย 128 เราต้องทำการปรับเปลี่ยนเพิ่มเติมเพราะปีที่เทียบเท่าไม่ควรเป็นปีอธิกสุรทิน

DayNameอย่างไรก็ตามครั้งเดียวที่ทำเรามองขึ้นเดือนและวันในปีที่เทียบเท่าที่ใช้ในตัว



3

JavaScript, 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)

ใช้วิธีของ Sakamoto จะช่วยให้0=Sunday, 1=Monday, 2=Tuesday...

-2 ไบต์ขอบคุณ Misha Lavrov
-4 ไบต์ขอบคุณ Arnauld


1
ผมคิดว่าก็สามารถจะมีการเปลี่ยนแปลงไป~~y yคุณจะไม่ได้ปีเศษส่วนในการป้อนข้อมูลใช่มั้ย แต่ฉันยอมรับว่าฉันไม่ชำนาญใน JavaScript
Misha Lavrov

2
แล้วไง+y+(y>>2)-(y>>7)ล่ะ
Arnauld

@MishaLavrov ใช่ว่าเป็นเรื่องจริง ด้วยเหตุผลบางอย่างฉันตัดสินใจว่าฉันควรปูพื้นทุกอย่าง
ericw31415

2

ที่จริงแล้ว 37 ไบต์

นี่คือพอร์ตของการปรับเปลี่ยน notjagan ของของอัลกอริทึมของ Sakamotoแต่ด้วยเทคนิคสแต็คที่ใช้ไม่กี่ตามที่อธิบายไว้ด้านล่าง 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 ไบต์

พอร์ตของผู้อื่นการปรับเปลี่ยน notjagan ของของอัลกอริทึมของ Sakamotoแต่มีจำนวนฐาน-250 ในสถานที่ของ032503514624(ไม่จำเป็นต้องเป็นพิเศษ0เพราะเป็นวุ้น 1 จัดทำดัชนี) month, year, dayรูปแบบอินพุตเป็น 0-based with Sunday as 0รูปแบบการออกเป็น ข้อเสนอแนะการเล่นกอล์ฟยินดีมากเพราะวิธีการเชื่อมโยงนั้นยากที่จะจัดและอาจยังสามารถเล่นกอล์ฟได้ ลองออนไลน์!

แก้ไข: -1 ไบต์จากการใช้การเลื่อนบิตแทนการหารจำนวนเต็ม -1 ไบต์จากการจัดเรียงจุดเริ่มต้นและรูปแบบอินพุตใหม่ -2 ไบต์ขอบคุณ Erik the Outgolfer และ caird coinheringaahing

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.