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 से वर्ष 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 दिन तो होने ही थे।
सेबेस्टियन

इसके अलावा, आप कहते हैं "अच्छी गोल्फिंग", तो क्या यह एक # कोड-गोल्फ चुनौती है? यदि ऐसा है, तो जीतने के मानदंड (जैसे बाइट्स / वर्णों की सबसे कम संख्या) में डालें और टैग के रूप में जोड़ें।
सेबेस्टियन

@ सेबैस्टियन आप दोनों काउंट पर सही हैं। मैंने पहले ही चुनौती संपादित कर ली है। आपकी प्रतिक्रिया के लिए धन्यवाद
Sherlock9

1
जब मैं शीर्षक पढ़ता हूं तो मैट पार्कर के वीडियो के बावजूद। इसे धागे में जुड़ा हुआ देखकर अच्छा लगा: D
PattuX

1
बस सप्ताह के दिनों के मानक लें और वैश्विक स्थिरांक को संशोधित करें, ठीक है? ;)
वाइल्डकार्ड

जवाबों:


8

सी (जीसीसी) , 60 बाइट्स

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

इसे ऑनलाइन आज़माएं!

सकामोटो की पद्धति का सरल संशोधन । आदेश में पूर्णांक तर्कों के रूप में इनपुट लेता है month, day, year, और दिन की संख्या (रविवार को 0-अनुक्रमित) को आउटपुट करता है।


"-bed=pen+mad."भाग क्या करता है?
ericw31415

@ ericw31415 यह दिनों में प्रत्येक महीने की लंबाई के लिए होता है, और केवल उपस्थिति के लिए इसे 7 के गुणकों द्वारा स्थानांतरित किया जाता है बजाय अध्यादेशों (31, 28 ...) में।
नॉटजगन डेस

सही है, मैं भूल गया कि charअभी भी एक संख्या का प्रतिनिधित्व करता है, तो आप mod 7सीधे कर सकते हैं ।
ericw31415

6

वोल्फ्राम लैंग्वेज (मैथेमेटिका) , 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 वर्ष और 33 ईस्वी के बीच वर्ष को एक समतुल्य वर्ष (सप्ताह के समान दिनों के साथ एक वर्ष) में परिवर्तित करता है। ऐसा करने के लिए, हम एक ऑफसेट घटाते हैं और फिर वर्ष मॉड 28 लेते हैं; लेकिन ऑफसेट प्रत्येक 128 वर्षों में बदलता है, और 128 साल से विभाज्य वर्षों के लिए, हमें एक और समायोजन करना होगा क्योंकि समकक्ष वर्ष एक लीवर वर्ष नहीं होना चाहिए।

वैसे भी, एक बार ऐसा करने के बाद, हम बिल्ट-इन का उपयोग करके उस समतुल्य वर्ष में महीना और दिन देखते हैं 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...

-2 बाइट्स धन्यवाद मिशा लावरोव
-4 बाइट्स अरनौलड को धन्यवाद


1
मुझे लगता है कि ~~yइसे सिर्फ बदला जा सकता है y। आप इनपुट में एक भिन्नात्मक वर्ष प्राप्त नहीं करने जा रहे हैं, है ना? लेकिन मैं मानता हूँ कि मैं जावास्क्रिप्ट में धाराप्रवाह नहीं हूँ।
मीशा लावरोव

2
कैसे के बारे में +y+(y>>2)-(y>>7)?
अरनौलड

@ मिशालारोव हां, यह सच है। किसी कारण से मैंने फैसला किया कि मुझे सब कुछ मंजिल देना चाहिए।
ericw31415 21

2

दरअसल , 37 बाइट्स

यह सकामोटो के एल्गोरिथ्म में नॉटागन के संशोधन का एक बंदरगाह है , लेकिन नीचे वर्णित कुछ स्टैक-आधारित ट्रिक्स के साथ। इनपुट प्रारूप है । आउटपुट स्वरूप है । गोल्फ सुझाव का स्वागत करते हैं! इसे ऑनलाइन आज़माएं!day, year, month0-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 बाइट्स

सकामोटो के एल्गोरिथ्म में नॉटजागन के संशोधन का एक और बंदरगाह, लेकिन इसके स्थान पर एक आधार-250 नंबर के साथ (अतिरिक्त की आवश्यकता नहीं है क्योंकि जेली 1-अनुक्रमित है)। इनपुट प्रारूप है । आउटपुट स्वरूप है । जिस तरह से लिंक को व्यवस्थित करने के लिए कठिन थे और अभी भी गोल्फ हो सकते हैं, गोल्फिंग सुझाव का बहुत स्वागत है। इसे ऑनलाइन आज़माएं!0325035146240month, year, day0-based with Sunday as 0

संपादित करें: पूर्णांक विभाजन के बजाय बिट शिफ्ट का उपयोग करने से -1 बाइट। शुरुआत और इनपुट प्रारूप को पुन: व्यवस्थित करने से -1 बाइट। -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.

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.