अंतिम सोमवार


27

सोमवार, 31 अक्टूबर, हैलोवीन है। और यह मुझे सोच में पड़ गया - मुझे आश्चर्य है कि महीने के अंतिम दिन अन्य महीनों में सोमवार भी होते हैं?

इनपुट

  • एक सकारात्मक पूर्णांक किसी भी सुविधाजनक प्रारूप में एक साल का प्रतिनिधित्व करने वाली 10000 > y > 0
  • यदि आवश्यक हो तो इनपुट को शून्य (जैसे, 0025वर्ष के लिए 25) के साथ गद्देदार किया जा सकता है।

उत्पादन

  • उस वर्ष के महीनों की एक सूची जहां महीने का आखिरी दिन सोमवार होता है।
  • यह महीने के नाम (जैसे, January, March, October), या शॉर्टनेम ( Jan, Mar, Oct), या संख्या ( 1, 3, 10), के रूप में अलग लाइनों या एक सूची या सीमांकित, आदि के रूप में हो सकता है, बस जब तक यह पाठक के लिए अस्पष्ट है।
  • आउटपुट स्वरूप सुसंगत होना चाहिए:
    • सभी वर्षों के इनपुट के लिए (मतलब, आप कुछ इनपुट के लिए महीने के नाम का उत्पादन नहीं कर सकते हैं, और अन्य इनपुट के लिए महीने की संख्या)
    • अच्छी तरह से उत्पादन प्रति सुसंगत रूप में के रूप में (जिसका अर्थ है, आप कर सकते हैं नहीं उत्पादन 1के लिए Januaryके रूप में ही उत्पादन में Julके लिए July)
    • मूल रूप से, एक प्रारूप चुनें और उससे चिपके रहें।

नियम

  • इनपुट / आउटपुट के लिए ग्रेगोरियन कैलेंडर मान लें, यहां तक ​​कि नीचे भी y = 1
  • लीप वर्ष का ठीक से हिसाब होना चाहिए (एक अनुस्मारक के रूप में: हर साल 4 से विभाज्य, 100 से विभाज्य नहीं वर्षों को छोड़कर, जब तक कि 400 - 1700, 1800 से विभाज्य न हो, सभी लीप वर्ष नहीं थे, लेकिन 2000 था)।
  • आप अपनी पसंद के किसी भी बिल्ट-इन या अन्य तारीख गणना उपकरण का उपयोग कर सकते हैं।
  • या तो एक पूर्ण कार्यक्रम या एक समारोह स्वीकार्य हैं। यदि कोई फ़ंक्शन है, तो आप इसे प्रिंट करने के बजाय आउटपुट वापस कर सकते हैं।
  • मानक खामियों को मना किया जाता है।
  • यह इसलिए सभी सामान्य गोल्फिंग नियम लागू होते हैं, और सबसे छोटा कोड (बाइट्स में) जीतता है।

उदाहरण

   1 --> Apr, Dec
 297 --> May
1776 --> Sep
2000 --> Jan, Jul
2016 --> Feb, Oct
3385 --> Jan, Feb, Oct

लीडरबोर्ड



1
संबंधित लेकिन डुप्लिकेट नहीं या?
एलपीड्रो

@ElPedro संबंधित लेकिन डुप्लिकेट नहीं। पहला किसी भी बिल्ट-इन को अनुमति नहीं देता है और एक निश्चित तारीख / दिन कॉम्बो (शुक्रवार 13 वीं शुक्रवार) के लिए पूछता है, जबकि दूसरा साल के हर महीने के आखिरी रविवार को 1900 से 3015 के बीच सीमित करने के लिए कहता है।
AdmBorkBork

क्षमा करें @TimmD। आपकी टिप्पणी की मेरी गलतफहमी।
एलपेड्रो

1
@ElPedro कोई समस्या नहीं! मैं बल्कि एक सवाल होगा और यह स्पष्ट है, एक सवाल नहीं है और कुछ अस्पष्ट है।
AdmBorkBork

जवाबों:


2

Dyalog एपीएल के साथ dfns की कैलोरी , संस्करण 15.0: 22; संस्करण 16.0: 19 बाइट्स

कैल फ़ंक्शन एक डिफ़ॉल्ट इंस्टॉल के साथ आता है, बस दर्ज करें )copy dfns

संस्करण 15.0: ∊⎕{⍵/⍨2=≢⍎⊢⌿cal⍺⍵}¨⍳12

सूची (समतल)

