Planen Sie Ihre Sonntage!

16

Wer mag es nicht, an einem Sonntagmorgen im Sommer mit einem gekühlten Bier und Fernsehen zu chillen oder im Winter Badminton zu spielen oder ultimativ mit Freunden zu chillen?

Ich denke immer, dass Sie gut informiert sind, wenn Sie wissen, wie viele Tage Sie in einem Monat chillen müssen, und Sie bei der Planung Ihrer Aktivitäten unterstützen. Sei es, wenn Sie vor Ihrem PC sitzen und ein Code-Golf-Problem lösen oder Fußball spielen.

Also, schreiben Sie mir helfen , ein Programm oder eine Funktion , die als Eingang 2 positive ganze Zahlen nimmt, Yund Mund gibt die Anzahl der Sonntage in dem betreffenden Jahr ( Y) und Monat ( M) (nach dem Gregorianischen Kalender), dem Zeitpunkt der jeden Sonntag gefolgt.

Denken Sie auch daran, dass der kürzeste Code gewinnt.

Eingabebeschränkungen

1000 <= Y <= 9999

1 <= M <= 12

Ausgabe

Bei diesen Testfällen werden die Daten jedes Sonntags des Monats in diesem Jahr im Format ausgegeben DD-MM-YYYY.

Beispiel-Testfälle

Testfall 1

Sample Input

2017 1

Beispielausgabe

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

Testfall 2

Sample Input

2018 2

Beispielausgabe

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

Testfall 3

Sample Input

2016 11

Beispielausgabe

4
06-11-2016
13-11-2016
20-11-2016
27-11-2016
Koishore Roy
quelle
2
Ich empfehle, jedes Datumsformat einschließlich eines Date()Objekts und jedes Ausgabeformat einschließlich [4, [<dateobj>, <dateobj>, <dateobj>, <dateobj>]](wobei <dateobj>es sich um ein tatsächliches Datumsobjekt und []ein tatsächliches Array handelt) zuzulassen .
wizzwizz4
2
Wenn das Ausgabeformat den bestimmenden Teil einer Herausforderung darstellt, ist die Meinung der Community, dass es langweilig ist. Zukünftig empfehle ich die Verwendung der Sandbox, aber da noch niemand geantwortet hat, könnte es passieren, dass Sie sie ändern.
wizzwizz4
1
Ich werde eine Bearbeitung vornehmen. Sie können es zurücksetzen, wenn Sie denken, dass es die Herausforderung beschädigt.
wizzwizz4
1
Wie flexibel ist das Ausgabeformat? Zum Beispiel kann es haben/ statt- ? Oder kann es ein Monat sein, dann ein Tag, dann ein Jahr?
Luis Mendo
1
Ein bestimmtes Gebietsschema? Beachten Sie, dass der julianische Kalender vor 1582 allgemein verwendet wurde und die Länder erst 1952 für Griechenland auf Gregorianisch übergingen. In England sprangen sie im September 1752 elf Tage vor, was zu Massenaufständen führte. Es wird empfohlen, einen so genannten "proleptischen Gregorianischen Kalender" zu verwenden, der vorgibt, dass der aktuelle Kalender so lange verwendet wurde, wie Sie es benötigen.

Antworten:

0

MATL , 46 45 42 35 Bytes

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

Die Eingabe ist ein Array des Formulars [2017 1]. Ausgabeformat ist 29/01/2017.

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

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
Luis Mendo
quelle
Funktioniert dies mit älteren Daten (wie Jahr 1217)?
Titus
Woops hat das TiO nicht gesehen.
Titus
4

Python 2 , 150, 148, 145 Bytes

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)

Probieren Sie es online!

-3 Bytes, die das Zeug pythonischer machen (mit zip und filter!)

Keerthana Prabhakaran
quelle
Es ist 150, wenn Sie die print-Anweisung in die vorherige Zeile stellen und in Zeile 3 in das erste% d '02'
einfügen
'02' in den ersten% d! huh. habe das verpasst. Vielen Dank! Sowieso. zwei Bytes gespart, anstatt um zwei zu erhöhen!
Keerthana Prabhakaran
4

JavaScript (ES6), 107 Byte

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>

Bearbeiten: Das Hinzufügen einer expliziten Anzahl kostet 15 Byte. Das Formatieren der Ausgabe würde mindestens weitere 33 Byte kosten, je nachdem, wie streng das Ausgabeformat ist.

Neil
quelle
> outputs the number of Sundays in that particular year and month; Es sieht so aus, als würde derzeit nicht die Anzahl der Sonntage ausgegeben.
numbermaniac
Du könntest es gebrauchen <input type='date'>.
Matthew Roh
@SIGSEGV Wird in Firefox noch nicht unterstützt, was ich verwende.
Neil
2
@ Neil Use Chrome m8
Matthew Roh
3
@SIGSEGV Ich mag Chrome noch weniger als Internet Explorer.
Neil
2

PowerShell , 91 Byte

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

Probieren Sie es online!

(Besonderer Hinweis - Dies ist abhängig von der Ländereinstellung und den Kultureinstellungen. Da TIO als ausgeführt wirden-us es richtig dort arbeitet als Service - Leistung Dieser Code muss möglicherweise für verschiedene Gegenden geändert werden..)

