वर्ष की दिन संख्या की गणना करें


13

ऐसा लगता है कि हमारे पास अभी तक यह नहीं है, इसलिए यहां हम जाते हैं:

चुनौती

एक प्रोग्राम या फ़ंक्शन लिखें जो इनपुट के रूप में एक तारीख लेता है और वर्ष की दिन संख्या को आउटपुट करता है। आप उस के लिए किसी भी निर्माण का उपयोग नहीं कर सकते हैं!

नियम

  • हमेशा की तरह आप एक पूर्ण कार्यक्रम या फ़ंक्शन लिख सकते हैं।
  • इनपुट का प्रारूप आपके ऊपर है, लेकिन इसमें एक वर्ष, एक महीना और एक दिन सम्‍मिलित है। स्पष्ट करें कि आपका कौन सा समाधान उपयोग करता है!
  • किसी भी तारीख से संबंधित निर्माण की अनुमति नहीं है! आप अपने आप से काम करना होगा। बिल्ट ऑपरेशन से संबंधित नहीं हैं, जो बिल ठीक हैं।
  • कैलकल्शन का आधार ग्रैगोरियन कैलेंडर है।
  • आपको लीप-इयर्स का हिसाब रखना होगा।
  • आपको केवल [1, 9999] रेंज में वर्षों को संभालने की आवश्यकता है
  • मानक खामियों को मना किया जाता है।
  • सबसे कम बाइट गिनती जीत!

परीक्षण के मामलों

यहाँ इनपुट प्रारूप YYYY / MM / DD है

2016/07/05 -> 187
2000/03/28 -> 88
0666/06/06 -> 157
6789/10/11 -> 284
0004/04/04 -> 95
1337/07/13 -> 194

हैप्पी कोडिंग!


क्या हम एक निश्चित तारीख से दिनों के लिए बिल्डरों का उपयोग कर सकते हैं? क्या इस बारे में है कि एक वर्ष एक लीप वर्ष है?
lirtosiast

@ थोमस किसी भी तारीख से संबंधित निर्माण की अनुमति नहीं है। गोना ने स्पष्ट किया कि चुनौती में, टिप्पणी के लिए धन्यवाद! :)
डेंकर

@DenkerAffe आपने सभी बिल्ट-इन की मनाही क्यों की?
aloisdg codidact.com पर जा रहा है।

जवाबों:


2

पायथ, 31 बाइट्स

+s<X1+L28jC"3Ȕ"4!%|F_jQ*TT4tEE

लीप ईयर के हिस्से के लिए @ डेनिस और @ जेक्यूब को धन्यवाद । इनपुट अलग लाइनों पर YYYY, MM, DD है।

+                          add [day] to
  s <                      sum of first [month]-1 values in the list
      X                    add 1 to
        1                  the second element (January)...
        +L                 \
           28              |
           j               }   lengths of all the months
             C "3Ȕ"       | 
             4             /
        ! %                ... if the year is a leap year; that is, 4 divides...
            |F _ j         fold logical OR over reversed
                   Q       the year
                   *TT     converted to base 100
            4
      t E                 [month]-1
  E                       [day]

टेस्ट सूट


8

जावास्क्रिप्ट ईएस 6, 81 69 बाइट्स

(y,m,d)=>d+parseInt("03479cehkmpr"[--m],36)+m*28-(y%(y%25?4:16)&&m>1)

मान लें कि महीने 1-आधारित हैं, अन्यथा मैं 2 बाइट्स बचा सकता था।

संपादित करें: @ user81655 की टिप का उपयोग करके 12 बाइट्स सहेजे गए।


3

सी, 96 102 89 61 बाइट्स

g(y,m,d){printf("%d",m/2*31+--m/2*30-(y%(y%25?4:16)?2:1)+d);}

2

पायथन 3, 152 148 150 बाइट्स

m,d,y=map(int,input().split());n=[0,31,(59,60)[(y%4==0 and y%100!=0)or y%400==0]]
for i in range(m):n+=[n[-1]+(31,30)[i in[1,3,6,8]]]
print(n[-4]+d)

"MD YYYY" प्रारूप में दिनांक लेता है।


1
तुम्हें पता है, अजगर 2 का उपयोग करना चाहिए जब तक आप अजगर 3. से विशिष्ट सुविधाओं की जरूरत है तो चूंकि आपने अपने प्रिंट में कोष्ठक है जो आप के रूप में अपने प्रिंट wrinting द्वारा एक बाइट को बचाने के लिए अनुमति देता है की जरूरत नहीं हैprint n[m-1]+d
Denker

