दिए गए वर्ष के प्रत्येक महीने में अंतिम रविवार खोजें


21

एफ # समाधान 140 वर्णों के अंदर जाना जाता है , और यह एक रोसेटा कोड समस्या है।

इनपुट वर्ष के लिए स्टडआउट या एक स्ट्रिंग चर में आवश्यक परिणाम 2014:

2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28

जैसा कि यह अनुरोध किया गया था, 1900 के लिए:

1900-01-28 1900-02-25 1900-03-25 1900-04-29 1900-05-27 1900-06-24 1900-07-29 1900-08-26 1900-09-30 1900-10-28 1900-11-25 1900-12-30

और 2000:

2000-01-30 2000-02-27 2000-03-26 2000-04-30 2000-05-28 2000-06-25 2000-07-30 2000-08-27 2000-09-24 2000-10-29 2000-11-26 2000-12-31

पोज़ किया क्योंकि तारीखें अधिकांश भाषाओं में अजीबोगरीब लगती हैं। दिनांक पुस्तकालयों की अनुमति देने से अधिक, मैं उन्हें देखने की उम्मीद करता हूं! लेकिन अगर बेस लैंग्वेज के लिए एक्सटर्नल हैं, तो पोस्ट के नाम में घोषणा करें (उदाहरण C # + जॉन स्कीट के NodaTime)।

स्पष्टीकरण:

  • वर्ष सीमा 1900 से 3015
  • ग्रेगोरियन कैलेंडर
  • यदि यह अन्यथा मायने रखता है, तो यूके / लंदन के लिए जो भी पारंपरिक है।
  • एक कमांडलाइन स्विच या स्टडिन लेने वाला प्रोग्राम ठीक है, परिणाम को स्टडआउट करता है
  • वर्ष के लिए मान लेने और एक स्ट्रिंग वापस करने का एक फ़ंक्शन भी ठीक है।

मानक खामियों को छोड़कर । एपीएल, जे, के समाधानों के लिए आगे देख रहे हैं, और कुछ नए पुस्तकालयों को देख रहे हैं।


@ Sp3000 - 1752 विशेष रूप से अजीब हो सकता है :-)
स्क्विश ossifrage

@ मार्टिनबटनर: कृपया दिनांक पुस्तकालयों का उपयोग करें, लोगों को भाषा के साथ उपयोग करने की घोषणा करने के लिए पूछने के लिए प्रश्न को संपादित किया है।
फिल एच

1
आपको उन वर्षों की सीमा को निर्दिष्ट करना चाहिए जो मान्य इनपुट हैं, और ग्रेगोरियन अपनाने के बारे में विचार। (अर्थात यदि 1930 से पहले के वर्षों की श्रेणी में कोई भी शामिल है, तो आपको या तो यह निर्दिष्ट करना चाहिए कि ग्रेगोरियन कैलेंडर का उपयोग पूरी सीमा के लिए किया जाना चाहिए, चाहे लोकेल की बात हो, या यह कि आउटपुट लोकेल के हिसाब से अलग-अलग हो सकता है या आपको इससे पहले कटऑफ की तारीख देनी चाहिए; जूलियन कैलेंडर का उपयोग किया जाना चाहिए और बदलाव के आसपास के तीन वर्षों के मामलों का परीक्षण करना चाहिए)।
पीटर टेलर

1
@squeamishossifrage: मैंने इसे 1900 और ग्रेगोरियन तक सीमित कर दिया है, क्योंकि मैं कल्पना को स्थापित करने के लिए शोध परियोजना से बचना चाहता हूँ ...
फिल एच

1
@ Adám: खेद है कि आप किसी उत्तर के लिए इतनी देर प्रतीक्षा कर रहे हैं :) हाँ वास्तव में।
फिल एच

जवाबों:


1

Dyalog एपीएल के साथ कैलोरी से dfns , 19 बाइट्स

देर आए दुरुस्त आए!

साल के लिए संकेत, yyyy md प्रारूप में तारीखों की सूची देता है ।

⎕{⍺⍵,2↑⊢⌿cal⍺⍵}¨⍳12

सांख्यिक इनपुट के लिए संकेत दें और उस पर बाएं तर्क दें