Nimmt die Eingabe als zwei Ganzzahlen $yund $m. Schleifen von 1bis 31, wobei datetimefür jedes mögliche Datum ein neues Objekt Get-Dateabgerufen wird (über das Cmdlet). Wirft Fehler für Monate mit weniger als 31 Tagen an STDERR (bei Code-Golf-Herausforderungen standardmäßig ignoriert), was sich jedoch nicht auf die Ausgabe auswirkt. Wir nehmen jedes dieser datetimeObjekte und verwenden ein Where-Object( |?{...}) mit der Klausel von !$_.dayofweek. Die Eigenschaft .dayofweekist eine Zahl von 0bis 6, die 0zweckmäßigerweise entspricht Sunday, also der !Wahrheit entspricht, die im Vergleich zu einer Gleichheitsprüfung wie ein paar Bytes einspart -eq0.

Die Sonntage werden dann in Parens gesammelt und in aufbewahrt $a. Wir nehmen dann die .countdavon, und das ist in der Pipeline platziert. Als nächstes durchlaufen wir $aden -format-Operator und konstruieren das richtige Ausgabeformat. Beachten Sie, dass hierdurch keine führenden Nullen für Tage oder Monate ausgegeben werden. Diese Datumszeichenfolgen Write-Outputverbleiben ebenfalls in der Pipeline und werden bei Programmabschluss implizit mit Zeilenumbrüchen gedruckt.


Hinweis: Wenn das Ausgabeformat flexibler wäre, könnten wir einfach $ain der Pipeline bleiben und müssten keine Schleife durchlaufen. Dadurch werden die datetimeObjekte als langes Datumsformat mit Zeitinformationen definiert, aber es werden nur 69 Byte angezeigt, die (derzeit) nur von Mathematica und MATL übertroffen werden.

AdmBorkBork
quelle
1

Oktave, 72 Bytes

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

nweekdateGibt die Datumsnummer zurück, die dem N-ten Auftreten eines bestimmten Wochentags im angegebenen Monat / Jahr entspricht. Wir verwenden das Array 1:6anstelle von N, um alle Vorkommen in einem Monat zu erhalten. Wenn es weniger als NVorkommen dieses Wochentags in einem Monat gibt, lautet die resultierende Datumsnummer 0. Aus diesem Grund wählen wir nur die gültigen Daten mit aus (x>1)und konvertieren sie dann mit in Zeichenketten datestr.

Um die Anzahl der Sonntage zu zählen, zählen wir die Anzahl der Nicht-Nullen (nnz ) im Ergebnis.

Wir wickeln dann das Ganze ein cellfun, um jeden Wert anzuzeigen.

Suever
quelle
0

Ruby, 140 132 129 118 Bytes

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'}
emlai
quelle
0

Excel - 103 Zeichen

Geben Sie das Jahr in die Zelle A1und den Monat in die Zelle einA2 .

Die Zählung erfolgt in Zellen D1und sonntags in ZellenD2:D6 .

Angenommen, D2:D6es ist TT-MM-JJJJ formatiert.

   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,"")

quelle
0

Mathematica, 82-68 Bytes

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

Anonyme Funktion. Gibt eine Liste der Anzahl der Tage aus, gefolgt von einer Liste der Sonntage alsDateObject s. Es stellt sich heraus, dass in Mathematica der 0. Tag eines Monats als letzter Tag des Vormonats interpretiert wird.

numbermaniac
quelle
0

C #, 183 Bytes

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;};

Anonyme Methode, die ein String-Array zurückgibt, das zuerst die Anzahl der Sonntage und dann jeden Sonntag im angegebenen Format enthält. Wenn es nur 4 Sonntage im Monat gibt, ist die letzte Zeichenfolge null.

Volles Programm mit ungolfed Methode und Testfällen:

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);
    }
}
adrianmp
quelle
0

REXX, 168 Bytes

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
idrougge
quelle
Ich denke, dass dies mit kleineren Jahren nicht funktioniert. Hast du es versucht 1217?
Titus
0

Bash + bsdmainutils, 94 Bytes

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

Verwendet den Befehl cal der einen Kalender druckt, wird standardmäßig in mehreren UNIX / LINUX / BSD (leider nicht in TIO) installiert.

Um es zu versuchen, speichern Sie es fileunter chmod +x file, und führen Sie es aus./file 2017 9

Speichert die ersten zwei Bytes der Cal-Ausgabe, die mit der Zeichenfolge "MM-YYYY" als zweitem und erstem Parameter angehängt werden (muss geändert werden, wenn Ihr Gebietsschema nicht wochenweise an Sonntagen beginnt).

Als nächstes wird die Array-Länge um eins (das erste Element ist das Wort, das den Sonntag darstellt) und das Array ohne das erste Element um eins pro Zeile reduziert fmt -1

marcosm
quelle
Es behandelt Sonderfall 1752 9
marcosm
0

SAS, 182 Bytes

%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;
J_Lard
quelle
0

T-SQL, 316 311 Bytes

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

Ich weiß jedoch nicht, ob es sich um eine gültige Antwort handelt, da die Anzahl der Sonntage nach den Daten ausgegeben wird

Probieren Sie es hier aus

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
grabthefish
quelle
0

PHP, 127 118 112 107 Bytes

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

Nimmt Eingaben von Befehlszeilenargumenten entgegen. starte mit -roder teste es online .

Nervenzusammenbruch

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
Titus
quelle
0

Excel VBA, 190 Byte

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

Beispielausgabe für p (2000, 1) (nicht sicher, ob dies geeignet ist)

02-01-2000 
09-01-2000 
16-01-2000 
23-01-2000 
30-01-2000 
 5 
Rohan
quelle