Planifiez vos dimanches!

16

Qui n'aime pas se détendre un dimanche matin en été avec une bière fraîche et la télévision ou en hiver jouer au badminton ou ultime avec des amis?

Je pense toujours que savoir combien de jours vous devez vous détendre au cours d'un mois vous tient bien informé et vous aide à planifier ce que vous voulez faire. Que ce soit assis devant votre ordinateur et résolvant un problème de code-golf ou sortant jouer au football.

Alors, aidez - moi écrire un programme ou une fonction qui prend en entrée 2 entiers positifs, Yet Met envoie le nombre de dimanches cette année -là ( Y) et mois ( M) (selon le calendrier grégorien), suivi de la date de chaque dimanche.

Gardez également à l'esprit que le code le plus court l'emporte.

Contraintes d'entrée

1000 <= Y <= 9999

1 <= M <= 12

Production

Ces cas de test auront une sortie qui aura les dates de chaque dimanche de ce mois de cette année dans le format DD-MM-YYYY.

Exemples de cas de test

Cas de test 1

Exemple d'entrée

2017 1

Exemple de sortie

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

Cas de test 2

Exemple d'entrée

2018 2

Exemple de sortie

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

Cas de test 3

Exemple d'entrée

2016 11

Exemple de sortie

4
06-11-2016
13-11-2016
20-11-2016
27-11-2016
Koishore Roy
la source
2
Je recommande d'autoriser tout format de date, y compris un Date()objet, et tout format de sortie, y compris [4, [<dateobj>, <dateobj>, <dateobj>, <dateobj>]](où se <dateobj>trouve un objet de date réel et []un tableau réel).
wizzwizz4
2
Lorsque le format de sortie est la partie déterminante d'un défi, le consensus de la communauté est qu'il est ennuyeux. À l'avenir, je recommande d'utiliser le Sandbox, mais comme personne n'a encore répondu, vous pourriez vous en sortir en le changeant.
wizzwizz4
1
Je ferai un montage. Vous pouvez le faire reculer si vous pensez qu'il endommage le défi.
wizzwizz4
1
Dans quelle mesure le format de sortie est-il flexible? Par exemple, peut-il avoir /au lieu de -? Ou peut-il s'agir d'un mois, puis d'un jour, puis d'une année?
Luis Mendo
1
Un lieu particulier? Notez qu'avant 1582, le calendrier julien était couramment utilisé, les pays passant au grégorien jusqu'en 1952 pour la Grèce. En Angleterre, ils ont dépassé le calendrier de 11 jours au mois de septembre 1752, entraînant des émeutes de masse. La recommandation est d'utiliser quelque chose appelé "Calendrier Grégorien Proleptique" qui prétend que le calendrier actuel était utilisé aussi loin que vous en avez besoin.

Réponses:

0

MATL , 46 45 42 35 octets

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

L'entrée est un tableau du formulaire [2017 1]. Le format de sortie est 29/01/2017.

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

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
la source
Est-ce que cela fonctionne avec des dates plus anciennes (comme l'année 1217)?
Titus
Woops n'a pas vu le TiO.
Titus
4

Python 2 , 150, 148, 145 octets

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)

Essayez-le en ligne!

-3 octets rendant les choses plus pythoniques (en utilisant zip et filtre!)

Keerthana Prabhakaran
la source
Ce sera 150 si vous amenez la déclaration d'impression à la ligne précédente et si vous ajoutez '02' dans le premier% d de la ligne 3.
Koishore Roy
'02' dans le premier% d! hein. manqué ça. Merci! de toute façon. sauvé deux octets cependant au lieu d'augmenter de deux!
Keerthana Prabhakaran
4

JavaScript (ES6), 107 octets

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>

Edit: L'ajout d'un compte explicite coûte 15 octets. Le formatage de la sortie coûterait au moins 33 octets supplémentaires selon la rigueur du format de sortie.

Neil
la source
> outputs the number of Sundays in that particular year and month; semble que cela ne génère pas actuellement le nombre de dimanches.
numbermaniac
Vous pourriez utiliser <input type='date'>.
Matthew Roh
@SIGSEGV Pas encore pris en charge dans Firefox, c'est ce que j'utilise.
Neil
2
@Neil Use Chrome m8
Matthew Roh
3
@SIGSEGV J'aime encore moins Chrome qu'Internet Explorer.
Neil
2

PowerShell , 91 octets

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

Essayez-le en ligne!

(Remarque spéciale - cela dépend des paramètres régionaux et de la culture. Étant donné que TIO fonctionne en tant queen-us , il fonctionne correctement tel quel. Ce code peut devoir être modifié pour différents paramètres régionaux.)

