计划您的周日!


16

谁不喜欢在夏天的周日早晨在凉爽的啤酒和电视中放松身心,或者在冬天打羽毛球或与朋友们终极放松呢?

我一直认为,知道一个月内需要休息多少天,可以使您了解情况并帮助您计划要做什么。是坐在电脑前解决代码高尔夫球问题,还是出门踢足球。

因此,请帮我编写一个程序或函数,该程序或函数将2个正整数作为输入,YM输出该特定year(Y)和month(M)中的星期日数(根据公历),然后是每个星期日的日期。

另外,请记住,最短的代码会获胜。

输入约束

1000 <= Y <= 9999

1 <= M <= 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年9月的11天前提前了日历,导致了大规模骚乱。建议使用一种叫做“ Proleptic Gregorian Calendar”的东西,它会假装当前日历已在您需要的时候使用。

Answers:


0

MATL46 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年)?
泰特斯


哎呀没有看到TiO。
泰特斯(Titus)

4

Python 2中150148, 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个字节使内容更具pythonic(使用zip和filter!)


这将是150,如果你把打印语句到前行,如果你在第一个%d在第3行中添加“02”
Koishore罗伊

前%d个'02'!嗯 错过了。谢谢!无论如何。节省了两个字节,而不是增加了两个字节!
Keerthana Prabhakaran

4

JavaScript(ES6),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; 看起来这当前不输出星期日的数量。
numbermaniac

您可以使用<input type='date'>
马修·罗

@SIGSEGV我在Firefox中尚不支持。
尼尔,2017年

2
@Neil使用Chrome m8
马修·罗

3
@SIGSEGV我甚至比Internet Explorer更喜欢Chrome。
尼尔

2

PowerShell,91字节

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

在线尝试!

(特别说明-这取决于语言环境和区域性设置。由于TIO 运行为en-us,因此按原样正确运行。可能需要针对不同的语言环境更改此代码。)

将输入作为两个整数$y$m。从循环131,以获取datetime每个可能日期的新对象(通过Get-Datecmdlet)。将错误投递到STDERR(在代码高尔夫球挑战中默认情况下忽略)的时间少于31天,但这不会影响输出。我们将这些datetime对象中的每一个都使用,并在的子句上使用Where-Object|?{...}!$_.dayofweek。该属性.dayofweek是从0to到的一个数字60方便地与相对应Sunday,因此的!确实是正确的,与等式检查相比,它节省了几个字节-eq0

然后将周日收集到父母体内并储存到中$a。然后.count,我们将其放入管道中。接下来,我们遍历$a并使用-format运算符构造正确的输出格式。请注意,这几天或几个月都不会输出前导零。这些日期字符串也留在管道上,并且Write-Output在程序完成时使用隐式字符串将它们与换行符一起打印。


注意:如果输出格式更加灵活,我们可以直接$a使用管道,而无需循环通过它。它将把datetime对象字符串化为包括时间信息的长格式,但是使我们减少到69个字节,(目前)只能被Mathematica和MATL击败。


1

八度,72字节

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

nweekdate返回与N指定月/年中特定工作日的第-次出现相对应的日期数字。我们使用数组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

Excel – 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

Mathematica,82 68字节

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

匿名函数。输出天数列表,然后以DateObjects 表示星期日列表。事实证明,在Mathematica中,一个月的第0天被解释为上个月的最后一天。


0

C#,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个星期日,则最后一个字符串为null。

完整的程序,包含未使用的方法和测试用例:

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

Bash + 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中安装)。

尝试将它保存到filechmod +x file和运行./file 2017 9

将cal输出的前两个字节保存为数组,并附加作为第二个和第一个参数传递的字符串“ MM-YYYY”(如果您的语言环境在星期天不开始,则需要更改)。

下一个回显数组长度减去一个(第一个元素是代表星期天的单词),然后减去不包含第一个元素的数组,每行一个 fmt -1


它处理特殊情况1752 9
marcosm'4

0

SAS,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

T-SQL,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

我不知道这是否是有效的答案,因为它会输出日期之后的星期天数

在这里尝试

松开

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,127118112107字节

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

Excel 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

p(2000,1)的样本输出(不确定是否符合条件)

02-01-2000 
09-01-2000 
16-01-2000 
23-01-2000 
30-01-2000 
 5 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.