अपने रविवार की योजना बनाएं!


16

गर्मियों में रविवार की सुबह ठंडी बियर और टीवी या सर्दियों में बैडमिंटन खेलना या दोस्तों के साथ खेलना पसंद नहीं है?

मैं हमेशा यह सोचता हूं कि एक महीने में आपको कितने दिन चिल करना है, यह आपको अच्छी तरह से सूचित करता है और आपको जो करना है, उसकी योजना बनाने में मदद करता है। अपने पीसी के सामने बैठे रहें और एक कोड-गोल्फ समस्या को हल करें या फुटबॉल खेलने के लिए बाहर जाएं।

तो, मुझे एक प्रोग्राम या फ़ंक्शन लिखने में मदद करें जो इनपुट 2 पॉजिटिव पूर्णांक के रूप में लेता है, Yऔर Mउस रविवार ( Y) और महीने ( M) (ग्रेगोरियन कैलेंडर के अनुसार) में रविवार की संख्या को आउटपुट करता है , उसके बाद प्रत्येक रविवार की तारीख।

इसके अलावा, ध्यान रखें कि सबसे छोटा कोड जीतता है।

इनपुट की कमी

1000 <= वाई <= 9999

1 <= एम <= 12

उत्पादन

इन परीक्षण मामलों में आउटपुट होगा उस वर्ष के प्रत्येक रविवार की तारीखें उस वर्ष के प्रारूप में होंगी DD-MM-YYYY

नमूना परीक्षण मामले

टेस्ट केस 1

नमूना इनपुट

2017 1

नमूना आउटपुट

5
01-01-2017
08-01-2017
15-01-2017
22-01-2017
29-01-2017

टेस्ट केस 2

नमूना इनपुट

2018 2

नमूना आउटपुट

4
04-02-2018
11-02-2018
18-02-2018
25-02-2018

टेस्ट केस 3

नमूना इनपुट

2016 11

नमूना आउटपुट

4
06-11-2016
13-11-2016
20-11-2016
27-11-2016

2
मैं किसी भी तारीख के प्रारूप की अनुमति देता हूं, जिसमें एक Date()वस्तु और कोई आउटपुट स्वरूप शामिल है, जिसमें [4, [<dateobj>, <dateobj>, <dateobj>, <dateobj>]](जहां <dateobj>वास्तविक तिथि वस्तु है, और []एक वास्तविक सरणी है)।
wizzwizz4

2
जब आउटपुट स्वरूप एक चुनौती का निर्णायक हिस्सा होता है, तो सामुदायिक सहमति यह होती है कि यह उबाऊ है। भविष्य में मैं सैंडबॉक्स का उपयोग करने की सलाह देता हूं, लेकिन किसी के जवाब के रूप में अभी तक आप इसे बदलने से दूर हो सकते हैं।
wizzwizz4

1
मैं एक संपादन करूँगा। आप इसे वापस रोल कर सकते हैं यदि आपको लगता है कि यह चुनौती को नुकसान पहुंचाता है।
wizzwizz4

1
तो आउटपुट स्वरूप कितना लचीला है? उदाहरण के लिए, /इसके बजाय हो सकता है -? या यह महीने, फिर दिन, फिर साल हो सकता है?
लुइस मेंडो

1
कोई विशेष लोकेल? ध्यान दें कि 1582 से पहले, जूलियन कैलेंडर सामान्य उपयोग में था, ग्रीस के लिए 1952 तक देर से आने वाले देशों में। इंग्लैंड में उन्होंने सितंबर, 1752 के महीने में 11 दिन आगे कैलेंडर जम्प किया, जिससे बड़े पैमाने पर दंगे हुए। सिफारिश "प्रोलेप्टिक ग्रेगोरियन कैलेंडर" नामक कुछ का उपयोग करने के लिए है, जो वर्तमान कैलेंडर का दिखावा करता है कि आपकी ज़रूरत के अनुसार वापस आ गई थी।

जवाबों:


0

MATL , 46 45 42 35 बाइट्स

8BhtYOw47B~+YOq&:t8XO!s310=)tnw24XO

इनपुट फॉर्म की एक सरणी है [2017 1]। आउटपुट स्वरूप है 29/01/2017

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

व्याख्या

8B       % Push [1 0 0 0] (8 in binary)
h        % Implicit input. Concatenate. Gives something like [2017 1 1 0 0 0],
         % corresponding to the first day of input year and month