{... अनाम फ़ंक्शन (नीचे पाया गया) प्रत्येक में लागू होता है

⍳12 संख्या 1 से 12 (महीने)

उपरोक्त अनाम फ़ंक्शन निम्नानुसार है:

⍺⍵, बाएं और दाएं तर्कों (यानी वर्ष और महीने) के लिए प्रस्तुत करें

2↑ के पहले दो अक्षर

⊢⌿ सबसे नीचे की पंक्ति

cal के लिए कैलेंडर

⍺⍵ बाएं तर्क और सही तर्क (वर्ष और महीना)

TryAPL ऑनलाइन:

  1. आयात और इसकी निर्भरता के लिए यहां क्लिक करने के बाद इस पृष्ठ पर लौटें cal

  2. परीक्षण मामलों को चलाने के लिए यहां क्लिक करें


बहुत अच्छा। एक एपीएल पुस्तकालय के लिए आशा व्यक्त की थी जो समझ गया था कि तारीखों का क्या मतलब है, लेकिन सीएएल उचित है!
फिल एच



1
@PhilH और Dyalog APL के डायडिक प्राइमेटिव्स + - < = और .Net डेट ऑब्जेक्ट्स के साथ काम करते हैं
आदम डे

7

रूबी, 91 + 6 = 97

#!ruby -prdate
$_=(Date.new(y=$_.to_i)...Date.new(y+1)).select(&:sunday?).chunk(&:mon).map{|k,v|v[-1]}*' '

बहुत अच्छा काम करता है। select(&:sunday?)सुंदर है, और आश्चर्य की बात है, *' 'सभी स्वरूपण अपने आप करता है।


अच्छी चाल! के chunkबजाय का उपयोग करके आप तीन और वर्ण बचा सकते हैं group_by
क्रिस्टियन लुपस्क्यू

तो मैं कर सकता हूँ, अच्छा है।
हिस्टोक्रेट

6

बैश 4.x + ncal, 57

यदि रिक्त स्थान के बजाय newline विभाजक ठीक हैं, तो हम स्टेटमेंट -nसे स्विच और ट्रेलिंग स्पेस को हटा सकते हैं echo। और मुझे लगता है कि यह अभी भी शेबंग के बिना काम करेगा, इसलिए मैंने उसे भी हटा दिया:

for i in {01..12};{ echo "$1-$i-`ncal $i $1|tail -c-3`";}

मूल स्क्रिप्ट (73 बाइट्स):

#!/bin/bash
for i in {01..12};{ echo -n "$1-$i-`ncal $i $1|tail -c-3` ";}

उपयोग:

$ bash sundays.sh 2014
2014-01-26
2014-02-23
2014-03-30
2014-04-27
2014-05-25
2014-06-29
2014-07-27
2014-08-31
2014-09-28
2014-10-26
2014-11-30
2014-12-28
$

नोट: 4.0 से पहले के बैश संस्करण महीनों से अग्रणी शून्य को छोड़ देंगे। इसे बदलकर 5 वर्णों के जोड़ के साथ तय किया जा सकता {01..12}है `seq -w 1 12)`। इसके अलावा, tail -c-3कुछ प्रणालियों पर समस्याएँ उत्पन्न हो सकती हैं जहाँ आउटपुट ncalमें अनुगामी रिक्त स्थान शामिल होते हैं, लेकिन मुझे ऐसा करने की कोई जानकारी नहीं है।


1
क्या वास्तव में अंतर डार्विन से संबंधित है, न कि केवल बैश संस्करण से? बैश 4.0 में जोड़ा गया था (हालांकि बाद में इसमें कुछ कीड़े थे)। वैसे भी, 1 चरित्र `…`को अच्छी आदत के बजाय अब भी इस्तेमाल किया जा सकता है $(…)
मैनटवर्क

आह, हो सकता है। डार्विन का कहना है कि यह संस्करण 3.2.53 का उपयोग कर रहा है; डेबियन 4.1.5 का उपयोग कर रहा है।
स्क्विश ओस्सिफ्रेज

@manatwork PS बस बैक-टिक्स के बारे में आपकी टिप्पणी पर ध्यान दिया। अच्छी पकड़, धन्यवाद!
स्क्विश ओशरीफेज

मुझे नहीं लगता कि आपको #!/bin/bashगोल्फ के उद्देश्यों की गणना करने की आवश्यकता है ।
डिजिटल ट्रॉमा

@DigitalTrauma यह अच्छा है। ऐसा लगता है कि मैं रिक्त स्थान के बजाय लाइन ब्रेक का उपयोग कर सकता हूं। अब नीचे 57 बाइट्स :-)
स्क्विश ओस्फीफ्रेज

6

आईबीएम DFSORT, 71, 72 या 80 वर्णों की 11 3 लाइनें

 OPTION COPY 
 OUTFIL REPEAT=12,OVERLAY=(5:SEQNUM,2,ZD,5,2,1,8,Y4T,LASTDAYM,TOJUL=Y4T*
 ,9,7,Y4T,ADDDAYS,+1,TOJUL=Y4T,1:16,7,Y4T,PREVDSUN,TOGREG=Y4T(-),12X) 

स्तंभ आउटपुट प्रारूप के साथ दो उत्तर समय की कसौटी पर खरे उतरे हैं। जो मुझे एक "लूप" देता है, उस प्रकार, उस पर OUTFIL REPEAT = वर्तमान रिकॉर्ड को कॉपी करता है जो कई बार होता है।