⎕{... निम्नलिखित अनाम फ़ंक्शन के लिए बाएं तर्क के रूप में संख्यात्मक इनपुट, सही पक्ष मानों में से प्रत्येक को बदले में दाएं तर्क के रूप में लेते हैं

⍵/⍨ तर्क यदि (खाली सूची देता है तो नहीं)

2= दो (रविवार और सोमवार को) बराबर है

का टैली

में संख्या

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

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

⍺⍵ वर्ष बाएं-तर्क, महीने सही-तर्क, बाद वाला

⍳12 1 से 12

संस्करण 16.0: ⍸2=⎕{≢⍎⊢⌿cal⍺⍵}¨⍳12

सूचकांक जहां

2= दो बराबर (रविवार और सोमवार को)

⎕{... निम्नलिखित अनाम फ़ंक्शन के लिए बाएं तर्क के रूप में संख्यात्मक इनपुट, सही पक्ष मानों में से प्रत्येक को बदले में दाएं तर्क के रूप में लेते हैं

का टैली

में संख्या

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

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

⍺⍵ वर्ष बाएं-तर्क, महीने सही-तर्क, बाद वाला

⍳12 1 से 12


19

जावास्क्रिप्ट (फ़ायरफ़ॉक्स 30+), 112 109 103 95 बाइट्स

देखो मा, कोई बिल्ट-इन नहीं!

y=>[for(m of(i=0,y%4|y%400*!(y%100)&&6)+"63153042641")if((i++,y+(y>>2)-(y/100|0)*3/4|0)%7==m)i]

यहाँ 107-बाइट ES6 संस्करण है:

y=>[...(y%4|y%400*!(y%100)&&6)+"63153042641"].map((m,i)=>(y+(y>>2)-(y/100|0)*3/4|0)%7-m?0:i+1).filter(x=>x)

और यहाँ मेरा पिछला प्रयास, ES 113 के 123 113 बाइट्स हैं:

y=>[(l=y%4|y%400*!(y%100))?[7]:[1,7],[4,12],[9],[3,6],[8,11],[5],l?[1,2,10]:[2,10]][(y+(y>>2)-(y/100|0)*3/4|0)%7]

व्याख्या

किसी विशेष वर्ष के सप्ताह के दिन की गणना इस प्रकार की जाती है:

y+(y>>2)-(y/100|0)*3/4|0)%7

दूसरे शब्दों में:

  • ले लो y
  • 4 साल पहले y( y>>2) की संख्या जोड़ें ।
  • 100 वें वर्ष y( y/100|0) से पहले की संख्या घटाएँ ।
  • 400 साल पहले की संख्या में वापस जोड़ें y; यह 1/4 है y/100|0, इसलिए हम उपयोग करते हैं *3/4|0

फिर हम परिणाम को 7. से मापते हैं। यदि हम 0रविवार, 1माध्य सोमवार आदि का मतलब रखते हैं, तो परिणाम उस वर्ष के 31 दिसंबर के सप्ताह के दिन से मेल खाता है। इसलिए, दिसंबर के लिए, हम जांचना चाहते हैं कि परिणाम क्या है 1। यह हमें स्ट्रिंग में अंतिम चार देता है।

नवंबर का आखिरी दिन दिसंबर के आखिरी दिन से 31 दिन पहले होता है। इसका मतलब यह है कि नवंबर के अंतिम दिन के लिए सोमवार को, 31 दिसंबर को एक (1 + 31) % 7 = 4= गुरुवार होने की आवश्यकता है ।

यह प्रक्रिया तब तक दोहराई जाती है जब तक हम मार्च (ए 3) में वापस नहीं आ जाते । लीप दिन है या नहीं, फरवरी के आखिरी दिन मार्च के आखिरी दिन से 31 दिन पहले हैं, इसलिए हम इसकी गणना भी कर सकते हैं (यह (3 + 31) % 7 = 6)। मुश्किल हिस्सा जनवरी के लिए सही मान पा रहा है:

  • यदि यह एक लीप वर्ष है, तो जनवरी का अंतिम दिन फरवरी के अंतिम दिन से 29 दिन पहले होता है, जिसके परिणामस्वरूप (6 + 29) % 7 = 0
  • अन्यथा, यह फ़रवरी के आखिरी दिन से 28 दिन पहले है, जिसके परिणामस्वरूप (6 + 28) % 7 = 6

हम निम्नलिखित स्निपेट के साथ एक लीप वर्ष है या नहीं इसकी गणना कर सकते हैं:

!(y%400)|y%100*!(y%4)

यह देता है 0अगर yएक लीप वर्ष नहीं है, और एक सकारात्मक पूर्णांक अन्यथा। यह हमें ले जाता है

!(y%400)|y%100*!(y%4)?0:6

जनवरी के लिए दिन की गणना के लिए। हालाँकि, हम शर्तों को उलट कर बेहतर कर सकते हैं:

y%4|y%400*!(y%100)?6:0

चूँकि मिथ्या परिणाम हमेशा 0 होता है, हम इसे कम कर सकते हैं

y%4|y%400*!(y%100)&&6

एक और कीमती बाइट की बचत।

यह सब एक साथ रखकर, हम स्ट्रिंग में प्रत्येक चार के माध्यम से लूप करते हैं, यह जांचते हुए कि प्रत्येक 31 दिसंबर के सप्ताह के दिन के बराबर है या नहीं। हम इस सरणी को अंत में लौटाने वाले मिलानों की अनुक्रमणिका रखते हैं। और यह है कि आप बिल-इन के बिना लीप वर्ष की गणना कैसे करते हैं।


Owww ... मेरा दिमाग, क्या आप अल्ला में लीप वर्षों के लिए खाते हैं?
मैजिक ऑक्टोपस Urn

2
@carusocomputing यही !(y%4)*y%100|!(y%400)है। प्रत्येक वर्ष 4 से विभाज्य, 100 से विभाज्य नहीं है, जब तक कि 400 से विभाज्य न हो
mbomb007

उम्मीद है कि y+(y>>2)+(z=y/25>>2)+(z>>2)अभी भी आपको एक बाइट बचाता है।
नील

@ धन्यवाद, लेकिन मुझे एक बेहतर तरीका मिला :-)
ETHproductions

अच्छा; मैंने अपने बैच पोर्ट पर 6 बाइट्स का उपयोग करके बचाया (y*5/4-(y/100)*3/4)
नील

11

जावास्क्रिप्ट (फ़ायरफ़ॉक्स 30-57), 67 65 64 63 61 बाइट्स

y=>[for(_ of(m='')+1e11)if(new Date(y+400,++m).getDay()==2)m]

सहेजे गए 2 4 6 बाइट्स @ETHproductions के लिए धन्यवाद। रिवर्स ऑर्डर में महीनों को आउटपुट करके एक और बाइट को बचाया।


मुझे लगता है कि आप इसे बिना .keys()y=>[for(_ of(m=0,Array(12)))if(new Date(y+400,++m).getDay()==2)m]
विंग के

@ETHproductions मैं आदेश को उलट कर एक और बाइट बचा सकता हूं!
नील

रिवर्स ऑर्डर ठीक है। आउटपुट स्वरूपण इस चुनौती का दिलचस्प हिस्सा नहीं है।
AdmBorkBork

अब ऐरे कॉम्प्रिहेंशन पर हमारी नीति क्या है कि उन्हें कल्पना से हटा दिया गया है?
मेयरमोनी

आप एक और 2 बाइट्स को Array(12)पूरी तरह से y=>[for(_ of(m=0,1e11+""))if(new Date(y+400,++m).getDay()==2)m]
स्किप

8

MySQL, 183 134 129 106 बाइट्स

SET @y=2016;SELECT help_topic_id AS m FROM mysql.help_topic HAVING m BETWEEN 1 AND 12 AND 2=DAYOFWEEK(LAST_DAY(CONCAT(@y,-m,-1)))

2016वांछित वर्ष के साथ बदलें । चलाएँ।

Rev. 2: help_topicsएक अस्थायी तालिका बनाने के बजाय डिफ़ॉल्ट स्थापना में तालिका का उपयोग किया।

Rev.3- : एडॉप्ट किए गए आंसू की चाल और ध्यान दें कि मैं इसके लिए उद्धरण भी छोड़ सकता हूं "-1"
हालांकि, -1MySQL में आवश्यक है: मुझे एक पूर्ण तिथि चाहिए।

Rev.4: प्रतिबंध (-6) के m BETWEEN 1 AND 12रूप में किया जा सकता है m>0 AND m<13, लेकिन इसकी बिल्कुल भी आवश्यकता नहीं है - अमान्य मानों को अनदेखा किया जाएगा; चेतावनियों को गिना जाएगा लेकिन सूचीबद्ध नहीं किया जाएगा।


तुम सच में मेज शमा mysql की जरूरत है? mariadb.com/kb/en/mariadb/mysqlhelp_topic-table
Jörg Hülsermann

@ JörgHülsermann मैं आपकी बात नहीं मानता।
टाइटस

FROM help_topicबिना mysql.काम के चाहिए ? मैंने इसे
आजमाया

@ JörgHülsermann केवल तभी जब आप प्रिपेंड करते हैं USE mysql;सही डेटाबेस को किसी तरह चुना जाना चाहिए।
टाइटस

5

पर्ल, 64 बाइट्स

के लिए +1 शामिल है -n

STDIN पर इनपुट दें:

perl -M5.010 mon.pl <<< 2016

mon.pl:

#!/usr/bin/perl -n
map$b.=$/.gmtime$_.e4,-7e6..3e7;say$b=~/on (\S+ )\S.* $_.* 1 /g

5

बैच, 160 152 बाइट्स

@set/ay=%1,m=0,j=6*!(!(y%%4)*(y%%100)+(y%%400)),y=(y*5/4-y/100*3/4)%%7
@for %%d in (%j% 6 3 1 5 3 0 4 2 6 4 1)do @set/am+=1&if %%d==%y% call echo %%m%%