Prend l'entrée comme deux entiers $yet $m. Boucles de 1à 31, obtenant un nouvel datetimeobjet pour chaque date possible (via l' Get-Dateapplet de commande). Lance des erreurs dans STDERR (ignorées par défaut sur les défis de code-golf) pendant des mois avec moins de 31 jours, mais cela n'affecte pas la sortie. Nous prenons chacun de ces datetimeobjets et utilisons un Where-Object( |?{...}) sur eux, avec la clause de !$_.dayofweek. La propriété .dayofweekest un nombre de 0à 6, avec 0une correspondance appropriée à Sunday, donc !celle-ci est véridique, ce qui économise quelques octets par rapport à une vérification d'égalité comme -eq0.

Les dimanches sont ensuite rassemblés en parens et stockés dans $a. Nous prenons ensuite .countcelui - ci, qui est placé sur le pipeline. Ensuite, nous parcourons $aet utilisons l' -fopérateur ormat pour construire le format de sortie correct. Notez que cela ne génère pas de zéros non significatifs pendant des jours ou des mois. Ces chaînes de date sont également laissées sur le pipeline, et un implicite Write-Outputà la fin du programme les imprime avec des séparateurs de nouvelle ligne.


NB - si le format de sortie était plus flexible, nous pourrions simplement laisser $asur le pipeline et pas besoin de le parcourir. Cela stratifiera les datetimeobjets en tant que format de date longue, y compris les informations d'heure, mais nous ramènera à 69 octets , qui ne seraient (actuellement) battus que par Mathematica et MATL.

AdmBorkBork
la source
1

Octave, 72 octets

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

nweekdaterenvoie le numéro de date correspondant à la N-ème occurrence d'un jour de semaine particulier dans le mois / l'année spécifié. Nous utilisons le tableau 1:6à la place de Npour obtenir toutes les occurrences en un mois. S'il y a moins d' Noccurrences de ce jour de semaine dans un mois, le numéro de date résultant est 0. Pour cette raison, nous sélectionnons uniquement les dates valides à l'aide (x>1), puis les convertissons en chaînes à l'aide datestr.

Ensuite, pour compter le nombre de dimanches, nous comptons le nombre de nnzdates non nulles dans le résultat.

Nous enveloppons ensuite le tout cellfunpour afficher chaque valeur.

Suever
la source
0

Ruby, 140 132 129 118 octets

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
la source
0

Excel - 103 caractères

Mettez l'année dans la cellule A1et le mois dans la cellule A2.

Le décompte est en cellule D1et le dimanche en cellule D2:D6.

Suppose que le D2:D6format est JJ-MM-AAAA.

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

la source
0

Mathematica, 82 68 octets

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

Fonction anonyme. Affiche une liste du nombre de jours, suivie d'une liste des dimanches en tant que DateObjects. Il s'avère que dans Mathematica, le 0e jour d'un mois est interprété comme le dernier jour du mois précédent.

engourdi
la source
0

C #, 183 octets

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

Méthode anonyme qui renvoie un tableau de chaînes, contenant d'abord le nombre de dimanches puis chaque dimanche au format spécifié. S'il n'y a que 4 dimanches par mois, la dernière chaîne est nulle.

Programme complet avec méthode non golfée et cas de test:

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
la source
0

REXX, 168 octets

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
la source
Je suppose que cela ne fonctionne pas avec des années plus petites. As-tu essayé 1217?
Titus
0

Bash + bsdmainutils, 94 octets

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

Utilise la commande cal qui imprime un calendrier, est installée par défaut dans plusieurs UNIX / LINUX / BSD (malheureusement pas dans TIO).

Pour l'essayer, enregistrez-le sur file,chmod +x file et courir./file 2017 9

Enregistre dans un tableau les deux premiers octets de sortie cal ajoutés avec la chaîne "MM-YYYY" passée en tant que deuxième et premier paramètres (doit changer si votre locale ne démarre pas des semaines le dimanche).

Écho suivant la longueur du tableau soustrait par un (le premier élément est le mot représentant dimanche) et le tableau sans le premier élément, un par ligne fmt -1

marcosm
la source
Il gère le cas spécial 1752 9
marcosm
0

SAS, 182 octets

%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
la source
0

T-SQL, 316 311 octets

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

Je ne sais pas si c'est une réponse valable, car elle affiche le nombre de dimanches après les dates

Essayez-le ici

non golfé:

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
poisson noir
la source
0

PHP, 127118112107 octets

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

prend l'entrée des arguments de la ligne de commande; courir avec -rou tester en ligne .

panne

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
la source
0

Excel VBA, 190 octets

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

Exemple de sortie pour p (2000, 1) (je ne sais pas si cela est admissible)

02-01-2000 
09-01-2000 
16-01-2000 
23-01-2000 
30-01-2000 
 5 
Stupid_Intern
la source