วางแผนวันอาทิตย์ของคุณ!


16

ใครไม่ชอบที่จะทำใจให้สบายในเช้าวันอาทิตย์ในฤดูร้อนด้วยเบียร์เย็น ๆ และทีวีหรือในฤดูหนาวที่เล่นแบดมินตันหรือสุดยอดกับเพื่อน ๆ

ฉันมักจะคิดว่าการรู้ว่าคุณต้องทำใจให้สบายกี่วันในหนึ่งเดือนจะแจ้งให้คุณทราบและช่วยคุณวางแผนสิ่งที่คุณต้องการ ไม่ว่าจะนั่งอยู่หน้าคอมพิวเตอร์ของคุณและแก้ปัญหาเรื่องโค้ดกอล์ฟหรือออกไปเล่นฟุตบอล

ดังนั้นช่วยฉันเขียนโปรแกรมหรือฟังก์ชั่นซึ่งจะเป็น input 2 จำนวนเต็มบวกYและMและผลจำนวนของวันอาทิตย์ในปีนั้นโดยเฉพาะอย่างยิ่ง ( Y) และเดือน ( M) (ตามปฏิทินเกรกอเรียน) ตามด้วยวันของแต่ละอาทิตย์

นอกจากนี้อย่าลืมว่ารหัสที่สั้นที่สุดชนะ

ข้อ จำกัด อินพุต

1,000 <= 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 สำหรับกรีซ ในอังกฤษพวกเขากระโดดปฏิทินล่วงหน้า 11 วันในเดือนกันยายน ค.ศ. 1752 นำไปสู่การจลาจลครั้งใหญ่ คำแนะนำคือการใช้สิ่งที่เรียกว่า "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) หรือไม่
ติตัส


Woops ไม่เห็น TiO
ติตัส

4

Python 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 ไบต์ทำให้ pythonic มากกว่านี้ใช้ซิปและฟิลเตอร์!


มันจะเป็น 150 ถ้าคุณนำคำสั่งการพิมพ์ไปยังบรรทัดก่อนหน้าและถ้าคุณเพิ่ม '02' ใน% d บรรทัดแรก 3
Koishore Roy

'02' ใน% d ครั้งแรก! ฮะ. คิดถึงว่า ขอบคุณ! อย่างไรก็ตาม. บันทึกสองไบต์ แต่แทนที่จะเพิ่มขึ้นสอง!
กีรนาปราการะรัน

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'>คุณสามารถใช้
Matthew Roh

@SIGSEGV ยังไม่รองรับ Firefox ซึ่งเป็นสิ่งที่ฉันใช้
Neil

2
@Neil ใช้ Chrome m8
Matthew Roh

3
@SIGSEGV ฉันชอบ Chrome แม้แต่น้อยกว่า Internet Explorer
Neil

2

PowerShell , 91 ไบต์

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

ลองออนไลน์!

(หมายเหตุพิเศษ - นี่คือการตั้งค่าสถานที่และวัฒนธรรมขึ้นอยู่กับ TIO เนื่องจาก TIO ทำงานเป็นen-usมันทำงานได้อย่างถูกต้องตามที่เป็นอยู่รหัสนี้อาจจำเป็นต้องเปลี่ยนรหัสสำหรับตำแหน่งที่ตั้งอื่น)

จะเข้าเป็นจำนวนเต็มและ$y $mวนจาก1ถึง31รับdatetimeวัตถุใหม่สำหรับแต่ละวันที่เป็นไปได้ (ผ่านGet-Datecmdlet) จะโยนข้อผิดพลาดไปยัง STDERR (ละเว้นโดยค่าเริ่มต้นในการแข่งขันกอล์ฟโคด) เป็นเวลาหลายเดือนด้วยเวลาน้อยกว่า 31 วัน แต่นั่นไม่ส่งผลกระทบต่อผลผลิต เราใช้แต่ละคนdatetimeวัตถุและใช้Where-Object( |?{...}) !$_.dayofweekที่พวกเขาเป็นไปตามข้อของ สถานที่ให้บริการ.dayofweekเป็นตัวเลขตั้งแต่0ไป6ด้วย0สิ่งอำนวยความสะดวกที่สอดคล้องกับSundayดังนั้น!ที่เป็น truthy -eq0ซึ่งจะช่วยประหยัดคู่ไบต์เมื่อเทียบกับการตรวจสอบความเท่าเทียมกันเช่น

วันอาทิตย์ที่จะรวมตัวกันแล้วใน parens $aและเก็บไว้ใน จากนั้นเราก็นำ.countมันมาและวางไว้บนท่อ ต่อไปเราวนซ้ำ$aและใช้ตัว-fดำเนินการ ormat เพื่อสร้างรูปแบบผลลัพธ์ที่ถูกต้อง โปรดทราบว่านี่จะไม่ส่งออกศูนย์นำหน้าสำหรับวันหรือเป็นเดือน สตริงวันที่เหล่านั้นจะถูกทิ้งไว้ที่ไพพ์ไลน์และนัย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)}))

nweekdateส่งคืนหมายเลขวันที่ที่สอดคล้องกับN-th ของวันทำงานเฉพาะในเดือน / ปีที่ระบุ เราใช้อาร์เรย์1:6แทนNการเกิดเหตุการณ์ทั้งหมดในหนึ่งเดือน หากมีน้อยกว่าการเกิดขึ้นของวันทำงานในเดือนที่แล้วจำนวนวันที่เกิดคือN 0ด้วยเหตุนี้เราเลือกเฉพาะวันที่ที่ถูกต้องใช้แล้วแปลงให้ใช้สาย(x>1)datestr

จากนั้นเพื่อนับจำนวนวันอาทิตย์เราจะนับจำนวนวันที่ที่ไม่ใช่ศูนย์ ( nnz) ในผลลัพธ์

จากนั้นเราหุ้มทุกอย่างไว้ในcellfunเพื่อแสดงแต่ละค่า


0

Ruby, 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 ตัวอักษร

ใส่ในเซลล์ปีและเดือนที่อยู่ในเซลล์A1A2

นับเป็นในเซลล์และวันอาทิตย์ในเซลล์D1D2: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 ในหนึ่งเดือนสตริงสุดท้ายจะเป็นโมฆะ

โปรแกรมเต็มรูปแบบด้วยวิธี 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ไหม
ติตัส

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" ที่ส่งผ่านเป็นพารามิเตอร์ตัวที่สองและตัวแรก

echoes ถัดไปความยาวอาร์เรย์ถูกแทนที่โดยหนึ่ง (องค์ประกอบแรกคือคำที่แสดงถึงวันอาทิตย์) และอาร์เรย์ที่ไม่มี elemet แรกหนึ่งอันต่อหนึ่งบรรทัด 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

ฉันไม่รู้ว่านี่เป็นคำตอบที่ถูกต้องหรือไม่เนื่องจากเป็นผลลัพธ์ของจำนวนวันอาทิตย์หลังจากวันที่

ลองที่นี่

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

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.