मूल्य प्राप्त करने के लिए अलग-अलग तकनीक, जो लंबी लगती है, लेकिन छोटी है क्योंकि मैं अगले वर्ष में 12 वें रिकॉर्ड से निपटने के लिए बिना शर्त तरीके से काम नहीं कर सकता, और इसे सशर्त साधन बनाना शामिल है IFTHEN=(WHEN= , दो बार, और कुछ अन्य सामान । झूलों पर प्राप्त करें (महीने का पहला दिन इसे करने का सबसे सरल तरीका है) गोल चक्कर (विशेष रूप से सिंटैक्स आवश्यकताओं) पर भारी खो देता है।

यह महीने के अंतिम दिन को खोजने के लिए एक इनबिल्ट फंक्शन (DFSORT में सभी फंक्शन इनबिल्ट हैं) का उपयोग करता है। फिर अगले महीने के पहले पाने के लिए एक दिन (फ़ंक्शन) जोड़ता है और पिछले रविवार को प्राप्त करने के लिए PREVDSUN फ़ंक्शन का उपयोग करता है (जो पिछले महीने में हमेशा अंतिम रविवार होगा, पहले की तरह)।

जब वर्ष (इनपुट) को वैध तिथि में बदलते हैं, तो महीने के लिए दो अंकों की अनुक्रम संख्या का उपयोग किया जाता है, और उस मूल्य को दिन के लिए भी कॉपी किया जाता है, क्योंकि शुरुआती बिंदु तब तक मायने नहीं रखता है, जब तक हम हैं। शुरू में महीने के आखिरी दिन के बाद: 5,2की तुलना में कम हैC'01'

यहाँ विस्तार है:

विकल्प कॉपी - आउटपुट के लिए इनपुट फ़ाइल की प्रतिलिपि बनाएँ

OUTFIL - विभिन्न आउटपुट फ़ाइलों की अनुमति देने के लिए, अलग-अलग चयन और स्वरूपण के साथ, स्वरूपित रिपोर्ट तैयार करते हैं। INRECके उपयोग की वजह से छोटे को प्राथमिकता दी जाती है REPEAT=

REPEAT = 12 - प्रत्येक रिकॉर्ड की 12 प्रतियां तैयार करें। इस उदाहरण में, SEQNUM के कारण केवल एक इनपुट रिकॉर्ड (पिछले संस्करण के विपरीत) हो सकता है।

5: - रिकॉर्ड पर कॉलम 5 से शुरू करें।

SEQNUM, 2, ZD - अनुक्रम संख्या, एक पर शुरू करने के लिए चूक, दो अंक, "ज़ोनड दशमलव" (अहस्ताक्षरित के लिए, जो वे होंगे, चरित्र के समान)।

1,8 - कॉपी बाइट्स 1 से लेकर लंबाई 8 तक वर्तमान स्थान (9)। ऐसा इसलिए है क्योंकि Y4T को यह देखने की जरूरत है कि 8, अन्यथा एक अलग दिनांक प्रारूप का उपयोग किया जाएगा।

Y4T - ccyymmdd- प्रारूप तिथि (इसके सामने 8 तुरंत होने के कारण)।

LASTDAYM - महीने का अंतिम दिन (सप्ताह, तिमाही और वर्ष का भी संभव है)।

TOJUL = - दिनांक कार्यों के लिए आउटपुट तिथि-रूपांतरण (TOJUL एक चरित्र TOGREG से कम है)

9,7 - अब जब यह 7 लंबा है, तो Y4T CCYYDDD होने जा रहा है।

ADDDAYS - कई दिनों को जोड़ता है, यदि बाद के महीने / वर्ष में स्वचालित रूप से समायोजित हो जाता है (ADDMONS और ADDYEARS भी हो सकता है)

PREVDSUN - जूलियन तिथि आती है, पिछले रविवार को स्थित है, TOGREG को सही आउटपुट स्वरूप प्राप्त करने के लिए, "-" सेपरेटर (विभाजक के रूप में आप की तरह कुछ भी हो सकता है)

12X - गंदगी को साफ करने के लिए रिक्त स्थान जिसने हमें इसे इतने कम समय में करने की अनुमति दी है

2014 के लिए ऊपर से आउटपुट है:

2014-01-26
2014-02-23
2014-03-30
2014-04-27
2014-05-25
2014-06-29
2014-07-27
2014-08-31
2014-09-28
2014-10-26
2014-11-23
2014-12-28

SORT को क्या करना है यह बताने के लिए कुछ आवश्यक है। कोई डिफ़ॉल्ट नहीं है। OPTION COPYसबसे छोटा है, SORT FIELDS=COPYसमतुल्य है, लेकिन लंबा है।

यह काम खुद इस बार किया OUTFIL(REPEAT के उपयोग की अनुमति देने के लिए)। वर्किंग कोड यकीनन 160 (2 * 80), 144 (2 * 72), 140 (72 + 69), या 138 (70 + 68) (अग्रणी रिक्त स्थान को छोड़कर, निरंतर जारी रखने और रिक्त स्थान को छोड़कर) में से कोई भी है।

यह देखते हुए कि रिसीवर को यह जानना होगा कि वे क्या कर रहे हैं, मुझे लगता है कि मैं कह सकता हूं कि 1900 से किसी भी वर्ष के लिए प्रत्येक महीने के अंतिम रविवार को सूचीबद्ध करने के लिए DFSORT कोड (वर्ष 0001 से चलेगा, लेकिन मैं इस शोध से बच रहा हूं) अच्छी तरह से) 9999 तक (हालांकि DFSORT 9999 तक वर्षों का समर्थन करता है, पिछला समाधान वर्ष 9999 में काम नहीं करेगा क्योंकि 12 वीं तारीख अगले वर्ष में चली जाती है) ट्वीट किया जा सकता है।

कोड इतना लंबा क्यों है, अगर विशेष रूप से इनबिल्ट-फ़ंक्शंस हैं?

क्षेत्र-परिभाषाएँ पंचांग हैं। एक क्षेत्र को केवल डेटा के भीतर एक विशेष स्थान के रूप में परिभाषित किया गया है (जो एक रिकॉर्ड है) इसके तत्काल उपयोग के लिए। इसे दूसरे तरीके से रखने के लिए, फ़ील्ड्स को ऐसे परिभाषित नहीं किया जाता है, बल्कि प्रत्येक उपयोग के लिए और केवल उपयोग के लिए परिभाषित किया जाता है। तिथि कार्यों को यह जानने की जरूरत है कि स्रोत के लिए किस तिथि के (कितने) स्वरूपों का उपयोग किया जाता है, और आउटपुट एक तिथि प्रारूप में होना चाहिए, ताकि इसे निर्दिष्ट किया जाना चाहिए।