@ ETHproduction के उत्तर का पोर्ट। 197 189 बाइट्स के लिए महीने के संक्षिप्त विवरण के साथ :

@set/ay=%1,j=6*!(!(y%%4)*(y%%100)+(y%%400)),y=(y*5/4-y/100*3/4)%%7
@for %%m in (Jan.%j% Feb.6 Mar.3 Apr.1 May.5 Jun.3 Jul.0 Aug.4 Sep.2 Oct.6 Nov.4 Dec.1)do @if %%~xm==.%y% call echo %%~nm

4

जे, 48 34 33 बाइट्स

[:I.(2=7|_2#@".@,@{.])&>@calendar

@ Adám की मदद से 15 बाइट्स बचाए

महीनों का प्रतिनिधित्व करने वाले तार की एक सरणी उत्पन्न करने के लिए कैलेंडर बिलिन का उपयोग करता है, फिर यह निर्धारित करने के लिए प्रत्येक स्ट्रिंग को पार्स करता है कि क्या अंतिम सोमवार महीने का आखिरी दिन है। यह प्रत्येक महीने के प्रत्येक महीने की संख्या के रूप में आउटपुट करता है। यह है कि, Jan = 0, Feb = 1, ..., Dec = 11

का आउटपुट calendarहै

   _3 ]\ calendar 2016
┌─────────────────────┬─────────────────────┬─────────────────────┐
│         Jan         │         Feb         │         Mar         │
│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│
│                 1  2│     1  2  3  4  5  6│        1  2  3  4  5│
│  3  4  5  6  7  8  9│  7  8  9 10 11 12 13│  6  7  8  9 10 11 12│
│ 10 11 12 13 14 15 16│ 14 15 16 17 18 19 20│ 13 14 15 16 17 18 19│
│ 17 18 19 20 21 22 23│ 21 22 23 24 25 26 27│ 20 21 22 23 24 25 26│
│ 24 25 26 27 28 29 30│ 28 29               │ 27 28 29 30 31      │
│ 31                  │                     │                     │
├─────────────────────┼─────────────────────┼─────────────────────┤
│         Apr         │         May         │         Jun         │
│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│
│                 1  2│  1  2  3  4  5  6  7│           1  2  3  4│
│  3  4  5  6  7  8  9│  8  9 10 11 12 13 14│  5  6  7  8  9 10 11│
│ 10 11 12 13 14 15 16│ 15 16 17 18 19 20 21│ 12 13 14 15 16 17 18│
│ 17 18 19 20 21 22 23│ 22 23 24 25 26 27 28│ 19 20 21 22 23 24 25│
│ 24 25 26 27 28 29 30│ 29 30 31            │ 26 27 28 29 30      │
│                     │                     │                     │
├─────────────────────┼─────────────────────┼─────────────────────┤
│         Jul         │         Aug         │         Sep         │
│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│
│                 1  2│     1  2  3  4  5  6│              1  2  3│
│  3  4  5  6  7  8  9│  7  8  9 10 11 12 13│  4  5  6  7  8  9 10│
│ 10 11 12 13 14 15 16│ 14 15 16 17 18 19 20│ 11 12 13 14 15 16 17│
│ 17 18 19 20 21 22 23│ 21 22 23 24 25 26 27│ 18 19 20 21 22 23 24│
│ 24 25 26 27 28 29 30│ 28 29 30 31         │ 25 26 27 28 29 30   │
│ 31                  │                     │                     │
├─────────────────────┼─────────────────────┼─────────────────────┤
│         Oct         │         Nov         │         Dec         │
│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│ Su Mo Tu We Th Fr Sa│
│                    1│        1  2  3  4  5│              1  2  3│
│  2  3  4  5  6  7  8│  6  7  8  9 10 11 12│  4  5  6  7  8  9 10│
│  9 10 11 12 13 14 15│ 13 14 15 16 17 18 19│ 11 12 13 14 15 16 17│
│ 16 17 18 19 20 21 22│ 20 21 22 23 24 25 26│ 18 19 20 21 22 23 24│
│ 23 24 25 26 27 28 29│ 27 28 29 30         │ 25 26 27 28 29 30 31│
│ 30 31               │                     │                     │
└─────────────────────┴─────────────────────┴─────────────────────┘

प्रयोग

   f =: [:I.(2=7|_2#@".@,@{.])&>@calendar
   f 1
3 11
   f 297
4
   f 1776
8
   f 2000
0 6
   f 2016
1 9
   f 3385
0 1 9

व्याख्या

[:I.(2=7|_2#@".@,@{.])&>@calendar  Input: year Y
                         calendar  Get 12 boxes each containing a month
    (                )&>@          Operate on each box
                    ]                Identity, get the box
         _2       {.                 Take the last two strings
                ,@                   Flatten it
             ".@                     Parse it into an array of integers
           #@                        Get the length
       7|                            Take it modulo 7
     2=                              Test if it equals 2 - it will either
                                     have two days or 9 days in the last
                                     two lines if the end is on a Monday
[:I.                               Return the indices containing a true value

रुको, कैलेंडर वास्तव में ascii कला उत्पादन करता है?
विनाशकारी नींबू

@DestructibleWatermelon सटीक होने के लिए, आउटपुट स्वरूप calendar12 बॉक्स का एक सरणी है जहां प्रत्येक बॉक्स में पात्रों का 2d सरणी होता है
मील

मैं यह भी नहीं जानता कि जे में "प्रत्येक" कैसे करना है, लेकिन यह पहले से बहुत छोटा है: I.7=;#&.>".&.>,&.>_2{.&.>calendar 2016यदि आप सभी "अंडर-ओपन" को जोड़ते हैं तो आपको इसे बहुत छोटा करने में सक्षम होना चाहिए।
Adám

@ Adám धन्यवाद, यह एक बेहतर विधि का उपयोग करता है, लेकिन यह जे में एक क्रिया नहीं है। मुझे लगता है कि यह अभी भी मदद करेगा
मील

मेरा इरादा केवल प्रेरणा देना था। मुझे पता है कि यह एक क्रिया नहीं है।
आदम

4

गणितज्ञ, 62 57 बाइट्स

DayName@DayRange[{#},{#+1},"EndOfMonth"]~Position~Monday&

अनाम फ़ंक्शन। एक संख्या को इनपुट के रूप में लेता है और आउटपुट के रूप में संख्याओं के एकल-तत्व सूचियों की सूची देता है। मैं ईमानदारी से अपने आप पर यकीन नहीं कर रहा हूं कि यह कैसे काम करता है।


4

पर्ल + कैल, 46 बाइट्स

say`cal $_ $ARGV[0]`=~/\n.{5}\n/&&$_ for 1..12

उदाहरण:

$ perl -E 'say`cal $_ $ARGV[0]`=~/\n.{5}\n/&&$_ for 1..12' 2016

2







10


$

1
कड़ाई से बोलना, यह perl + cal है, न कि perl :-p। उदाहरण के लिए, मेरी विंडोज मशीन में गड़बड़ी है, लेकिन यह वहां काम नहीं करेगा।
दार्शनिक

फेयर पॉइंट, इसे और मेरे बैश प्रयास को अपडेट किया।
स्टीव

4

जावा 7,186 182 172 बाइट्स

4 बाइट बचाने के लिए केविन का
धन्यवाद 10 बाइट बचाने के लिए @cliffroot को धन्यवाद

int[]f(int n){int c=n-1,x=c*365+c/4+c/400-c/100,k=0,b[]={3,(n%4<1&n%100>0)|n%400<1?1:0,3,2,3,2,3,3,2,3,2,3},a[]=new int[12];for(int i:b)a[k++]=(x+=i+28)%7==1?1:0;return a;}

ungolfed

int[] f(int n) {
 int c=n-1,x=c*365+(c/4)+(c/400)-(c/100),k=0,
   b[] = {3,(n % 4 < 1 & n % 100 > 0) | n % 400 < 1 ? 1 : 0
                                     ,3,2,3,2,3,3,2,3,2,3},a = new int[ 12 ];

 if ( (n % 4 < 1 & n % 100 > 1) | n % 400 < 1 )
     b[ 1 ] = -1;
 for (int i : b)
    a[ k++ ] = (x += i + 28) % 7 == 1 ? 1 : 0;

return a;
     }

यह संस्करण @cliffroot ( 168 बाइट्स ) द्वारा प्रदान किया गया है

 static int[] f(int n) {
 int b = 13561787 | ( (n%4 < 1 & n%100 > 0) | n%400 < 1 ? 1 << 20 : 0 ),
           x = --n*365 + n/4 + n/400 - n/100,a[]=new int[12],k=0;
    while (k < 12)
    a[k++] = (x += (b >> 24 - k*2&3 ) + 28) % 7 == 1 ? 1 : 0;
  return a;   }
    }

आउटपुट नमूना

1 1 0 0 0 0 0 0 0 1 0 0(for input 3385)

1
बाद मैं अपने जवाब लिखा मैं सब कुछ की गणना अपने आप कम हो जाएगा जानता था .. :) Btw, आप गोल्फ कर सकते हैं n%4==0करने के लिए n%4<1; n%400==0करने के लिए n%400<1और int c=...;int[]b=...,a=...करने के लिए int c=...,b[]=...,a[]=...
केविन क्रूज़सेन

1
bऔर इस तरह aसे intभाग में परिभाषित किया जा सकता है :int ... ,b[]=...,a[]=...
ओलिवियर ग्रेजायर

1
int[]f(int n){int x=--n*365+n/4+n/400-n++/100,k=0,b[]={1,(n%4<1&n%100>0)|n%400<1?-1:-2,1,0,1,0,1,1,0,1,0,1},a[]=new int[12];for(int i:b)a[k++]=(x+=i+30)%7==1?1:0;return a;}कुछ बाइट्स सहेजे गए
क्लिफरॉट

1
भी बदल सकते हैं bकरने के लिए b[]={3,(n%4<1&n%100>0)|n%400<1?1:0,3,2,3,2,3,3,2,3,2,3}और i+30करने के लिए i+282 और बाइट्स के लिए
cliffroot

1
और एक और 3 बाइट्सint[]f(int n){int b=13561787|((n%4<1&n%100>0)|n%400<1?1<<20:0),x=--n*365+n/4+n/400-n/100,a[]=new int[12],k=0;while(k<12)a[k++]=(x+=(b>>24-k*2&3)+28)%7==1?1:0;return a;}
क्लिफरोट

3

अजगर 2, 100 बाइट्स

ओह। तारीखों के साथ गणित उतना आसान नहीं है जितना मैं चाहूंगा।

lambda y:[m+1for m in range(12)if(date(y,12,31)if m>10else(date(y,m+2,1)-timedelta(1))).weekday()<1]

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

एक ही लंबाई:

lambda y:[m-1for m in range(2,14)if(date(y,12,31)if m>12else(date(y,m,1)-timedelta(1))).weekday()<1]

मैं भी इस के साथ अजगर की कोशिश करने के लिए नहीं जा रहा था। अच्छा प्रयास है।
एलपेड्रो

3

MATL , 21 बाइट्स

12:"G@QhO6(YO9XO77=?@

महीनों को संख्या के रूप में प्रदर्शित किया जाता है।

इसे ऑनलाइन आज़माएं! या सभी परीक्षण मामलों को सत्यापित करें

व्याख्या

यह दिनांक रूपांतरण अंतर्निहित कार्यों का उपयोग करता है। दिए गए वर्ष के लिए यह परीक्षण करता है कि कौन सा महीना सोमवार है।

महीने के अंतिम दिन k(जो कि 28, 29, 30 या 31 हो सकता है) को स्पष्ट रूप से निर्दिष्ट करने के बजाय , हम महीने के अंतिम दिन को निर्दिष्ट करते 0हैं k+1, जो बराबर है और महीने या वर्ष पर निर्भर नहीं करता है।

12:      % Push [1 2 ... 12] (months)
"        % For each month k
  G      %   Push input
  @Q     %   Push k+1
  h      %   Concatenate
  O6(    %   Postpend four zeros. For example, for input 2016 and month k=1 
         %   (first iteration) this gives [2016 2 0 0 0 0] (year, month, day,
         %   hour, min, sec). The 0-th day of month k+1 is the same as the
         %   last day of month k.
  YO     %   Convert the above 6-element date vector to date number
  9XO    %   Convert date number to date string with output format 9, which 
         %   is weekday as a capital letter
  77=    %   Is it an 'M'?
  ?      %   If so
    @    %     Push current month (will be implicitly displayed)

3

बैश + जीएनयू उपयोगिताओं, 56 बाइट्स

seq -f1month-1day$1-%g-1 12|date -f- +%B%u|sed -n s/1//p

dateसंस्करण 8.25 की आवश्यकता दिखाई देती है । Ideone में 8.23 ​​संस्करण में कटौती नहीं हुई है।


3

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

क्योंकि - आप जानते हैं - एक्सेल!

A1 में इनपुट वर्ष लेता है। महीनों की हेक्साडेसिमल सूची लौटाता है; 1 = जनवरी, सी = दिसंबर। चूंकि प्रत्येक माह एक एकल अंक है, इसलिए किसी विभाजक की आवश्यकता नहीं है।

=IF(2=WEEKDAY(EOMONTH(DATE(A1,1,1),0)),1,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,2,1),0)),2,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,3,1),0)),3,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,4,1),0)),4,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,5,1),0)),5,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,6,1),0)),6,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,7,1),0)),7,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,8,1),0)),8,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,9,1),0)),9,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,10,1),0)),"A","")&IF(2=WEEKDAY(EOMONTH(DATE(A1,11,1),0)),"B","")&IF(2=WEEKDAY(EOMONTH(DATE(A1,12,1),0)),"C","")