पहली पंक्ति में, आप y% 4 == 0and y% 100! = 0 लिख सकते हैं, मुझे लगता है
मेगा मैन

2

पायथन 2, 100 82 बाइट्स

@ नील के उत्तर का एक अजगर बंदरगाह :

lambda d,m,y:d+int("03479cehkmpr"[m-1],36)+(m-1)*28-(y%(4if y%25 else 16)and m>2)

पिछले उत्तर के साथ, 17 बाइट्स (कुल 99 बाइट्स) जोड़ने से एक पूरा कार्यक्रम होगा:

print(lambda d,m,y:d+int("03479cehkmpr"[m-1],36)+(m-1)*28-(y%(4if y%25 else 16)and m>2))(*input())

पिछला उत्तर:

एक अनाम मेमने के रूप में:

lambda d,m,y:d+sum(31-(n in(3,5,8,10))for n in range(m-1))-(3if y%4 or(y%400!=0and y%100==0)else 2)

2 बाइट पेनल्टी के लिए एक नामित लंबो में परिवर्तित किया जा सकता है। वैकल्पिक रूप से, D,M,Y117 बाइट्स के लिए एक पूर्ण कार्यक्रम (प्रारूप में इनपुट लेना ) प्राप्त किया जा सकता है:

print(lambda d,m,y:d+sum(31-(n in(3,5,8,10))for n in range(m-1))-(3if y%4 or(y%400!=0and y%100==0)else 2))(*input())

कुछ छोटे गोल्फ को 76 बाइट्स
स्क्वीड

0

पायथन 3, 125 बाइट्स

print((lambda d,m,y:sum([3,not(y%400 and not y%100 or y%4),3,2,3,2,3,3,2,3,2,3][:m-1])+m*28-28+d)(*map(int,input().split())))

इस समस्या के लिए एक और दृष्टिकोण। कोड पायथन के बूलियन बीजगणित निष्पादन प्राथमिकताओं का लाभ लेता है और चूंकि notअंतिम ऑपरेशन है, बूलियन में रूपांतरण स्वचालित है। जब समन किया जाता है, तो बूलियन को 1 या 0. इनपुट प्रारूप के रूप में माना जाता है "YY MM DDDD" स्ट्रिंग। इनपुट प्रणाली @ स्टीवकेर्ट के समान से प्रेरित है ।

फ़ंक्शन के रूप में एक और रूप, 91 बाइट्स

def f(d,m,y):return sum([3,not(y%400 and not y%100 or y%4),3,2,3,2,3,3,2,3,2,3][:m])+m*28+d

इस मामले में इनपुट तीन पूर्णांक है, जो महीने 0-11 के बीच है। यह पायथन 2 में भी काम करेगा।


0

एक्सेल, 106 बाइट्स

=AND(C1>2,OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100))))+30*B1-31+CHOOSE(B1,1,2,0,1,1,2,2,3,4,4,5,5,6)+C1

तीन कोशिकाओं में इनपुट लेता है A1= वर्ष, B1= महीना, C1= दिन।


AND(C1>2,OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100))))

1 अगर लीपियर, और 0

30*B1-31+CHOOSE(B1,1,2,0,1,1,2,2,3,4,4,5,5,6)+C1

30अतिरिक्त दिनों के लिए कई , महीने में प्लस दिन


क्रमागत उन्नति:

=IF(AND(C1>2,OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100)))),1,0)+CHOOSE(B1,0,31,59,90,120,151,181,212,243,273,304,334,365)+C1
=IF(AND(C1>2,OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100)))),1,0)+CHOOSE(B1-1,31,59,90,120,151,181,212,243,273,304,334,365)+C1
=IF(AND(C1>2,OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100)))),1,0)+30*(B1-1)+CHOOSE(B1,0,1,-1,0,0,1,1,2,3,3,4,4,5)+C1
=IF(AND(C1>2,OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100)))),1,0)+30*B1-30+CHOOSE(B1,0,1,-1,0,0,1,1,2,3,3,4,4,5)+C1
=IF(AND(C1>2,OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100)))),1,0)+30*B1-31+CHOOSE(B1,1,2,0,1,1,2,2,3,4,4,5,5,6)+C1
=AND(C1>2,OR(MOD(A1,400)=0,AND(MOD(A1,4)=0,MOD(A1,100))))+30*B1-31+CHOOSE(B1,1,2,0,1,1,2,2,3,4,4,5,5,6)+C1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.