अब जबकि हमारे पास जूलियन डेट है .... TBC?


 OPTION COPY 
 INREC OVERLAY=(1,4,C'0201',1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8*
 ,94:C'1',89:1,4,ZD,ADD,+1,ZD,LENGTH=4,14:C'3',22:C'4',30:C'5',38:C'6',*
 46:C'7',54:C'8',62:C'9',69:C'10',77:C'11',85:C'12',127:X,89,8,Y4T,PREV*
 DSUN,TOGREG=Y4T(-),116:X,81,8,Y4T,PREVDSUN,TOGREG=Y4T(-),105:X,73,8,Y4*
 T,PREVDSUN,TOGREG=Y4T(-),94:X,65,8,Y4T,PREVDSUN,TOGREG=Y4T(-),83:X,57,*
 8,Y4T,PREVDSUN,TOGREG=Y4T(-),72:X,49,8,Y4T,PREVDSUN,TOGREG=Y4T(-),61:X*
 ,41,8,Y4T,PREVDSUN,TOGREG=Y4T(-),50:X,33,8,Y4T,PREVDSUN,TOGREG=Y4T(-),*
 39:X,25,8,Y4T,PREVDSUN,TOGREG=Y4T(-),28:X,17,8,Y4T,PREVDSUN,TOGREG=Y4T*
 (-),17:X,09,8,Y4T,PREVDSUN,TOGREG=Y4T(-),1:1,8,Y4T,PREVDSUN,TOGREG=Y4T*
 (-),11:X,18,120,6X) 

कुछ चाहिए JCL

//LASTSUNG EXEC PGM=SORT 
//SYSOUT   DD SYSOUT=* 
//SORTOUT  DD SYSOUT=* 
//SYSIN    DD * 

और एक इनपुट फ़ाइल (JCL की एक और पंक्ति और डेटा के तीन इंस्ट्रूमेंट आइटम):

//SORTIN DD *
2014 
1900 
2000 

पैदा करता है:

2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28
1900-01-28 1900-02-25 1900-03-25 1900-04-29 1900-05-27 1900-06-24 1900-07-29 1900-08-26 1900-09-30 1900-10-28 1900-11-25 1900-12-30
2000-01-30 2000-02-27 2000-03-26 2000-04-30 2000-05-28 2000-06-25 2000-07-30 2000-08-27 2000-09-24 2000-10-29 2000-11-26 2000-12-31

वास्तव में वर्ष 9999 तक काम करेगा।

DFSORT IBM का मेनफ्रेम सॉर्टिंग उत्पाद है। डेटा में हेरफेर किया जा सकता है, लेकिन चूंकि छांटना कुंजी है और प्रकार अक्सर बड़े और लंबे समय तक चलने वाले होते हैं, DFSORT नियंत्रण कार्ड में कोई लूपिंग निर्माण नहीं होता है, इसलिए हम SORT को लूप में नहीं डाल सकते हैं। गोल्फ जैसे कार्यों के लिए चीजें थोड़ी लंबी हो जाती हैं।

उत्तर पोस्ट करने के लिए क्यों, क्योंकि DFSORT का एक PREVDdayफ़ंक्शन है। इसलिए एक महीने में अंतिम रविवार आसान है। यह अगले महीने के पहले दिन रविवार (PREVDSUN) है।

यह भी एक "ऑपरेंड" (OVERLAY) के भीतर करने के लिए मजेदार था, थोड़ा सा यह सब भीतर sprintfया समान करना।

यहाँ यह अपुष्ट है:

 OPTION COPY 

 INREC OVERLAY=(1,4,C'0201',1,8,1,8,1,8,1,8,1,8,1,8, 
         1,8,1,8,1,8,1,8, 
         1,8,94:C'1',89:1,4,ZD,ADD,+1,ZD,LENGTH=4, 
         14:C'3',22:C'4',30:C'5',38:C'6',46:C'7',54:C'8',
         62:C'9',69:C'10',77:C'11',85:C'12', 
        127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
        116:X,81,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
        105:X,73,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         94:X,65,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         83:X,57,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         72:X,49,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         61:X,41,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         50:X,33,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         39:X,25,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         28:X,17,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         17:X,09,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
          1:1,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         11:X,18,120,6X) 

जब तक काफी दुरुपयोग नहीं होता है, यह सामान्य रूप से यह सब एक प्रयास में रटना करने के लिए प्रयास नहीं किया जाएगा, और कुछ प्रतीत होता है अनावश्यक सामान है जो यह सब एक OVERLAY में जाने की अनुमति देने के लिए आवश्यक है। गोल्फ के लिए कुछ जगह है, लेकिन चूंकि यह केवल एक लाइन को हटा देगा, इसलिए मुझे लुभा नहीं रहा है।

INREC को प्रत्येक रिकॉर्ड के लिए संसाधित किया जाता है।

ऑवरले एक मौजूदा रिकॉर्ड की सामग्री को बदलने की अनुमति देता है। यदि रिकॉर्ड प्रक्रिया में इसकी लंबाई से परे बढ़ाया जाता है, तो यह कोई समस्या नहीं है।