tYO      % Duplicate. Convert to serial date number
w        % Swap
47B~     % Push [0 1 0 0 0 0] (47 in binary, then negated)
+        % Add. Gives something like [2017 2 1 0 0 0]: first day of next month
YO       % Convert to serial number
q        % Subtract 1. This corresponds to last day of input month
&:       % Binary range. Gives an array with 28, 29, 30 or 31 days
t8XO     % Duplicate. Convert each number to three letters telling day of the week
!s       % Transpose, Sum of each column
310=     % True for values that equal 310, which is the sum of 'Sun' in ASCII
)        % Apply as a logical index
tnw      % Duplicate, number of elements, swap. This is the first part of output
24XO     % Convert to date format 'dd/mm/yyyy'. Gives 2D char array. Implicit display

क्या यह पुरानी तारीखों (जैसे साल 1217) के साथ काम करता है?
टाइटस


Woops ने TiO नहीं देखा।
टाइटस

4

पायथन 2 , 150,148, 145 बाइट्स

from calendar import*
y,m=map(int,input().split())
z=filter(None,zip(*monthcalendar(y,m))[6])
print len(z)
for i in z:print'%02d-%02d-%s'%(i,m,y)

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

-3 बाइट्स अधिक पाइथोनिक (ज़िप और फ़िल्टर का उपयोग करके) बनाते हैं!


यदि आप पिछली पंक्ति तक प्रिंट स्टेटमेंट लाते हैं तो यह 150 होगा और यदि आप पंक्ति 3 में पहले% d में '02' जोड़ते हैं तो
Koishore Roy

पहले% d में '02'! हुह। चूक गए। धन्यवाद! वैसे भी। दो बाइट्स बचाए, हालांकि दो से बढ़ने के बजाय!
कीर्तन प्रभाकरन १४'१rab को १२:१२

4

जावास्क्रिप्ट (ईएस 6), 107 बाइट्स

f=
(y,m,a=[...Array(32)].map((_,i)=>new Date(y,m-1,i)).filter(d=>d.getMonth()==m-1&!d.getDay()))=>[a.length,a]
<div oninput=o.textContent=[].concat(...f(y.value,m.value)).map((d,i)=&gt;i?d.toDateString():d).join`\n`><input id=y type=number min=1000 max=9999 value=2017><input id=m type=number min=1 max=12><pre id=o>

संपादित करें: एक स्पष्ट गणना लागत 15 बाइट्स जोड़ना। आउटपुट स्वरूपण कम से कम 33 बाइट्स पर निर्भर करेगा कि आउटपुट स्वरूप कितना सख्त है।


> outputs the number of Sundays in that particular year and month; ऐसा लगता है कि वर्तमान में यह रविवार की संख्या को आउटपुट नहीं करता है।
नंबरमानिश

आप उपयोग कर सकते हैं <input type='date'>
मैथ्यू रोह

@SIGSEGV फ़ायरफ़ॉक्स में अभी तक समर्थित नहीं है, जो कि मैं उपयोग करता हूं।
नील

2
@ नील का उपयोग क्रोम एम
मैथ्यू रो

3
@SIGSEGV मुझे Internet Explorer से भी कम क्रोम पसंद है।
नील

2

पावरशेल , 91 बाइट्स

param($y,$m)($a=(1..31|%{Date "$m/$_/$y"}|?{!$_.dayofweek})).count;$a|%{"{0:d-M-yyyy}"-f$_}

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

(विशेष ध्यान दें - यह लोकेल और कल्चर सेटिंग्स पर निर्भर है। चूंकि TIO जैसा चल रहा हैen-us , यह वहां के रूप में सही ढंग से काम करता है। विभिन्न स्थानों के लिए इस कोड को बदलना पड़ सकता है।)

इनपुट को दो पूर्णांकों के रूप में लेता है $yऔर $m। प्रत्येक संभावित तिथि ( cmdlet के माध्यम से ) के लिए एक नई वस्तु प्राप्त 1करने से लूप्स । 31 दिनों से भी कम समय के लिए STDERR (कोड-गोल्फ चुनौतियों पर डिफ़ॉल्ट रूप से अनदेखा) के लिए त्रुटियों को टॉस कर सकते हैं, लेकिन यह आउटपुट को प्रभावित नहीं करता है। हम उन वस्तुओं में से प्रत्येक लेते हैं और उन पर एक ( ) का उपयोग करते हैं, जिनके खंड के साथ । संपत्ति आसानी से संगत के साथ से , के लिए एक संख्या है , तो उस की सच्चाई है, जो की तरह एक समानता की तुलना में कुछ युगल बाइट बचाता है ।31datetimeGet-DatedatetimeWhere-Object|?{...}!$_.dayofweek.dayofweek060Sunday!-eq0

