일요일을 계획하십시오!


16

누가 여름에 시원한 맥주와 TV를 타거나 겨울에 배드민턴을 치고 친구들과 놀기를 좋아하지 않습니까?

한 달에 몇 일 동안 식어야하는지 아는 것은 항상 충분한 정보를 유지하고 원하는 일을 계획하는 데 도움이된다고 생각합니다. PC 앞에 앉아서 코드 골프 문제를 해결하거나 축구를 즐기십시오.

그래서, 도움 나 입력이 양 개의 정수로 소요, 프로그램 또는 기능을 작성 Y하고 M, 그 특정 연도 (에 일요일의 수를 출력 Y)와 월 ( 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
출력 형식은 얼마나 유연합니까? 예를 들어 ? /대신 사용할 수 -있습니까? 아니면 월, 일, 연도 일 수 있습니까?
Luis Mendo

1
특정 로케일이 있습니까? 1582 년 이전에는 율리우스 력이 일반적으로 사용되었으며 그리스의 경우 1952 년 말에 그레고리력으로 국가가 전환되었다. 영국에서는 1752 년 9 월 11 일에 달력을 뛰어 넘어 대규모 폭동을 일으켰습니다. "Proleptic Gregorian Calendar"라고하는 것을 사용하는 것이 좋습니다.이 달력은 현재 달력을 사용하던만큼 가장 오래 사용했습니다.

답변:


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 년과 같은 더 오래된 날짜에서도 작동합니까?
Titus


Woops는 TiO를 보지 못했습니다.
Titus

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 바이트는 물건을 더 파이썬으로 만듭니다 (zip 및 필터 사용)


인쇄 문을 이전 행으로 가져오고 3 행의 첫 번째 % d에 '02'를 추가하면 150이됩니다.
Koishore Roy

첫 번째 % d에서 '02'! 응 그것을 놓쳤다. 감사! 어쨌든. 2 씩 늘리는 대신 2 바이트를 절약했습니다!
Keerthana Prabhakaran

4

자바 스크립트 (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'>.
Matthew Roh

@SIGSEGV Firefox에서 아직 지원되지 않습니다. 이것이 제가 사용하는 것입니다.
Neil

2
@Neil Chrome m8 사용
Matthew Roh

3
@SIGSEGV Internet Explorer보다 Chrome이 훨씬 적습니다.
Neil

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. 에서 1로 반복 하여 cmdlet을 통해 가능한 각 날짜에 대한 31datetime개체를 가져 옵니다 Get-Date. 31 일 미만의 개월 동안 STDERR에 오류를 던지지 만 (코드 골프 과제에서는 기본적으로 무시 됨) 출력에 영향을 미치지 않습니다. 우리는 각각의 datetime객체를 가져 와서 의 절과 함께 Where-Object( |?{...})를 사용합니다 !$_.dayofweek. 이 호텔 .dayofweek에서 숫자 06로, 0편리에 해당하는Sunday 하므로 그 !중 진실성이 있습니다. 이는 등호 검사와 비교하여 몇 바이트를 절약합니다 -eq0.

그런 다음 일요일은 괄호로 모여에 저장됩니다 $a. 그런 다음 .count파이프 라인에 배치합니다. 다음으로 ormat 연산자를 반복하여 $a사용 -f하여 올바른 출력 형식을 구성합니다. 이것은 며칠 또는 몇 달 동안 선행 0을 출력하지 않습니다. 해당 날짜 문자열도 파이프 라인에 내재되어 있으며 암시 적Write-Output 있으며 프로그램 완료시 으로 줄 바꿈 문자를 사용하여 인쇄합니다.


NB-출력 형식이 더 유연한 $a경우 파이프 라인을 그대로두고 루프를 반복 할 필요가 없습니다. datetime객체를 시간 정보를 포함하는 긴 형식으로 문자열 화 하지만 69 바이트 로 줄입니다. 현재 Mathematica와 MATL에 의해서만 이길 수 있습니다.


1

옥타브, 72 바이트

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

nweekdateN지정된 월 / 년의 특정 요일에 해당하는 날짜 번호를 반환합니다 . 한 달에 모든 발생 을 얻기 위해 1:6대신 배열 을 사용합니다 . 한 달에 해당 요일 보다 적은 수가 있으면 결과 날짜 수는 입니다. 이러한 이유로 다음을 사용하여 유효한 날짜 만 선택합니다.NN0(x>1) 선택한 다음을 사용하여 문자열로 변환합니다 datestr.

그런 다음 일요일 수를 계산하기 위해 0이 아닌 수를 계산합니다 (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:D6DD-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}&

익명의 기능. 일 수의 목록을 출력 한 다음 일요일 목록을 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입니다.

ungolfed 방법 및 테스트 사례가 포함 된 전체 프로그램 :

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?
Titus

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에는 없음).

에 저장 그것을 시도 file, chmod +x file및 실행./file 2017 9

두 번째 및 첫 번째 매개 변수로 전달 된 문자열 "MM-YYYY"가 추가 된 cal 출력의 처음 2 바이트를 배열에 저장합니다 (일주일에 로케일이 시작되지 않으면 변경해야 함).

다음은 1로 감산 된 배열 길이 (첫 번째 요소는 일요일을 나타내는 단어 임)와 첫 번째 요소가없는 배열을 한 줄에 하나씩 에코합니다. fmt -1


그것은 특별한 경우를 취급합니다 1752 9
marcosm

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 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.