1,4 आने वाला वर्ष है। इसमें 0201 का शाब्दिक अर्थ संलग्न है, और फिर क्रमिक 1,8 बार इसे दोहराते हुए 96 बाइट्स की एक लंबी चक देने के लिए 11 बार दोहराता है।

विस्तारित चालू रिकॉर्ड पर 12 वें वर्ष को इसमें 1 जोड़ा गया, और इसका महीना 1 (जनवरी) कर दिया गया।

शेष 10 महीनों को 11 के माध्यम से 3 में बदल दिया जाता है।

फिर इस प्रकार की चीज़ों के कारण, रिवर्स ऑर्डर (OVERLAY के कारण) में 12 हैं:

127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-),

N: रिकॉर्ड पर एक कॉलम-संख्या है। एक्स एक रिक्त सम्मिलित करता है। 89,8 उस कॉलम / लंबाई से डेटा लेता है, Y4T इसे CCYYMMDD दिनांक के रूप में मानता है, PREVDSUM पिछले रविवार को काम करता है, TOGREG = Y4T (-) इसे ग्रेगोरियन YYY-MM-DD तिथि के रूप में आउटपुट करता है।

क्योंकि यदि आप किसी विशेष हिस्से के स्रोत और लक्ष्य को विनाशकारी रूप से ओवरलैप करते हैं, तो अंतिम रूप से 11:X,18,120,6X)खराब हो जाता है और थोड़ी गड़बड़ हो जाती है।

मैनुअल और कागजात यहां देखे जा सकते हैं: http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080 , और इसमें 900+ पृष्ठ DFSORT एप्लीकेशन प्रोग्रामिंग गाइड शामिल है।

सभी आईबीएम उत्पादों के रूप में सभी मैनुअल मुफ्त में उपलब्ध हैं (केवल बहुत महंगे लोगों की एक छोटी राशि को छोड़कर, जो कि दुनिया में बहुत कम लोग भी समझने का नाटक करेंगे)।

सभी DFSORT नियंत्रण कार्ड एक रिक्त स्थान से शुरू होने चाहिए। कॉलम 72 केवल निरंतरता के लिए उपयोग किया जाता है (कोई भी गैर-रिक्त करेगा, लेकिन * पारंपरिक है)। कॉलम 72 के बाद एक क्रम संख्या क्षेत्र है जिसे अनदेखा किया जाता है, जिससे प्रत्येक रिकॉर्ड 80 बाइट्स हो जाता है।

समाधान के एक और जोड़े, शायद आने के लिए।


5

बैश, 63 बाइट्स

for i in {01..12};{  date -v30d -v${i}m  -v2014y  -vsun +%Y-%m-%d;}

आउटपुट:

2014-01-26
2014-02-23
2014-03-30
2014-04-27
2014-05-25
2014-06-29
2014-07-27
2014-08-24
2014-09-28
2014-10-26 
2014-11-30
2014-12-28

for i in {1..12};{ date -v30d -v${i}m -v$1y -v0w +%Y-%m-%d;}- 60 बाइट्स
डिजिटल ट्रॉमा

-vपरम dateबीएसडी तिथि के लिए विशिष्ट है। तो यह OSX पर काम करता है, लेकिन अधिकांश लिनक्स पर नहीं - शायद इसका जवाब में कहा जाना चाहिए।
डिजिटल ट्रॉमा

@DigitalTrauma, मैक और मेरे लिनक्स पर काम करता है।
माइकल 501

4

पायथन 2 - 189 बाइट्स

y=input()
for m in range(12):
 d=[31-(1322>>m&1),28+(y%400<1or 1>y%4<y%100)][m==1];Y=y-(m<2);Z=Y%100;C=Y/100
 while(d+13*((m-2)%12+4)/5+Z+Z/4+C/4-2*C)%7-1:d-=1
 print"%d-%02d-%d"%(y,m+1,d),

STDIN के माध्यम से तारीख दर्ज करें।

अभी भी बहुत अधिक गोल्फिंग की जा सकती है। कार्यक्रम थोड़ा मनोरंजन के लिए जाता है:

  • कोई आयात, विशेष रूप से किसी भी अंतर्निहित तारीख कार्यों का उपयोग नहीं
  • उपयोग सप्ताह के दिनों की गणना के लिए ज़ेलर की बधाई का

टिप्पणियाँ

  • 1322 ए है निर्धारित करने के लिए जादू देखने की मेज है कि क्या एक गैर-फरवरी महीने में 30 या 31 दिन हैं
  • नहीं zfill इनपुट रेंज की वजह से साल के लिए की जरूरत है, और न ही दिनों में वे हमेशा 20 से अधिक हो जाएगा के रूप में

पायथन 2 - 106 बाइट्स

नहीं के रूप में मज़ा समाधान:

from calendar import*
y=input();m=1
while m<13:w,n=monthrange(y,m);print"%d-%02d-%d"%(y,m,n-(n+w)%7),;m+=1

calendar.monthrangeदो नंबर देता है: सप्ताह का दिन महीने पर शुरू होता है ( w) और महीने में दिनों की संख्या ( n)। समाधान एक पकड़ के कारण थोड़ा उल्टा है - सप्ताह का दिन सोमवार को 0 पर शुरू होता है , रविवार को नहीं! हालांकि, यह n1-आधारित तथ्य से ऑफसेट है ।