रविवार को फिर से पार्न्स में इकट्ठा किया जाता है और इसमें संग्रहित किया जाता है $a। हम इसके बाद लेते .countहैं, और इसे पाइपलाइन पर रखा जाता है। अगला, हम सही आउटपुट स्वरूप का निर्माण करने के $aलिए -format ऑपरेटर का उपयोग करते हैं। ध्यान दें कि यह दिनों या महीनों के लिए अग्रणी शून्य उत्पादन नहीं करता है। उन तारीखों के तार भी पाइपलाइन पर छोड़ दिए जाते हैं, और Write-Outputकार्यक्रम पूरा होने का एक संकेत उन्हें नईलाइन विभाजक के साथ प्रिंट करता है।


एनबी - यदि आउटपुट स्वरूप अधिक लचीला था, तो हम बस $aपाइपलाइन पर छोड़ सकते हैं और इसके माध्यम से लूप की आवश्यकता नहीं है। यह datetimeसमय की जानकारी सहित लंबी-तारीख के प्रारूप के रूप में वस्तुओं को कठोर करेगा , लेकिन हमें 69 बाइट्स तक ले जाता है , जो (वर्तमान में) केवल गणितज्ञ और MATL द्वारा पीटा जाएगा।


1

ऑक्टेव, 72 बाइट्स

@(y,m)cellfun(@disp,flip({datestr(x=nweekdate(1:6,1,y,m)(x>1)),nnz(x)}))

nweekdateNनिर्दिष्ट माह / वर्ष में किसी विशेष कार्यदिवस की -th घटना के अनुरूप तारीख संख्या लौटाता है । हम सरणी का उपयोग 1:6के स्थान पर Nप्राप्त करने के लिए सभी एक महीने में घटनाओं। यदि Nएक महीने में उस कार्यदिवस की घटनाएँ कम होती हैं , तो परिणामी तिथि संख्या होती है 0। इस कारण से, हम केवल मान्य तिथियों का उपयोग करके चयन करते हैं (x>1)और फिर उन्हें उपयोग करके तार में परिवर्तित कर देते हैं datestr

फिर रविवार की संख्या की गणना करने के लिए, हम nnzपरिणाम में गैर-शून्य ( ) तिथि संख्या की गणना करते हैं ।

फिर हम cellfunप्रत्येक मूल्य को प्रदर्शित करने के लिए पूरी चीज़ को लपेटते हैं ।


0

रूबी, 140 132 129 118 बाइट्स

require'date'
d=Date.parse gets.split*?-+'-1'
s=(d...d>>1).select &:sunday?
puts s.size,s.map{|d|d.strftime'%d-%m-%Y'}

0

एक्सेल - 103 अक्षर

वर्ष को सेल में रखें A1, और महीने को सेल में A2

गणना कोशिका में D1, और रविवार को कोशिकाओं में होती है D2:D6

मान लें D2:D6कि DD-MM-YYYY स्वरूपित हैं।

   A      B       C              D
1  [year] [month] =DATE(A1,B1,1) =COUNTIF(D2:D7,">0")
2                                =C1+7-WEEKDAY(C1,2)
3                                =D2+7
4                                =D3+7
5                                =D4+7
6                                =IF(MONTH(D5+7)=MONTH(C1),D5+7,"")

0

गणितज्ञ, 82 68 बाइट्स

