日曜日を計画してください!


16

夏の日曜日の朝に冷えたビールとテレビで、または冬にバドミントンをしたり、友達と一緒に究極の寒さをしたい人はいませんか?

1か月で何日冷やさなければならないかを知ることで、十分な情報を得られ、やりたいことを計画するのに役立つといつも思っています。パソコンの前に座って、コードゴルフの問題を解決したり、サッカーに出かけたりします。

だから、助けを私は、入力として2つの正の整数を取るプログラムや関数を記述し、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
出力形式が課題の定義部分である場合、コミュニティのコンセンサスは、それが退屈だということです。将来的にはSandboxを使用することをお勧めしますが、まだ誰も答えていないので、それを変更しても大丈夫です。
wizzwizz4

1
編集します。チャレンジに損害を与えると思われる場合は、ロールバックできます。
wizzwizz4

1
それで、出力フォーマットはどれほど柔軟ですか?たとえば、/代わりに持つことができ-ますか?または、月、日、年の順になりますか?
ルイスメンドー

1
特定のロケール?1582年より前は、ユリウス暦が一般的に使用されていましたが、ギリシャでは1952年にグレゴリオ暦に移行しました。イギリスでは、1752年9月の11日間先にカレンダーをジャンプし、大規模な暴動を引き起こしました。推奨事項は、「Proleptic Gregorian Calendar」と呼ばれるものを使用することです。これは、現在のカレンダーが必要な限り使用されているように見せかけます。

回答:


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年など)で機能しますか?
タイタス


WoopsはTiOを認識しませんでした。
タイタス

4

Pythonの2150148、 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)

オンラインでお試しください!

ものをよりPythonicにする-3バイト(zipとフィルターを使用!)


あなたが前の行にprint文を持ち出す場合は150になるだろうと、あなたは、3行目の最初の%dの中で「02」を追加した場合
Koishoreロイ

最初の%dの '02'!ハァッ それを逃した。ありがとう!いずれかの方法。ただし、2ずつ増やす代わりに2バイト節約しました!
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ではまだサポートされていません。これは私が使用しているものです。
ニール

2
@Neil使用クローム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、そのまま正常に動作します。このコードはロケールごとに変更する必要があります。)

入力を2つの整数$yおよびとして受け取ります$m。から1にループし31datetime可能な日付ごとに新しいGet-Dateコマンドを取得します(コマンドレットを使用)。31日未満の月の間、STDERRにエラーを投げます(コードゴルフのチャレンジではデフォルトで無視されます)が、出力には影響しません。これらのdatetimeオブジェクトのそれぞれを取得し、の句とともにWhere-Object|?{...})を使用します!$_.dayofweek。プロパティ.dayofweek0to からまでの数字で、に対応するの60便利です。そのSundayため、!のようになり-eq0ます。

日曜日は括弧で集められて保管され$aます。次にそれを取得し、それを.countパイプラインに配置します。次に、ループ処理を$a行い、-format演算子を使用して正しい出力形式を構築します。これは、日または月の先行ゼロを出力しないことに注意してください。これらの日付文字列もパイプラインに残され、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指定した月/年の特定の曜日の-th番目の発生に対応する日付番号を返します。1:6代わりに配列を使用して、1か月のすべての出現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ます。

カウントはcell D1にあり、日曜日はcellにあります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です。

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

2番目と1番目のパラメーターとして渡された文字列「MM-YYYY」を付加したcal出力の最初の2バイトを配列に保存します(ロケールが日曜日に週を開始しない場合は変更する必要があります)。

次に、1で減算された配列の長さ(最初の要素は日曜日を表す単語)と、最初の要素のない配列を1行に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、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.