1
बहुत ही मूर्खतापूर्ण पाइथ उत्तर:$from calendar import monthrange as gt$V12AGH>QhN%"%d-%02d-%d"(QhN-H%+GH7
FryAmTheEggman

3

जावास्क्रिप्ट (ईएस 6) 155 145

संपादित करें फिक्स्ड समय क्षेत्र की समस्याओं को कम किया जा सकता है पुनरावर्ती बनाया है। शायद।

F=y=>{
  for(n=i=o=[];!o[11];)
    d=new Date(Date.UTC(y,0,++i)),m=d.getMonth(),
    d.getDay()||(m!=n&&o.push(p.toISOString().slice(0,10)),p=d,n=m);
  return o.join(' ')
}

आप उपयोग कर सकते हैं new Date(y,0,++i,9)। इसके अलावा, यह 2100 और उससे अधिक लीप वर्षों के लिए विफल रहता है क्योंकि JS के पास उन लीप वर्षों के बारे में जानकारी नहीं है और इस प्रकार, Feb 292100 और उससे अधिक के लिए लीप वर्षों में बिल्कुल भी नहीं है ।
ऑप्टिमाइज़र

@Optimizer यह जेएस नहीं कर रहा है: 2100,2200,2300 लीप वर्ष नहीं कर रहे हैं। 2014 एक लीप वर्ष है और जे एस को जानता है। घंटे 9 का उपयोग कर के रूप में, इस बात की पुष्टि नहीं कर सकते हैं लेकिन मुझे लगता है कि doesn'to काम करता है, तो आप मेलबोर्न में उदाहरण के लिए कर रहे हैं ...
edc65

आह .. कभी नहीं पता था कि हम 3 दिन प्रति 400 yrs गिरा देते हैं। 9 के बारे में - मैं 1100 (मेलबोर्न) को -1000 (हवाई) से मेरा समय क्षेत्र बदल गया है और new Date(2014,0,26,9)एक रविवार सही दे रही थी ISOऔर साथ ही स्ट्रिंग getDay()के रूप में 0
अनुकूलक

3

जावास्क्रिप्ट, ईएस 6, 222 219 199 बाइट्स

मैंने रसेट्टा विकी में कोई जावास्क्रिप्ट उत्तर नहीं देखा।

ये रहा:

S=Y=>{for(l=[],p=new Date(Y,i=0);i<365+!(Y%4);)if(!(d=new Date(Y,0,++i,9)).getDay()){p.getMonth()-d.getMonth()&&l.push(p);p=new Date(d)}return[...l,p].map(x=>x.toISOString().split("T")[0]).join(" ")}

यह एक समारोह बनाता है S जो वांछित आउटपुट के साथ एक स्ट्रिंग देता है। समारोह भी लीप वर्ष का ख्याल रखता है।

ES6 के कारण, यह केवल एक नवीनतम फ़ायरफ़ॉक्स में काम करता है।

टिप के लिए अप्सिलर्स का धन्यवाद जो इसे 200 बाइट्स तक कम कर दिया

एक ढेर टुकड़ा जिसे आप यहां ही चला सकते हैं के रूप में नीचे ungolfed संस्करण खोजें:

S=Y=>{
  for(l=[],p=new Date(Y,i=0);i<365+!(Y%4);)
    if(!(d=new Date(Y,0,++i,9)).getDay()){
      p.getMonth()-d.getMonth()&&l.push(p);
      p=new Date(d)
    }
  return[...l,p].map(x=>x.toISOString().split("T")[0]).join(" ")
}

alert(S(parseInt(prompt())))


आप parseInt के बजाय + प्रॉम्प्ट () का उपयोग कर सकते हैं और कुछ बाइट्स से दाढ़ी बना सकते हैं
याकूब

@Jacob बाइट गिनती में संकेत नहीं जोड़ा जाता है।
ऑप्टिमाइज़र

ओआईसी। मुझे सवाल पढ़ना चाहिए ...
याकूब

@apsillers एक टन धन्यवाद! समस्या को ठीक किया और अपने टिप के आधार पर इसे बहुत कम कर दिया।
ऑप्टिमाइज़र

इनपुट 2100आउटपुट 2100-01-31 2100-02-28 2100-03-28 2100-04-25 2100-05-30 2100-06-27 2100-07-25 2100-08-29 2100-09-26 2100-10-31 2100-11-28 2100-12-26 2101-01-02गलत है।
Qwertiy

3

रॉल - 120 116 80 79 76

d: do join"1-1-"input print collect[for m 2 13 1[d/2: m keep d - d/weekday]]


अनगोल्डेड + कुछ एनोटेशन:

d: do join "1-1-" input         ;; golfy way to create Rebol date! datatype 1-Jan-(year)

print collect [
    for m 2 13 1 [              ;; loop thru months 2 to 13!
        d/2: m                  ;; move to (1st of) next month
        keep d - d/weekday      ;; collect/keep last sunday of month
    ]
]

REBOL कंसोल में रविवार गणना का उदाहरण:

>> ; get last sunday of Jan 2014

>> d: 1-1-2014
== 1-Jan-2014

>> d/month: d/month + 1
== 2

>> d
== 1-Feb-2014

>> d/weekday
== 6

>> d - d/weekday
== 26-Jan-2014

>> ; above is last sunday of Jan 2014
>> ; and when pass end of year (ie. month 13!)

>> d/month: 13
== 13

>> d
== 1-Jan-2015

संभावित 87: d: 1-1-1 d / वर्ष: इनपुट प्रिंट कलेक्ट करें [दोहराएं m 12 [d / महीना: m + 1 रखें d - d / कार्यदिवस]]
rgchris

@rgchris धन्यवाद क्रिस। करने के लिए एक और 7 वर्णों दाढ़ी करने में सक्षम था।
द्रंग्तुन

अच्छा !! यह बुरा है, लेकिन वास्तव में कभी नहीं के बारे में सोच के लिए एक शॉर्टकट होने के रूप में।
rgchris

2

CJam, 122 102 बाइट्स

30li:X400%){[1387Yb30f+~28I!I4%!I100%e&|g+\]W%{\_2$>7*-\7%7\m1$+}/}fI;]12/W=12,{101+s1>}%]z{X+W%'-*S}/

इस तिथि को पुस्तकालय के किसी भी रूप का उपयोग नहीं करता। यह भी अभी भी, एक बहुत golfed किया जा सकता है मुझे लगता है।

इसका परीक्षण यहां करें।


3
मैं इतना शानदार हूं कि एक सीजेएम उत्तर एक बार के लिए कोड-गोल्फ चुनौती में शीर्ष उत्तर नहीं है। मैं खुश मर सकता हूँ .. आज एक अच्छा दिन है (जब तक कि यह 6 बाइट्स से कम न हो जाए, जाहिर है)
ब्रैंडन

@ ब्रेंडन: यही कारण था कि मुझे लगा कि यह दिलचस्प होगा। वास्तव में कुछ अद्भुत पुस्तकालय देखने की उम्मीद है जो इसे आसान बनाता है, लेकिन अब तक निराश है।
फिल एच।

1

आर, 128 वर्ण

P=paste;f=format;a=strptime(P(1:366,scan()),"%j %Y");cat(sort(sapply(split(a,f(a,"%B")),function(x)P(tail(x[f(x,"%u")==7],1)))))

लाइन ब्रेक के साथ:

P=paste
f=format
a=strptime(P(1:366,scan()),"%j %Y")
cat(sort(sapply(split(a,f(a,"%B")),function(x)P(tail(x[f(x,"%u")==7],1)))))

1

सी # 255

Ungolfed

static void Main(string[] a)
    {
        int y = Int32.Parse(Console.ReadLine());
        DateTime d = new DateTime(y, 1, 1);
        while (d.Year == y)
        {
            if (d.DayOfWeek == DayOfWeek.Sunday && d.Day>(DateTime.DaysInMonth(y,d.Month)-7))
                Console.WriteLine(d.ToShortDateString());
            d = d.AddDays(1);
        }
        Console.ReadKey();
    }

संपादित करें: केवल पिछले रविवार को मुद्रित करने के लिए संशोधित :)