d=DateObject;{Length[x=DayRange[d@{#,#2,1},d@{#,#2+1,0},Sunday]],x}&

अनाम फ़ंक्शन। दिनों की एक सूची को आउटपुट करता है, उसके बाद रविवार की सूची को DateObjectएस के रूप में देखता है । निकलता है, एक महीने के 0 वें दिन को गणितज्ञ में पिछले महीने के अंतिम दिन के रूप में व्याख्या किया जाता है।


0

सी #, 183 बाइट्स

y=>m=>{var s=new string[6];int i=1,n=0;for(DateTime d;i<=DateTime.DaysInMonth(y,m);)if((int)(d=new DateTime(y,m,i++)).DayOfWeek<1)s[++n]=d.ToString("dd-MM-yyyy");s[0]=n+"";return s;};

बेनामी विधि जो स्ट्रिंग की एक सरणी लौटाती है, जिसमें पहले रविवार और फिर प्रत्येक रविवार को निर्दिष्ट प्रारूप में नंबर होता है। यदि एक महीने में केवल 4 रविवार होते हैं, तो अंतिम स्ट्रिंग शून्य है।

पूर्ण कार्यक्रम असंसाधित विधि और परीक्षण मामलों के साथ:

using System;

class P
{
    static void Main()
    {
        Func<int, Func<int, string[]>> f =
        y=>m=>
        {
            var s=new string[6];
            int i=1,n=0;
            for(DateTime d;i<=DateTime.DaysInMonth(y,m);)
                if((int)(d=new DateTime(y,m,i++)).DayOfWeek<1)
                    s[++n]=d.ToString("dd-MM-yyyy");

            s[0]=n+"";
            return s;
        };

        // test cases:
        var result = f(2017)(1);
        foreach (var x in result)
            Console.WriteLine(x);

        result = f(2018)(2);
        foreach (var x in result)
            Console.WriteLine(x);

        result = f(2016)(11);
        foreach (var x in result)
            Console.WriteLine(x);
    }
}

0

REXX, 168 बाइट्स

arg y m
signal on syntax
do d=1 to 31
  m=right(m,2,0);d=right(d,2,0)
  if date(w,y||m||d,s)='Sunday' then queue d'-'m'-'y
  end
syntax:n=queued()
say n
do n
  pull a
  say a
  end

मुझे लगता है कि यह छोटे वर्षों के साथ काम नहीं करता है। क्या आपने कोशिश की है 1217?
टाइटस

0

बैश + bsdmainutils, 94 बाइट्स

a=(`for i in $(cal $2 $1|cut -b1-2);{ echo $i-$2-$1;}`);echo $[${#a[@]}-1];fmt -1 <<<${a[@]:1}

कमांड का उपयोग करता है calजो एक कैलेंडर प्रिंट करता है, डिफ़ॉल्ट रूप से कई UNIX / LINUX / BSD में स्थापित है (दुर्भाग्य से TIO में नहीं)।

यह करने के लिए बचाने की कोशिश करने के लिए file, chmod +x fileऔर रन./file 2017 9

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

अगली गूँज सरणी लंबाई एक द्वारा प्रतिस्थापित (पहला तत्व रविवार का प्रतिनिधित्व शब्द है) और पहली पंक्ति के बिना सरणी, एक पंक्ति fmt -1


यह विशेष मामले को 1752 9
मार्कोसम

0

एसएएस, 182 बाइट्स

%macro s(y,m);%let c=%eval(%sysfunc(intck(week,%sysfunc(nwkdom(1,1,&m,&y)),%sysfunc(nwkdom(5,1,&m,&y))))+1);%put&c;%do i=1%to&c;%put%sysfunc(nwkdom(&i,1,&m,&y),ddmmyy10.);%end;%mend;

0

टी-एसक्यूएल, 316 311 बाइट्स

DECLARE @ DATE=DATEADD(ww,-52*(2017-@y),'20170101')IF DATEPART(d,@)>7SET @=DATEADD(ww,-1,@);WITH c(d)AS(SELECT d FROM(SELECT DATEADD(ww,ROW_NUMBER()OVER(ORDER BY name)-1,@)d FROM sys.stats)a WHERE @y=DATEPART(yy,d)AND @m=DATEPART(m,d))SELECT CAST(COUNT(*)AS CHAR(1))FROM c UNION SELECT CAST(d AS CHAR(10))FROM c

मुझे नहीं पता कि यह एक वैध जवाब है, हालांकि यह तारीखों के बाद रविवार की संख्या को आउटपुट करता है

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

ungolfed:

DECLARE @m INT = 1,@y INT = 2017

DECLARE @ DATE=DATEADD(ww,-52*(2017-@y),'20170101')

IF DATEPART(d,@)>7
    SET @=DATEADD(ww,-1,@)

;WITH c(d)
AS
(SELECT d 
 FROM (SELECT DATEADD(ww,ROW_NUMBER()OVER(ORDER BY name)-1,@)d 
       FROM sys.stats) a 
 WHERE @y = DATEPART(yy,d)
   AND @m = DATEPART(m,d)
)

SELECT CAST(COUNT(*) AS CHAR(1))
FROM c 
UNION 
SELECT CAST(d AS CHAR(10))
FROM c

0

PHP, 127 118 112 107 बाइट्स

for([,$y,$m]=$argv;$d++<date(t,($t=strtotime)($y.-$m));)date(w,$t($s="
$d.$m.$y"))?:$r.=$s.!++$c;echo$c,$r;

कमांड लाइन तर्कों से इनपुट लेता है; इसे ऑनलाइन चलाएं -rया परीक्षण करें

टूट - फूट

for([,$y,$m]=$argv;                     # import arguments to $y and $m
    $d++<date(t,strtotime($y.-$m))      # loop while ($d < number of days in that month)
    ;)
    date(w,strtotime($s="\n$d.$m.$y"))?:    # if date(w) is falsy (0 == sunday)
        $r.=$s.!++$c;                       # then append date to $r and increment $c
echo$c,$r;                              # print result

0

एक्सेल VBA, 190 बाइट्स

Function p(y, m)
d = CDate("1/" & m & "/" & y)
e = DateAdd("m", 1, d)
Do While d < e
    If Weekday(d) = 1 Then Debug.Print d: i = i + 1
    d = d + 1
Loop
Debug.Print i
End Function

पी के लिए नमूना आउटपुट (2000, 1) (यह सुनिश्चित नहीं है कि क्या यह अर्हता प्राप्त करता है)

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