उदाहरण: A1 में 2016 शामिल है। B1 में उपरोक्त सूत्र शामिल हैं, और 2Aफरवरी और अक्टूबर के रूप में प्रदर्शित होता है ।


3

PHP, 109 180 159 बाइट्स

for($z=$argv[1];$m++<12;)if(date(N,strtotime(sprintf("%04d-$m-",$z).cal_days_in_month(0,$m,$z)))<2)echo"$m,";
  • प्रदत्त वर्ष का आउटपुट, उनमें से सभी नहीं (... हमेशा प्रश्न पढ़ें)
  • ध्यान नहीं दिया गया नोटिस (धन्यवाद टाइटस)
  • इसे बदल whileदें forक्योंकि अब यह एक वर्ष है (फिर से, धन्यवाद टाइटस)

पुराना २

$z=0;while($z++<9999){$o=[];$m=0;while($m++<12)if(date("N",strtotime(sprintf("%04d-$m-","$z").cal_days_in_month(0,$m,$z)))<2)$o[]=$m;echo count($o)>0?"$z:".implode(",",$o)."
":"";}

डॉट से 10000 तक के सभी वर्षों का समर्थन करता है, एक अपरिभाषित संस्करण चेतावनी से भी छुटकारा पा लिया है जो मुझे एक पीसी पर पता नहीं था। हां यह पुराने संस्करण की तुलना में लंबा है, लेकिन यह अधिक मजबूत है।

पुराना १

while($z++<9999){$o=[];$m=0;while($m++<12)if(date("N",strtotime("$z-$m-".cal_days_in_month(0,$m,$z)))<2)$o[]=$m;echo count($o)>0?"$z:".implode(",",$o)."
":"";}

यदि विंडोज या 32 बिट सिस्टम पर चल रहा है तो खूंखार 2038 बग होगा, लेकिन 64 बिट के लिनक्स सिस्टम पर यह ठीक है।

मैंने उपयोग करने का प्रयास किया date("t"...जो कि दिए गए महीने की अंतिम तारीख का प्रतिनिधित्व करने के लिए है, लेकिन परिणाम इस धागे में पहले बताए गए से मेल नहीं खाते।


2
-2: "$ z" को कोई उद्धरण -7 की आवश्यकता है: नोटिस पर ध्यान न दें (वे डिफ़ॉल्ट सेटिंग्स के साथ मुद्रित नहीं होते हैं: init नहीं $z, कोई उद्धरण नहीं N) -1: के forबजाय while -43 : वर्षों के माध्यम से पाशन के बजाय अनुरोध के अनुसार इनपुट लें -3: के joinबजाय implode-16: प्रत्यक्ष उत्पादन: for($z=$argv[1];$m++<12;)if(date(N,strtotime(sprintf("%04d-$m-",$z).cal_days_in_month(0,$m,$z)))<2)echo"$m,";+9 यदि आप कोई अनुगामी अल्पविराम रखने पर जोर देते हैं:echo$o=$o?",$m":$m;
टाइटस

अहह गलत सवाल! सोचा यह सभी वर्षों के लिए था .. उफ़: बी अन्य सुझावों के लिए भी धन्यवाद, उन पर मिलेगा
CT14.IT

3

PHP, 92 बाइट्स

for($d=new DateTime("$argv[1]-1-1");$i++<12;)$d->modify("1month")->format(w)!=2?:print"$i,";

एक वर्ष के पहले दिन के बाद 12 महीने 1 महीने की जाँच करें। यदि यह है तो महीने में आखिरी दिन से पहले का दिन एक सोमवार है।


आप प्रिंट के बजाय इको का उपयोग कर सकते हैं और
ऑक्टोपस

1
@ ऑक्टोपस टेरीनेरी संचालक के अंदर नहीं
जार्ज ह्यूल्समैन

3

सी, 214 बाइट्स

main(int a,char *b[]){for(int x,y,d,m=12;m;m--){y=atoi(b[1]);x=m-1;d=x==1?(y%4==0?(y%100==0?(y%400==0?29:28):29):28):(x==3||x==5||x==10?30:31);if((d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7==1)printf("%d\n",m);}}

संकलन

gcc -std=c99 -o foo foo.c

Ungolfed

प्रासंगिक गुरुओं को क्रेडिट के साथ।

माइकल कीथ और टॉम Craver के लिए सी कार्यक्रम सप्ताह दी गई तारीख के दिन लगता है

कोलिन Biedenkapp के लिए क्यू एंड ए: मैं कैसे यह पता लगाने की क्या महीने के अंतिम दिन है?

/* credit to Collin Biedenkapp */
short _get_max_day(short x, int z) {
    if(x == 0 || x == 2 || x == 4 || x == 6 || x == 7 || x == 9 || x == 11)
        return 31;
    else if(x == 3 || x == 5 || x == 8 || x == 10)
        return 30;
    else {
        if(z % 4 == 0) {
            if(z % 100 == 0) {
                if(z % 400 == 0)
                    return 29;
                return 28;
            }
            return 29;
        }
        return 28;
    }
}

main(int argc,char *argv[]) {
 for(int y,d,m=12;m;m--) {
  y=atoi(argv[1]);
  d=_get_max_day(m-1,y);
  /* credit to Michael Keith and Tom Craver */
  if ((d+=m<3?y--:y-2,23*m/9+d+4+y/4-y/100+y/400)%7 == 1)
    printf("%d\n",m);
 }
}

1
क्या होगा यदि आप ifअपनी elseवापसी के लिए अपनी दूसरी दिशा फ्लिप करते हैं 31, और इसलिए आप बड़ी ==श्रृंखला को समाप्त कर सकते हैं ?
AdmBorkBork

1
बेहतर होगा अगर (x == 1) {z part} बाकी अगर (x == 3 || x == 5 = 5 = == 8 || x == 10) रिटर्न 30 और रिटर्न 31
RosLuP

1
के बारे में क्या: वापसी x == 1? (z% 4 == 0? (z% 100 == 0? (z% = = 0; 29: 28): 29): 28) :( x == 3 | | x == 5 || x == 8 || x == 10; 30: 31)
RosLuP

TimmyD + RosLuP: रिटर्न के लिए धन्यवाद () अंक, अब बचाए गए 100 बाइट्स।
स्टीव

1
यह तब तक कम करना संभव है, जब तक आप इसे जारी रखें: u (y, m) {रिटर्न m-1? 30 + ((2773 >> m) & 1): 28+ (y% 4 == 0 && y% 100 || y%) 400 == 0);} जहां y का वर्ष है और माह है
RosLuP

3

सी, 119 बाइट्स

t=1248700335,m;main(y){for(scanf("%d",&y),t+=y&3||y%25<1&&y&15;m++,(6+y+y/4-y/100+y/400+t)%7||printf("%d,",m),t;t/=7);}

यह एक तालिका का उपयोग करता है जिसमें लीप वर्ष के लिए हर महीने के अंतिम दिन के कार्यदिवस की भरपाई होती है, जो आधार 7 का उपयोग करके हस्ताक्षरित 32-बिट शब्द में एन्कोडेड है। यदि यह एक लीप वर्ष नहीं है तो हम 1 जनवरी की ऑफसेट में जोड़ते हैं। (जैसा कि आप देख सकते हैं y&3||y%25<1&&y&15कि लीप दिनों के बिना वर्षों तक जांच करने के लिए उपयोग किया जाता है)। फिर हम बस हर महीने लूप करते हैं और जांचते हैं कि उसका आखिरी दिन सोमवार है या नहीं। वास्तव में काफी सरल, कोई बदसूरत हैक या चाल नहीं। यहाँ यह थोड़ा असंयमित है:

t=1248700335,m;
main(y){
  for(
    scanf("%d",&y),t+=y&3||y%25<1&&y&15;
    m++,(6+y+y/4-y/100+y/400+t)%7||printf("%d,",m),t;
    t/=7
  );
}

मैं इसे कुछ वर्णों को सहेजने के लिए एक फ़ंक्शन के रूप में फिर से लिखने के लिए फिर से बता सकता हूं। यह printfभी थोड़ा बहुत जगह लेता है ...


Printf ("% d,", m) 1, या 2, 3 के रूप में कुछ प्रिंट करेगा, इसलिए हमेशा एक है ',' और ... मैं केवल रिक्त स्थान का उपयोग करना पसंद करता हूं
RosLuP

वास्तव में, मैं वास्तव में आउटपुट में रिक्त स्थान पसंद करता हूं, लेकिन मैं आमतौर पर अपने गोल्फ सी समाधान लिखता हूं, ताकि उन्हें किसी भी व्हाट्सएप की आवश्यकता न हो, इसलिए मैं अपने आधे-गढ़े हुए संस्करण से सभी व्हाट्सएप को नॉक कर सकता हूं जब मैं अपने चरित्र की जांच करना चाहता हूं ।
फोर्स

3

PHP, 96 95 76 71 69 64 64 बाइट्स

नोट: साल के नंबर की तरह, 4 वर्ण के लिए गद्देदार किया जाना चाहिए 0070

for(;13+$i-=1;)date(N,mktime(0,0,0,1-$i,0,$argn))-1||print$i;

इस तरह से चलाएं:

echo 3385 | php -nR 'for(;13+$i-=1;)date(N,mktime(0,0,0,1-$i,0,$argn))-1||print$i;';echo
> -1-2-10

व्याख्या

-1 से -12 तक Iterates। Mktime, दिन 0(पिछले महीने के अंतिम दिन) और महीने का उपयोग करके तारीख बनाएँ 2..13। दिनांक को दिन की संख्या के रूप में प्रारूपित करें , और यदि परिणाम 1 है, तो वर्तमान संख्या प्रिंट करें। ऋणात्मक चिन्ह -का उपयोग सीमांकक के रूप में किया जाता है।

द मिलेनियम बग स्ट्राइक अगेन!

ध्यान दें कि इस संस्करण के साथ, श्रेणी 0..100की व्याख्या की गई है 1970..2069। यह सीमा के लिए कोई समस्या नहीं है 0..69, क्योंकि सप्ताह में एक पैटर्न होता है जो हर 400 साल (146097 दिन, बिल्कुल 20871 सप्ताह) को दोहराता है, लेकिन सीमा के लिए 70..99, 1900 को वर्ष संख्या में जोड़ा जाता है, जो कि 400 से अधिक नहीं है। वह समस्या जो 10k की श्रेणी में 30 वर्ष की संख्या के लिए है, सबसे सरल तरीका 2-अंकीय व्याख्या ( +4 बाइट्स ) को रोकने के लिए 400 को वर्ष संख्या में जोड़ना है :

for(;13+$i-=1;)date(N,mktime(0,0,0,1-$i,0,$argn+400))-1||print$i;

बदलाव

  • के साथ !~-$iतुलना करने के लिए उपयोग करके एक बाइट को बचाया ( द्विआधारी उपेक्षित है , तार्किक रूप से नकारात्मक है ; हर दूसरी संख्या है ), इसलिए कोष्ठक की जरूरत नहीं है$i1-10truefalse
  • last day ofYYYY-mदिनांक बनाने के लिए संकेतन का उपयोग करके 19 बाइट्स सहेजे गए
  • का उपयोग करके 5 बाइट्स सहेजा dateऔर strtotimeके बजायdate_create
  • ऋणात्मक संख्याओं से गिनकर 2 बाइट्स सहेजे गए, नकारात्मक संकेत का उपयोग आउटपुट सीमांकक के रूप में (ऋणात्मक माह संख्या मौजूद नहीं है) और YYYY-mतारीख के भाग में भी परिसीमन के रूप में
  • के mktimeबजाय का उपयोग करके 5 बाइट्स बचाता है strtotime। दिन का उपयोग करने के लिए वापस 0( mktimeयह भी 13 महीने का समर्थन करता है, इसलिए 0-13== 31-12)
  • उपलब्ध -Rकराने के लिए उपयोग करके 3 बाइट्स सहेजे गए$argn

mktimeवर्ष पैड करने के लिए आवश्यकता को हटाता है, यह नहीं है?
टाइटस

@ टिट्स, तेज। वैसे मुझे लगा कि mktimeयह प्रति-सहज है , क्योंकि तर्क INTएस के रूप में लिए गए हैं । इसका मतलब है कि आप इस वर्ष को पैड नहीं कर सकते ... इसलिए रेंज में सब कुछ के 0..100रूप में व्याख्या की गई है 1970..2070। यह सीमा के लिए कोई समस्या नहीं है 0..70क्योंकि 400 साल के लिए सप्ताह की एक सटीक संख्या होती है (इसलिए कैलेंडर हर 400 साल में पैटर्न को दोहराते हैं), लेकिन 70..991900 (400 का एक से अधिक नहीं!) जोड़ता है। इसलिए नई क्रिया। एक बग है।
पार

केवल समाधान जो मैं अभी देख रहा हूं वह है $argv[1]+400... जब तक कि जूलियन और ग्रेगोरियन कार्यदिवस अलग-अलग नहीं हैं।
टाइटस

@ टिट्स, हां। नियम कहते हैं कि ग्रेगोरियन कैल का उपयोग करें
सकल

3

एक्सेल, 428 97 96 बाइट्स

ए 1 में इनपुट। उत्पादन-अलग-अलग हेक्साडेसिमल मान (जनवरी = 0, दिसंबर = बी)

=IF(2=WEEKDAY(DATE(A1+2000,1,31)),0,"")&CHOOSE(WEEKDAY(DATE(A1+2000,3,0)),4,19,6,"3B",8,25,"7A")

1990 के पूर्व की तारीखों को संभालने के लिए 10 बाइट्स ("+2000") जोड़े गए।

@ इंजीनियर टोस्ट के लिए 11 बाइट्स का धन्यवाद ।


पहला प्रयास (428 बाइट्स), @ Adám के समाधान से भारी उधार ।

=IF(2=WEEKDAY(DATE(A1,1,31)),1,"")&IF(2=WEEKDAY(EOMONTH(DATE(A1,2,1),0)),2,"")&IF(2=WEEKDAY(DATE(A1,3,31)),3,"")&IF(2=WEEKDAY(DATE(A1,4,30)),4,"")&IF(2=WEEKDAY(DATE(A1,5,31)),5,"")&IF(2=WEEKDAY(DATE(A1,6,30)),6,"")&IF(2=WEEKDAY(DATE(A1,7,31)),7,"")&IF(2=WEEKDAY(DATE(A1,8,31)),8,"")&IF(2=WEEKDAY(DATE(A1,9,30)),9,"")&IF(2=WEEKDAY(DATE(A1,10,31)),"A","")&IF(2=WEEKDAY(DATE(A1,11,30)),"B","")&IF(2=WEEKDAY(DATE(A1,12,31)),"C","")

1900 से पहले के वर्षों में यह कैसे काम करता है? इस सूत्र के साथ परीक्षण का मामला 297 -> Mayवापस आ 6जाता है। यह 4 नहीं होना चाहिए? सिर्फ सितंबर के बदले 1776देता है । 7A8
इंजीनियर टोस्ट

यदि आप इसे काम करने के लिए प्राप्त करते हैं, हालांकि, आप संभवतः Date(A1,3,0)इसके बजाय का उपयोग कर सकते हैंEOMONTH(DATE(A1,2,1),0)
इंजीनियर टोस्ट

2

बैश + कैल, 58 बाइट्स

$ cat t.sh
for A in {1..12};do cal $A $1|grep -qx .....&&echo $A;done
$ bash t.sh 2016
2
10
$

+1 - बीएसडी के लिए काम करता है cal(जैसे OSX), लेकिन GNU पर अनुगामी रिक्त स्थान के लिए देखें cal
डिजिटल ट्रॉमा

2

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

from datetime import*
lambda y:[m for m in range(1,13)if date(y+(m>11),m%12+1,1).weekday()==1]

repl.it

एक अनाम फ़ंक्शन, एक पूर्णांक वर्ष लेता है, महीने की संख्या की सूची को आउटपुट करता है [1-12]

मैंने सफलता के बिना अंकगणित (110 बाइट्स) के साथ बाइट काउंट को हराने की कोशिश की। :

lambda y:map(lambda x,v:(23*((x+2)%13or 1)/9+y-2*(0<x<11)+(x>10)+v/4-v/100+v/400)%7==4,range(12),[y-1]+[y]*11)

एक अनाम फ़ंक्शन जो बूलियन मानों की एक सूची लौटाता है यदि यह दर्शाता है कि महीने [Jan-Dec] सोमवार को समाप्त होते हैं


2

जावा 7, 200 249 बाइट्स

import java.util.*;String c(int y){String r="";GregorianCalendar c=new GregorianCalendar();c.setGregorianChange(new Date(1L<<63));c.set(1,y);c.set(2,0);for(int i=0;i++<12;c.add(2,1)){c.set(5,c.getActualMaximum(5));if(c.get(7)==2)r+=i+" ";}return r;}

जावा में, GregorianCalendarएक ग्रेगोरियन और जूलियन कैलेंडर के बीच एक मिश्रण है। इस वजह से साल 1ने गलत परिणाम दिए। बदलने Calendar c=Calendar.getInstance();के लिए GregorianCalendar c=new GregorianCalendar();c.setGregorianChange(new Date(1L<<63));केवल ग्रेगोरियन कैलेंडर के उपयोग के लिए मजबूर द्वारा सुधारों को इस। इसको समझाने के लिए @JonSkeet on stackoverflow.com पर धन्यवाद ।

Ungolfed और परीक्षण कोड:

इसे यहाँ आज़माएँ।

import java.util.*;
class M{
  static String c(int year){
    String r = "";
    GregorianCalendar calendar = new GregorianCalendar();
    calendar.setGregorianChange(new Date(Long.MIN_VALUE));
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, 0);
    for(int i = 0; i++ < 12; calendar.add(Calendar.MONTH, 1)){
      calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
      if(calendar.get(Calendar.DAY_OF_WEEK) == 2){
        r += i+" ";
      }
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(1));
    System.out.println(c(297));
    System.out.println(c(1776));
    System.out.println(c(2000));
    System.out.println(c(2016));
    System.out.println(c(3385));
  }
}

आउटपुट:

4 12
5 
9 
1 7 
2 10 
1 2 10 

2

सी # 6 सी #, 171 167 135 बाइट्स

using System;
void d(int n){for(int i=0;++i<13;)if((int)new DateTime(n,i,DateTime.DaysInMonth(n,i)).DayOfWeek==1)Console.Write(i+" ");}

-32 बाइट्स शेबंग की बदौलत

संख्या के रूप में प्रिंट महीने; अंतरिक्ष सीमांकित के साथ; पीछे की जगह के साथ। अब यह उत्तर C # के पुराने संस्करणों के लिए भी काम करता है।


पुराना, 167 बाइट्स

using System;using System.Linq;
c(int n)=>string.Join(",",Enumerable.Range(1,12).Where(i=>new DateTime(n,i,DateTime.DaysInMonth(n,i)).DayOfWeek==(DayOfWeek)1));

-4 बाइट्स टिम्मीड के लिए धन्यवाद

आउटपुट महीने रिटर्न स्ट्रिंग, कॉमा सीमांकित संख्या हैं

Ungolfed

string c(int n)=>
    string.Join(",",                                        // Join them with commas
        Enumerable.Range(1,12)                              // For 1-12 inclusive
        .Where(                                             // Select only
            i=>new DateTime(n,i,DateTime.DaysInMonth(n,i)   // Get last day of that year-month
            ).DayOfWeek                                     // Get its day of week
            ==(DayOfWeek)1                              // Is Monday
        )
    )
;

@ टिमिमद हां लेकिन स्पष्ट कलाकारों की जरूरत है। उत्तर अपडेट किया गया
लिंक Ng

LINQ मज़ा है, लेकिन यह 126 बाइट्स: void q(int y){for(int m=1;m<13;m++){if((int)new DateTime(y,m,DateTime.DaysInMonth(y,m)).DayOfWeek==1){Console.WriteLine(m);}}};) इसके अलावा, यह कास्ट करने के लिए कम हो जाएगा DayOfWeekकरने के लिए intकी तुलना में यह कास्ट करने के लिए किया जाएगा intकरने के लिएDayOfWeek
Kade

@ साहेब धन्यवाद। मैं वास्तव में एक लाइन linq में गोल्फ नहीं होना चाहिए --- केवल जॉन स्कीट ही ऐसा कर सकते हैं। देखें कि मेरे पास कल अपडेट के लिए समय है या नहीं। अब थका।
लिंक Ng

आप इसे Action<int>कुछ बाइट्स को बचाने के लिए परिवर्तित कर सकते हैं
TheLethalCoder

2

रूबी, 54 + 6 = 60 बाइट्स

λ cat monday.rb
p (1..12).select{|m|Date.new($*[0].to_i,m,-1).monday?}
λ ruby -rdate monday.rb 2016
[2, 10]

-rdateमानक पुस्तकालय से दिनांक वर्ग प्राप्त करने के लिए कमांड लाइन पर 6 बाइट्स ।

स्पष्टीकरण: रूबी stdlib के महान Dateवर्ग के लिए बहुत सीधा धन्यवाद । इतना ही नहीं इसके जैसे तरीके भी हैं monday?, tuesday?आदि, निर्माता किसी भी क्षेत्र के लिए पिछले वर्ष नकारात्मक संख्या ले जाएगा, जिसका अर्थ है 'पिछले क्षेत्र द्वारा दर्शाए गए अवधि के अंत से इस क्षेत्र को पीछे की ओर गिनें'। $*के लिए आशुलिपि है ARGV, इसलिए $*[0]पहली कमांड लाइन तर्क प्राप्त करने का एक त्वरित तरीका है।


2

PHP, 84 बाइट्स

for($m=1;$m++<14;){if(strftime('%w',strtotime($argv[1]."-$m-1"))==2)echo($m-1)." ";}

मेरा पहला कोड गोल्फ। यह इस सवाल पर अब तक का सबसे छोटा PHP है।

संपादित करें: वर्ष 1 के लिए काम नहीं कर रहा है। मुझे यह पता लगाना होगा कि क्यों, लेकिन अभी मुझे जाना है।


1
मैं कहूँगा "PPCG में आपका स्वागत है!" लेकिन मेरे पास इससे अधिक समय के लिए आप पंजीकृत हैं! : डी नाइस पहला गोल्फ।
AdmBorkBork

आपकी त्रुटि यह है कि आप वर्ष 1 <13 के लिए 1-13-1 और 1-14-1 बनाते हैं। यदि आप इसे हल करते हैं तो आप क्षण भर में असमान कोष्ठक को हटा सकते हैं और टर्नरी ऑपरेटर का उपयोग करने के बारे में सोच सकते हैं
Jörg Hülsermann

यह आपकी समस्याओं को तय करना चाहिएfor(;$m++<12;)strftime("%w",strtotime($argv[1]+($m/12^0)."-".($m%12+1)."-1"))!=2?:print"$m ";
Jörg Hülsermann

2

आर, 106 99 95 83 78 78 74 बाइट्स

g=function(x)which(format(seq(as.Date(paste0(x,-2,-1)),,'m',12)-1,"%u")<2)

प्रत्येक माह के अंतिम दिनों का क्रम निम्नानुसार है seq(as.Date(paste0(x,-2,-1)),,'m',12)-1:

  • paste0अक्षरों के -2 और -1 का समन्वय करता है। तो xउदाहरण के लिए 2016 था, paste0(x,-2,-1)देता है "2016-2-1"जो फिर फरवरी वर्ष 2016 के 1 में बदल जाती है as.Date

  • seqएक POSIXct के लिए आवेदन किया है या एक तिथि वस्तु है seq(from, to , by, length.out): यहां toनहीं दिया जाता है, byके रूप में दिया जाता है 'm'जो करने के लिए मिलान किया जाता है 'month'आंशिक मेल करने के लिए धन्यवाद, और length.outपाठ्यक्रम 12 की है।

  • परिणामस्वरूप अनुक्रम प्रश्न में वर्ष के फरवरी से शुरू होने वाले 12 महीनों का पहला दिन है। -1प्रश्न में वर्ष के जनवरी से शुरू होने वाले 12 महीनों का अंतिम दिन हमें देता है।

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

> g(1)
[1]  4 12
> g(25)
[1] 3 6
> g(297)
[1] 5
> g(2000)
[1] 1 7
> g(2016)
[1]  2 10
> g(3385)
[1]  1  2 10
> g(9999)
[1] 5

95 बाइट्स पर पुराना संस्करण, केवल उनकी संख्या के बजाय महीने के नाम का आउटपुट:

g=function(x)format(S<-seq(as.Date(sprintf("%04i-02-01",x)),,'m',12)-1,"%B")[format(S,"%u")==1]

यह जवाब सिर्फ शानदार है। मेरे पास कोई विचार नहीं seqथा Date-objects के लिए एक विधि थी और यह मेरे हटाए गए उत्तर में as.Dateवर्षों से निपटने के मुद्दे को हल नहीं करता है 10000
बिलीवोब

@ बिलीवॉब हाँ seq.Dateऔर seq.POSIXtकाफी प्रभावशाली हैं: वे भी इस तरह के आदेशों को संसाधित कर सकते हैं seq(time1, time2, by="10 min")या seq(date1, date2, by="quarter")। समय-श्रृंखला की साजिश रचते समय बहुत उपयोगी।
प्लेनैपस

2

जाप, 24 बाइट्स

Do1 £Ov"Ð400+U"+X e ¥2©X

इसे ऑनलाइन टेस्ट करें! एकfalseमहीने में समाप्त नहीं होने वाले महीनों के स्थान पर, संख्याओं की एक सरणी को आउटपुट करता है।

दुभाषिया में एक बग था जो मुझे Ðफ़ंक्शन बॉडी में उपयोग करने की अनुमति नहीं देता था £। बग फिक्स और एक अन्य फीचर एडिशन के बाद, यह वर्तमान कमिट में 18 बाइट्स है:

Do1@Ð400+UX e ¥2©X

1

जावा, 143 129 बाइट्स

यह जावा 8 के नए समय एपीआई का उपयोग करता है।

y->{String s="";for(int m=0;++m<13;)if(java.time.YearMonth.of(y,m).atEndOfMonth().getDayOfWeek().ordinal()==0)s+=m+" ";return s;}

उत्पादन

ध्यान दें कि प्रत्येक पंक्ति में अंत में एक अतिरिक्त स्थान होता है।

4 12 
5 
9 
1 7 
2 10 
1 2 10 

अनगढ़ और परीक्षण

import java.time.*;
import java.util.function.*;

public class Main {
    public static void main (String[] args) {
        IntFunction<String> func = year -> {
          String result = "";
          for (int month=1; month <= 12; month++) {
            if (YearMonth.of(year, month).atEndOfMonth().getDayOfWeek().ordinal() == 0) {
              result += month + " ";
            }
          }
          return result;
        };
        System.out.println(func.apply(1));
        System.out.println(func.apply(297));
        System.out.println(func.apply(1776));
        System.out.println(func.apply(2000));
        System.out.println(func.apply(2016));
        System.out.println(func.apply(3385));
    }
}

शेव

  1. 143 से 129 बाइट्स: DayOfWeek::ordinalएनम कंटीन्यूअस के बजाय एक संख्यात्मक स्थिरांक के साथ तुलना करने के लिए उपयोग करें।
    धन्यवाद @TimmyD सामान्य विचार के लिए यदि सटीक समाधान नहीं है! ;-)

@TimmyD दुख की बात है, यह एक पहेली है। getValue()हालांकि, यह एक विधि है, जो कुछ बाइट्स को बचाएगा।
सेलोस

@Celos ordinal()की तुलना में 1 और बाइट बचाता है getValue(), भले ही इसका उपयोग कभी न करने का सुझाव दिया गया हो।
ओलिवियर ग्रेजायर 13

हाँ, अच्छी सोच। मैंने अपनी टिप्पणी पहली बार ताज़ा किए बिना पोस्ट की, इसलिए मैंने आपका उत्तर नहीं देखा और संपादित नहीं किया।
सेलोस

1

जीएनयू जाग, 80 बाइट्स

{for(;m<13;a=mktime($0" "++m" 1 9 0 0")){if(strftime("%w",a-8e4)~1){print m-1}}}

उदाहरण

$ gawk '{for(;m<13;a=mktime($0" "++m" 1 9 0 0")){if(strftime("%w",a-8e4)~1){print m-1}}}' <<<2016
2
10
$
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.