नहीं आवश्यक आउटपुट प्रारूप। + इस कोड गोल्फ है
edc65

1

क्ष, 67

{({{1<>x mod 7}-[;1]/x}')14h$1_til[13]+13h$"D"$(($)x),".01.01"}

वहाँ कोई तारीख पुस्तकालयों क्ष में इस के लिए प्रयोग करने योग्य हैं?
फिल एच

1

"ओह, नहीं, उसे फिर से!"

जावा - 259 246 बाइट्स

void g(int y){for(int i=;i<12;i++){GregorianCalendar c=new GregorianCalendar(y,i,0);c.set(c.DAY_OF_WEEK,c.SUNDAY);c.set(c.DAY_OF_WEEK_IN_MONTH,-1);System.out.print(y+"-"+String.format("%02d",(c.get(c.MONTH)+1))+"-"+(c.get(c.DAY_OF_MONTH))+" ");}}

Ungolfed संस्करण:

void g(int y){
    for (int i = 0; i < 12;i++) {
        GregorianCalendar c = new GregorianCalendar(y, i, 0);
        c.set(c.DAY_OF_WEEK, c.SUNDAY);
        c.set(c.DAY_OF_WEEK_IN_MONTH, -1);
        System.out.print(y+"-"+String.format("%02d",(c.get(c.MONTH)+1))+"-"+(c.get(c.DAY_OF_MONTH))+" ");
    }
}

उपयोग:

import java.util.GregorianCalendar;
import java.util.Scanner;

public class LastSundayInYear {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Year?");
        int year = scanner.nextInt();
        LastSundayInYear sunday = new LastSundayInYear();
        sunday.g(year); 
    }

    void g(int y){
        for (int i = -1; ++i < 12;) {
            GregorianCalendar c = new GregorianCalendar(y, i, 0);
            c.set(c.DAY_OF_WEEK, c.SUNDAY);
            c.set(c.DAY_OF_WEEK_IN_MONTH, -1);
            System.out.print(y+"-"+String.format("%02d",(c.get(c.MONTH)+1))+"-"+(c.get(c.DAY_OF_MONTH))+" ");
        }
    }
}

आउटपुट:

2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28

फिर भी एक और जवाब "चलो एक जावा बस के लिए kicks उत्तर डाल"। ओह अच्छा। लेकिन, कम से कम, जब से तुम मेरा उत्तर के इस बिंदु तक पहुंचने के लिए परेशान है, मैं बोर करने के लिए आप कुछ और कोशिश करते हैं और मेरी तर्क का तरीका बताएंगे।

विधि gवांछित साल प्राप्त करता है और प्रत्येक महीने के लिए, एक बनाता है GregorianCalendarवस्तु (महीनों 0 से 11 के लिए जाना)। फिर, पहले c.setसेट एक रविवार और दूसरे के रूप में सप्ताह के दिन घोषणा करता है कि हम चाहते हैं कि पिछले महीने के सप्ताह - के रूप में पर देखा आधिकारिक दस्तावेजSystem.out.printlnकि रविवार की तिथि बाहर प्रिंट (यदि हम यह सही कर रहे थे, साल के रूप में मुद्रित किया जाएगा c.get(c.YEAR), लेकिन का उपयोग कर yफिर से 13 वर्ण बंद शेव), महीने जनवरी से सितंबर के एक अग्रणी शून्य जोड़ने के लिए स्वरूपित किया जाना है (और मूल्य, क्योंकि अच्छी तरह से, यहाँ में महीने 0-11 प्रतिनिधित्व कर रहे हैं वृद्धि की जाती है) और पिछले रविवार के दिन छपा है। और इस प्रक्रिया को अन्य ग्यारह महीनों के लिए दोहराया जाता है।


0

सी #, 212 , 237

string x(int y){var s="";var t="";var d=new DateTime(y,1,1);for(;;){if(d.Year!=y){return s;}t=(d.DayOfWeek==DayOfWeek.Sunday)?t=string.Format("{0}-{1}-{2} ",d.Year,d.Month,d.Day):t;s=(d.AddDays(1).Month!=d.Month)?s+=t:s;d=d.AddDays(1);}}

पंक्ति विराम के साथ

string x(int y)
    {
        var s = "";
        var t = "";
        var d = new DateTime(y,1,1);
        for (;;)
        {
            if (d.Year != y) {
                return s;
            }
            t = (d.DayOfWeek == DayOfWeek.Sunday) ? t = string.Format("{0}-{1}-{2} ", d.Year, d.Month, d.Day) : t;
            s=(d.AddDays(1).Month!=d.Month)?s+=t:s;
            d=d.AddDays(1);
        }
    }

2014 में उत्पादन

"2015-1-25 2015-2-22 2015-3-29 2015-4-26 2015-5-31 2015-6-28 2015-7-26 2015-8-30 2015-9-27 2015-10-25 2015-11-29 2015-12-27"

नहीं आवश्यक उत्पादन प्रारूप
edc65

वहाँ, तय की। बेहतर?
डैरेन ब्रिन

0

सी # 171

समारोह एक स्ट्रिंग लौटने।

string S(int y){var r="";for(int m=1;m<13;++m){var d=new System.DateTime(y,1,1).AddMonths(m).AddDays(-1);r+=y+string.Format("-{0:00}-{1} ",m,d.Day-d.DayOfWeek);}return r;}

Ungolfed

string S(int y)
{
    var r="";
    for (int m=1;m<13;++m)
    {
        var d = new System.DateTime(y, 1, 1).AddMonths(m).AddDays(-1);
        r += y + string.Format("-{0:00}-{1} ", m, d.Day - d.DayOfWeek);
    }
    return r;
}

0

सी # 194

LINQ का उपयोग:

string d(int y){return string.Join(" ",Enumerable.Range(1,12).Select(m=>new DateTime(y,m,DateTime.DaysInMonth(y,m))).Select(d=>d.AddDays(-(int)d.DayOfWeek)).Select(d=>d.ToString("yyy-MM-dd")));}

Ungolfed

string d(int y)
{
    return string.Join(" ",Enumerable.Range(1,12)
        .Select(m => new DateTime(y, m, DateTime.DaysInMonth(y, m)))
        .Select(d => d.AddDays(-(int)d.DayOfWeek))
        .Select(d => d.ToString("yyy-MM-dd")));
}

उत्पादन

2013-01-27 2013-02-24 2013-03-31 2013-04-28 2013-05-26 2013-06-30 2013-07-28 2013-08-25 2013-09-29 2013-10-27 2013-11-24 2013-12-29

0

मेथेमेटिका - 171

एक अनाम फ़ंक्शन में लिपटे, स्ट्रिंग लौटाता है

StringJoin[Last@#~DateString~{"Year","-","Month","-","Day"," "}&/@GatherBy[Select[DateRange[DateObject[{#}],DateObject[{#+1}]],DayName@#==Sunday&],DateValue[#,"Month"]&]]&

सबसे पहले mathematica गोल्फ। मुझे लगता है कि यह काफी हद तक कम किया जा सकता है।


0

वीबी-192

Function z(y)
For i = 1 To 11
a = 0
s = IIf(i <> 11, DateSerial(y, i + 1, 1), DateSerial(y + 1, 1, 1))
While Weekday(s - a) <> 1
a = a + 1
Wend
r = r + Str(s - a) + " "
Next
z = r
End Function

बदतर हो सकता है ^ ^

मेरी दूसरी और अंतिम प्रविष्टि (मुझे नहीं लगता कि मैं इसे छोटा कर सकता हूं)

142

Function z(y)
Dim m(12)
For i = 1 To 366
s = DateSerial(y, 1, 1) + i
If Weekday(s) = 1 Then m(Month(s)) = s
Next
z = Join(m, " ")
End Function

0

रूबी 76

एक कमांडलाइन पैरामीटर का उपयोग करता है ruby sundays.rb 1900। दिनांक पुस्तकालय का उपयोग करता है।

require'date';puts (1..12).map{|m|d=Date.new($*[0].to_i,m,-1);d-d.wday}*" "
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.