特定の年の各月の最後の日曜日を見つける


21

140文字内で既知のF#ソリューション。これはRosetta Codeの問題です。

入力年のstdoutまたは文字列変数に必要な結果2014

2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28

要求されたように、1900の場合:

1900-01-28 1900-02-25 1900-03-25 1900-04-29 1900-05-27 1900-06-24 1900-07-29 1900-08-26 1900-09-30 1900-10-28 1900-11-25 1900-12-30

そして2000:

2000-01-30 2000-02-27 2000-03-26 2000-04-30 2000-05-28 2000-06-25 2000-07-30 2000-08-27 2000-09-24 2000-10-29 2000-11-26 2000-12-31

日付はほとんどの言語で不器用さをもたらすように見えるので構いません。日付ライブラリを許可する以上に、それらを参照してください!ただし、ベース言語の外部の場合は、投稿の名前で宣言します(C#+ Jon SkeetのNodaTimeなど)。

明確化:

  • 年の範囲1900〜3015
  • グレゴリオ暦
  • それ以外に問題がある場合は、英国/ロンドンにとって慣習的なものは何でも。
  • コマンドラインスイッチまたは標準入力を使用するプログラムは正常であり、標準出力に結果を生成します。
  • 年の値を取得して文字列を返す関数も問題ありません。

標準的な抜け穴は除外されました。APL、J、Kのソリューションを楽しみにして、いくつかの新しい日付ライブラリをご覧ください。


@ Sp3000-1752は特に厄介な可能性があります:-)
squeamish ossifrage

@MartinBüttner:日付ライブラリを使用してください。言語で使用するものを宣言するように人々に依頼する質問を編集しました。
フィルH

1
有効な入力である年の範囲と、グレゴリオ暦の採用に関する考慮事項を指定する必要があります。(つまり、年の範囲に1930年以前が含まれている場合、ロケールに関係なくグレゴリオ暦を範囲全体に使用するように指定するか、出力がロケールによって異なる場合があることを指定するか、その前にカットオフ日付を指定する必要がありますユリウス暦を使用し、切り替え前後の3年間のテストケースを使用する必要があります)。
ピーターテイラー

1
@squeamishossifrage:私はむしろ...仕様を確立するための研究プロジェクトを避けたいので、私は、1900年とグレゴリオにそれを制限されてきました
フィル・H

1
@Adám:返信をとても長く待たせて申し訳ありません:)はい。
フィルH

回答:


1

Dyalog APLCAL からDFNS、19のバイト

絶対に遅れるよりはましだ!

年を要求し、日付のリストをyyyy md形式で返します。

⎕{⍺⍵,2↑⊢⌿cal⍺⍵}¨⍳12

数値入力のプロンプトを表示し、それを左引数にします

{... それぞれに適用される匿名関数(以下にあります)

⍳12 1から12までの数字(月)

上記の匿名関数は次のとおりです。

⍺⍵, 左右の引数(年と月)を先頭に追加します

2↑ の最初の2文字

⊢⌿ の一番下の行

cal のカレンダー

⍺⍵ 左引数と右引数(年と月)

TryAPLオンライン:

  1. インポートおよびその依存関係をクリックするには、ここをクリックしてこのページに戻りますcal

  2. テストケースを実行するには、ここをクリックしてください


とても良い。日付の意味を理解するAPLライブラリを希望していましたが、calは妥当です!
フィルH

@PhilHの日付日数
アダム16

1
@PhilH MiServer のDates名前空間もあります
アダム16

1
@PhilHおよびDyalog APLのダイアディックプリミティブ+ - < = および .Net日付オブジェクトの使用
アダム16

7

ルビー、91 + 6 = 97

#!ruby -prdate
$_=(Date.new(y=$_.to_i)...Date.new(y+1)).select(&:sunday?).chunk(&:mon).map{|k,v|v[-1]}*' '

かなりうまくいく。select(&:sunday?)驚くべきことに、*' 'すべての書式設定が単独で行われます。


ナイストリック!のchunk代わりにを使用して、さらに3つの文字を保存できますgroup_by
クリスチャンルパスク14

それでいいよ
histocrat

6

Bash 4.x + ncal、57

スペースの代わりに改行区切り記号が使用できる場合は-nechoステートメントからスイッチと末尾のスペースを削除できます。そして、私はそれがシバンなしでまだ機能すると思うので、私もそれを削除しました:

for i in {01..12};{ echo "$1-$i-`ncal $i $1|tail -c-3`";}

元のスクリプト(73バイト):

#!/bin/bash
for i in {01..12};{ echo -n "$1-$i-`ncal $i $1|tail -c-3` ";}

使用法:

$ bash sundays.sh 2014
2014-01-26
2014-02-23
2014-03-30
2014-04-27
2014-05-25
2014-06-29
2014-07-27
2014-08-31
2014-09-28
2014-10-26
2014-11-30
2014-12-28
$

注: 4.0より前のBashバージョンでは、月の先頭のゼロが省略されます。これは、に変更{01..12}することで5文字を追加することで修正できます`seq -w 1 12)`。また、tail -c-3の出力にncal末尾のスペースが含まれる一部のシステムで問題が発生する可能性がありますが、そのようなことは認識していません。


1
その違いは、Bashバージョンだけでなく、ダーウィンに本当に関係していますか?Bash 4.0で追加されました(ただし、後でいくつかのバグがありました)。とにかく、`…`良い習慣の代わりに使用することで、1キャラクターを節約でき$(…)ます。
マナトワーク14

ああ、そうかもしれない。ダーウィンは、バージョン3.2.53を使用していると言います。Debianは4.1.5を使用しています。
squeamish ossifrage 14

@manatwork PSバックティックに関するコメントに気付いたところです。良いキャッチ、ありがとう!
squeamish ossifrage 14

#!/bin/bashゴルフの目的のために数える必要はないと思います。
デジタル外傷14

@DigitalTraumaいいですね。スペースの代わりに改行も使用できるようです。
最小

6

IBM DFSORT、11 71、72又は80文字の3行

 OPTION COPY 
 OUTFIL REPEAT=12,OVERLAY=(5:SEQNUM,2,ZD,5,2,1,8,Y4T,LASTDAYM,TOJUL=Y4T*
 ,9,7,Y4T,ADDDAYS,+1,TOJUL=Y4T,1:16,7,Y4T,PREVDSUN,TOGREG=Y4T(-),12X) 

円柱状の出力形式による2つの答えは、時の試練に耐えてきました。OUTFIL REPEAT =で現在のレコードを何回もコピーするという点で、「ループ」があります。

値を取得するための別の手法。これは長く見えますが、翌年の12番目のレコードを無条件に処理することができないため短くなりIFTHEN=(WHEN=ます。スイングのゲイン(月の最初が最も簡単な方法)がラウンドアバウトで大きく失われます(特定の構文要件)。

これは組み込み関数(DFSORTのすべての関数が組み込み)を使用して、月の最終日を見つけます。次に、1日(関数)を追加して翌月の最初に到達し、PREVDSUN関数を使用して前の日曜日(常に前月の最後の日曜日になります)を取得します。

年(入力)を有効な日付に変換する場合、2桁のシーケンス番号が月に使用され、その値は日にもコピーされます。最初の月の最後の日の後:5,2はより小さいC'01'

詳細は次のとおりです。

OPTION COPY-入力ファイルを出力にコピー

OUTFIL-異なる選択と書式設定で複数の出力ファイルを許可して、書式設定されたレポートを作成します。の使用のINRECため、より短いものに優先して使用されますREPEAT=

REPEAT = 12-各レコードのコピーを12個作成します。この例では、SEQNUMがあるため、入力レコードは1つだけです(以前のバージョンとは異なります)。

5:-レコードの列5から開始します。

SEQNUM、2、ZD-シーケンス番号。デフォルトは1桁、2桁、「ゾーン10進数」から始まります(符号なしの場合、文字と同じです)。

1,8-長さ8のバイト1を現在の場所(9)にコピーします。これは、Y4Tが8を確認する必要があるためです。それ以外の場合は、異なる日付形式が使用されます。

Y4T-ccyymmdd形式の日付(その直前の8のため)。

LASTDAYM-月の最終日(週、四半期、および年の可能性もあります)。

TOJUL =-日付関数の出力日付変換(TOJULはTOGREGより1文字少ない)

9,7-長さが7になったため、Y4TはCCYYDDDになります。

ADDDAYS-次の月/年になると自動的に調整される日数を追加します(ADDMONSおよびADDYEARSでも可)

PREVDSUN-ユリウス日が入り、前の日曜日があり、TOGREGが正しい出力形式を取得し、「-」セパレーター(セパレーターとして好きなものを使用できます)

12X-混乱を一掃する空白

上記の2014年の出力は次のとおりです。

2014-01-26
2014-02-23
2014-03-30
2014-04-27
2014-05-25
2014-06-29
2014-07-27
2014-08-31
2014-09-28
2014-10-26
2014-11-23
2014-12-28

SORTに何をすべきかを伝えるために何かが必要です。デフォルトはありません。OPTION COPYは最短ですが、SORT FIELDS=COPY同等ですが、より長くなります。

今回はOUTFIL(REPEATの使用を許可するために)行った作業自体。作業コードは、おそらく160(2 * 80)、144(2 * 72)、140(72 + 69)、または138(70 + 68)のいずれかです(先行ブランク、強制継続、および後続ブランクを除く)。

受信者が何をしているのかを知る必要があることを考えると、DFSORTコードは1900年以降の各月の最後の日曜日をリストするために言うことができると思います(0001年から実行されますが、まあ)最大9999(DFSORTは最大9999年をサポートしますが、12日目が翌年になるため、以前のソリューションは9999年には機能しません)をツイートできます。

特に適切な組み込み関数がある場合、なぜコードはそれほど長いのですか?

フィールド定義は短命です。フィールドは、すぐに使用できるように、データ内の特定の場所(レコード)としてのみ定義されます。別の言い方をすれば、フィールドはそのように定義されていませんが、使用ごとに定義されており、使用のみを目的としています。日付関数は、(多くの)日付のどの形式がソースに使用されているかを知る必要があり、出力は日付形式である必要があるため、指定する必要があります。

ユリウス日ができたので... TBC?


 OPTION COPY 
 INREC OVERLAY=(1,4,C'0201',1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8*
 ,94:C'1',89:1,4,ZD,ADD,+1,ZD,LENGTH=4,14:C'3',22:C'4',30:C'5',38:C'6',*
 46:C'7',54:C'8',62:C'9',69:C'10',77:C'11',85:C'12',127:X,89,8,Y4T,PREV*
 DSUN,TOGREG=Y4T(-),116:X,81,8,Y4T,PREVDSUN,TOGREG=Y4T(-),105:X,73,8,Y4*
 T,PREVDSUN,TOGREG=Y4T(-),94:X,65,8,Y4T,PREVDSUN,TOGREG=Y4T(-),83:X,57,*
 8,Y4T,PREVDSUN,TOGREG=Y4T(-),72:X,49,8,Y4T,PREVDSUN,TOGREG=Y4T(-),61:X*
 ,41,8,Y4T,PREVDSUN,TOGREG=Y4T(-),50:X,33,8,Y4T,PREVDSUN,TOGREG=Y4T(-),*
 39:X,25,8,Y4T,PREVDSUN,TOGREG=Y4T(-),28:X,17,8,Y4T,PREVDSUN,TOGREG=Y4T*
 (-),17:X,09,8,Y4T,PREVDSUN,TOGREG=Y4T(-),1:1,8,Y4T,PREVDSUN,TOGREG=Y4T*
 (-),11:X,18,120,6X) 

いくつか必要 JCL

//LASTSUNG EXEC PGM=SORT 
//SYSOUT   DD SYSOUT=* 
//SORTOUT  DD SYSOUT=* 
//SYSIN    DD * 

入力ファイル(JCLの別の行と3つのインストリームデータ):

//SORTIN DD *
2014 
1900 
2000 

生産物:

2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28
1900-01-28 1900-02-25 1900-03-25 1900-04-29 1900-05-27 1900-06-24 1900-07-29 1900-08-26 1900-09-30 1900-10-28 1900-11-25 1900-12-30
2000-01-30 2000-02-27 2000-03-26 2000-04-30 2000-05-28 2000-06-25 2000-07-30 2000-08-27 2000-09-24 2000-10-29 2000-11-26 2000-12-31

実際には9999年まで動作します。

DFSORTは、IBMのメインフレームソーティング製品です。データは操作できますが、ソートが重要であり、ソートは大規模で長時間実行されることが多いため、DFSORTコントロールカードにはループ構造がなく、SORTをループに入れることはできません。ゴルフのようなタスクのために物事を少し長くします。

回答を投稿する理由は、DFSORTにPREVDday機能があるためです。したがって、月の最後の日曜日は簡単です。翌月の最初の日より前の日曜日(PREVDSUN)です。

1つの「オペランド」(OVERLAY)内でそれを行うことも楽しかったですsprintf

ここでは、無料です:

 OPTION COPY 

 INREC OVERLAY=(1,4,C'0201',1,8,1,8,1,8,1,8,1,8,1,8, 
         1,8,1,8,1,8,1,8, 
         1,8,94:C'1',89:1,4,ZD,ADD,+1,ZD,LENGTH=4, 
         14:C'3',22:C'4',30:C'5',38:C'6',46:C'7',54:C'8',
         62:C'9',69:C'10',77:C'11',85:C'12', 
        127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
        116:X,81,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
        105:X,73,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         94:X,65,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         83:X,57,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         72:X,49,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         61:X,41,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         50:X,33,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         39:X,25,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         28:X,17,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         17:X,09,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
          1:1,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         11:X,18,120,6X) 

完全に乱用するわけではありませんが、これらすべてを1つのOVERLAYに詰め込むことは普通ではありません。ゴルフの余地はありますが、せいぜい1行しか削除されないので、私は誘惑されません。

INRECはレコードごとに処理されます。

OVERLAYを使用すると、既存のレコードのコンテンツを変更できます。レコードがプロセス内でその長さを超えて拡張される場合、それは問題ではありません。

1,4は来た年です。0201のリテラルが追加され、その後連続する1,8が11回繰り返されて96バイトの1つの長いチャックが得られます。

拡張された現在のレコードの12年目には1が追加され、その月は1(1月)になります。

残りの10か月は3〜11に変更されます。

次に、これらのタイプの12が逆の順序(オーバーレイによる)にあります。

127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-),

n:はレコードの列番号です。Xは空白を挿入します。89,8はその列/長さからデータを取得し、Y4TはそれをCCYYMMDD日付として扱い、PREVDSUMは前の日曜日を計算し、TOGREG = Y4T(-)はグレゴリオ暦CCYY-MM-DD日付として出力します。

OVERLAYの特定の部分のソースとターゲットが破壊的にオーバーラップするとゴミが出るので、最終的には11:X,18,120,6X)少し混乱し、再配置されます。

マニュアルおよびペーパーは、http://www-01.ibm.com/support/docview.wss?uid = isg3T7000080にあり、900ページ以上のDFSORTアプリケーションプログラミングガイドが含まれています。

すべてのIBM製品と同様に、すべてのマニュアルは無料で入手できます(ただし、世界のごく少数の人しか理解できないふりをする、非常に高価なものを除きます)。

すべてのDFSORTコントロールカードは、空白で始まる必要があります。72桁目は、継続のためにのみ使用されます(非ブランクでもかまいませんが、*は従来のものです)。列72には、無視されるシーケンス番号領域が続き、各レコードを80バイトにします。

おそらくもう1つの解決策があります。


5

Bash、63バイト

for i in {01..12};{  date -v30d -v${i}m  -v2014y  -vsun +%Y-%m-%d;}

出力:

2014-01-26
2014-02-23
2014-03-30
2014-04-27
2014-05-25
2014-06-29
2014-07-27
2014-08-24
2014-09-28
2014-10-26 
2014-11-30
2014-12-28

for i in {1..12};{ date -v30d -v${i}m -v$1y -v0w +%Y-%m-%d;}-60バイト
デジタルトラウマ14

-vparam to dateは、BSD日付に固有です。そのため、これはOSXで動作しますが、ほとんどのLinuxでは動作しません。おそらく答えで述べられているはずです。
デジタル外傷14

@DigitalTraumaは、MacおよびLinux上で動作します。
michael501 14

4

Python 2-189バイト

y=input()
for m in range(12):
 d=[31-(1322>>m&1),28+(y%400<1or 1>y%4<y%100)][m==1];Y=y-(m<2);Z=Y%100;C=Y/100
 while(d+13*((m-2)%12+4)/5+Z+Z/4+C/4-2*C)%7-1:d-=1
 print"%d-%02d-%d"%(y,m+1,d),

STDINを使用して日付を入力します。

さらに多くのゴルフができます。このプログラムは、楽しみのためだけに少しオーバーボードしています。

  • インポートなし、特に組み込みの日付関数を使用しない
  • Zellerの合同を使用して曜日を計算します

ノート

  • 1322は、2月以外の月の日数が30日か31日かを判断するためのマジックルックアップテーブルです。
  • zfill入力範囲のために何年も必要ありません。また、常に20を超えるため、日数は不要

Python 2-106バイト

楽しくないソリューション:

from calendar import*
y=input();m=1
while m<13:w,n=monthrange(y,m);print"%d-%02d-%d"%(y,m,n-(n+w)%7),;m+=1

calendar.monthrangeは、月が始まる曜日(w)と月の日数()の2つの数値を返しますn。解決策は、キャッチのために少し直感に反します。返される平日は、日曜日ではなく月曜日の 0から始まります。ただし、これはn1ベースであるという事実によって相殺されます。


1
非常に愚かなPythの答え:$from calendar import monthrange as gt$V12AGH>QhN%"%d-%02d-%d"(QhN-H%+GH7
FryAmTheEggman 14

3

JavaScript(ES6)155 145

編集修正されたタイムゾーンの問題は、再帰的にされると短くなる可能性があります。多分。

F=y=>{
  for(n=i=o=[];!o[11];)
    d=new Date(Date.UTC(y,0,++i)),m=d.getMonth(),
    d.getDay()||(m!=n&&o.push(p.toISOString().slice(0,10)),p=d,n=m);
  return o.join(' ')
}

を使用できますnew Date(y,0,++i,9)。また、JSはこれらのうるう年に関する情報を持っていないため、2100以上のうるう年では失敗します。したがって、Feb 292100以上のうるう年ではまったくありません。
オプティマイザー14

@OptimizerそれはJSではありません:2100,2200,2300はうるう年ではありません。2014年はle年であり、JSは知っています。時間9を使用するためとして、私は確認することはできませんが、あなたがメルボルンでのインスタンスのためのものである場合、私はそれdoesn'toが仕事だと思う...
edc65

ああ.. 400年ごとに3日を落とすとは知らなかった。9について-タイムゾーンを-1000(ハワイ)から+1100(メルボルン)new Date(2014,0,26,9)に変更し、日曜日に正しいISO文字列とを与えgetDay()ました0
オプティマイザー14

3

JavaScript、ES6、222 219 199バイト

Rosetta wikiにはJavaScriptの回答がありませんでした。

さあ:

S=Y=>{for(l=[],p=new Date(Y,i=0);i<365+!(Y%4);)if(!(d=new Date(Y,0,++i,9)).getDay()){p.getMonth()-d.getMonth()&&l.push(p);p=new Date(d)}return[...l,p].map(x=>x.toISOString().split("T")[0]).join(" ")}

これによりS、目的の出力で文字列を返す関数が作成されます。この関数はうるう年も処理します。

ES6により、これは最新のFirefoxでのみ機能します。

それを200バイトに減らしたチップのapsillersに感謝します

ここで実行できるスタックスニペットとして、以下の非ゴルフバージョンを見つけます。

S=Y=>{
  for(l=[],p=new Date(Y,i=0);i<365+!(Y%4);)
    if(!(d=new Date(Y,0,++i,9)).getDay()){
      p.getMonth()-d.getMonth()&&l.push(p);
      p=new Date(d)
    }
  return[...l,p].map(x=>x.toISOString().split("T")[0]).join(" ")
}

alert(S(parseInt(prompt())))


parseIntの代わりに+ prompt()を使用して、いくつかのバイトを削ることができます
ジェイコブ14

@Jacobそのプロンプトはバイト数に追加されません。
オプティマイザー14

OIC。私は質問を読むべきだった...
ジェイコブ14

@apsillersありがとうございます!問題を修正し、ヒントに基づいて大幅に削減しました。
オプティマイザー14

入力2100出力2100-01-31 2100-02-28 2100-03-28 2100-04-25 2100-05-30 2100-06-27 2100-07-25 2100-08-29 2100-09-26 2100-10-31 2100-11-28 2100-12-26 2101-01-02が間違っています。
Qwertiy 14

3

Rebol-120116 80 79 76

d: do join"1-1-"input print collect[for m 2 13 1[d/2: m keep d - d/weekday]]


Ungolfed +いくつかの注釈:

d: do join "1-1-" input         ;; golfy way to create Rebol date! datatype 1-Jan-(year)

print collect [
    for m 2 13 1 [              ;; loop thru months 2 to 13!
        d/2: m                  ;; move to (1st of) next month
        keep d - d/weekday      ;; collect/keep last sunday of month
    ]
]

Rebolコンソールでの日曜日の計算の例:

>> ; get last sunday of Jan 2014

>> d: 1-1-2014
== 1-Jan-2014

>> d/month: d/month + 1
== 2

>> d
== 1-Feb-2014

>> d/weekday
== 6

>> d - d/weekday
== 26-Jan-2014

>> ; above is last sunday of Jan 2014
>> ; and when pass end of year (ie. month 13!)

>> d/month: 13
== 13

>> d
== 1-Jan-2015

ポテンシャル87:d:1-1-1 d / year:入力プリント収集を行う[m 12 [d / month:m + 1 keep d-d / weekday]]
rgchris

@rgchrisありがとう、クリス。さらに7文字を削ることができました。
-draegtun

いいね!それは悪いことですが、FORを近道と決して考えてはいけません。
rgchris

2

CJam、122 102バイト

30li:X400%){[1387Yb30f+~28I!I4%!I100%e&|g+\]W%{\_2$>7*-\7%7\m1$+}/}fI;]12/W=12,{101+s1>}%]z{X+W%'-*S}/

これは、日付ライブラリの形式を使用しません。まだまだたくさんゴルフができると思います。

ここでテストしてください。


3
私は、CJamの回答がコードゴルフチャレンジの1回のトップアンサーではないことを非常に喜んでいます。私は幸せに死ぬことができます..今日は良い日です(明らかに6バイトまでゴルフされるまで)
ブランドン14

@Brandon:それが面白いと思った理由の一種でした。これを簡単にする素晴らしいライブラリを見たいと思っていますが、今のところがっかりしています。
フィルH

1

R、128文字

P=paste;f=format;a=strptime(P(1:366,scan()),"%j %Y");cat(sort(sapply(split(a,f(a,"%B")),function(x)P(tail(x[f(x,"%u")==7],1)))))

改行あり:

P=paste
f=format
a=strptime(P(1:366,scan()),"%j %Y")
cat(sort(sapply(split(a,f(a,"%B")),function(x)P(tail(x[f(x,"%u")==7],1)))))

1

C#255

非ゴルフ

static void Main(string[] a)
    {
        int y = Int32.Parse(Console.ReadLine());
        DateTime d = new DateTime(y, 1, 1);
        while (d.Year == y)
        {
            if (d.DayOfWeek == DayOfWeek.Sunday && d.Day>(DateTime.DaysInMonth(y,d.Month)-7))
                Console.WriteLine(d.ToShortDateString());
            d = d.AddDays(1);
        }
        Console.ReadKey();
    }

編集:最後の日曜日のみを印刷するように変更:)


必要な出力形式ではありません。+これはコードゴルフです
-edc65

1

q、67

{({{1<>x mod 7}-[;1]/x}')14h$1_til[13]+13h$"D"$(($)x),".01.01"}

qでこれに使用できる日付ライブラリはありませんか?
フィルH

1

「ああ、いや、また彼!」

Java- 259 246バイト

void g(int y){for(int i=;i<12;i++){GregorianCalendar c=new GregorianCalendar(y,i,0);c.set(c.DAY_OF_WEEK,c.SUNDAY);c.set(c.DAY_OF_WEEK_IN_MONTH,-1);System.out.print(y+"-"+String.format("%02d",(c.get(c.MONTH)+1))+"-"+(c.get(c.DAY_OF_MONTH))+" ");}}

ゴルフされていないバージョン:

void g(int y){
    for (int i = 0; i < 12;i++) {
        GregorianCalendar c = new GregorianCalendar(y, i, 0);
        c.set(c.DAY_OF_WEEK, c.SUNDAY);
        c.set(c.DAY_OF_WEEK_IN_MONTH, -1);
        System.out.print(y+"-"+String.format("%02d",(c.get(c.MONTH)+1))+"-"+(c.get(c.DAY_OF_MONTH))+" ");
    }
}

使用法:

import java.util.GregorianCalendar;
import java.util.Scanner;

public class LastSundayInYear {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Year?");
        int year = scanner.nextInt();
        LastSundayInYear sunday = new LastSundayInYear();
        sunday.g(year); 
    }

    void g(int y){
        for (int i = -1; ++i < 12;) {
            GregorianCalendar c = new GregorianCalendar(y, i, 0);
            c.set(c.DAY_OF_WEEK, c.SUNDAY);
            c.set(c.DAY_OF_WEEK_IN_MONTH, -1);
            System.out.print(y+"-"+String.format("%02d",(c.get(c.MONTH)+1))+"-"+(c.get(c.DAY_OF_MONTH))+" ");
        }
    }
}

出力:

2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28

さらに別の「キックのためだけにJavaの返信をしましょう」という回答。しかたがない。しかし、少なくとも、あなたが私の答えのこの点に達するのを煩わせたので、私はあなたをもう少し退屈させて、私の推論を説明しようとします。

メソッドgは目的の年を受け取り、月ごとにGregorianCalendarオブジェクトを作成します(月は0〜11になります)。それから、最初c.setのものは曜日を日曜日に設定し、2番目のものは公式文書に見られるように、月の最後の週が欲しいと宣言しますSystem.out.printlnその日曜日の日付うちプリント(私たちはこの権利をしていた場合、年は次のように印刷されるc.get(c.YEAR)が、使用してy再び13文字オフ剃り)を、月は1〜9月から先行ゼロを追加するようにフォーマットする必要があります(とここでの月は0〜11で表されるため、値は増加します。最後の日曜日の日が出力されます。そして、この手順は他の11ヶ月間繰り返されます。


0

C#、212、237

string x(int y){var s="";var t="";var d=new DateTime(y,1,1);for(;;){if(d.Year!=y){return s;}t=(d.DayOfWeek==DayOfWeek.Sunday)?t=string.Format("{0}-{1}-{2} ",d.Year,d.Month,d.Day):t;s=(d.AddDays(1).Month!=d.Month)?s+=t:s;d=d.AddDays(1);}}

改行あり

string x(int y)
    {
        var s = "";
        var t = "";
        var d = new DateTime(y,1,1);
        for (;;)
        {
            if (d.Year != y) {
                return s;
            }
            t = (d.DayOfWeek == DayOfWeek.Sunday) ? t = string.Format("{0}-{1}-{2} ", d.Year, d.Month, d.Day) : t;
            s=(d.AddDays(1).Month!=d.Month)?s+=t:s;
            d=d.AddDays(1);
        }
    }

2014年の出力

"2015-1-25 2015-2-22 2015-3-29 2015-4-26 2015-5-31 2015-6-28 2015-7-26 2015-8-30 2015-9-27 2015-10-25 2015-11-29 2015-12-27"

必要な出力形式ではありません
-edc65

修正済み。いい?
ダレンブリーン

0

C#171

文字列を返す関数。

string S(int y){var r="";for(int m=1;m<13;++m){var d=new System.DateTime(y,1,1).AddMonths(m).AddDays(-1);r+=y+string.Format("-{0:00}-{1} ",m,d.Day-d.DayOfWeek);}return r;}

非ゴルフ

string S(int y)
{
    var r="";
    for (int m=1;m<13;++m)
    {
        var d = new System.DateTime(y, 1, 1).AddMonths(m).AddDays(-1);
        r += y + string.Format("-{0:00}-{1} ", m, d.Day - d.DayOfWeek);
    }
    return r;
}

0

C#194

Linqを使用:

string d(int y){return string.Join(" ",Enumerable.Range(1,12).Select(m=>new DateTime(y,m,DateTime.DaysInMonth(y,m))).Select(d=>d.AddDays(-(int)d.DayOfWeek)).Select(d=>d.ToString("yyy-MM-dd")));}

非ゴルフ

string d(int y)
{
    return string.Join(" ",Enumerable.Range(1,12)
        .Select(m => new DateTime(y, m, DateTime.DaysInMonth(y, m)))
        .Select(d => d.AddDays(-(int)d.DayOfWeek))
        .Select(d => d.ToString("yyy-MM-dd")));
}

出力

2013-01-27 2013-02-24 2013-03-31 2013-04-28 2013-05-26 2013-06-30 2013-07-28 2013-08-25 2013-09-29 2013-10-27 2013-11-24 2013-12-29

0

Mathematica-171

無名関数にラップされ、文字列を返します

StringJoin[Last@#~DateString~{"Year","-","Month","-","Day"," "}&/@GatherBy[Select[DateRange[DateObject[{#}],DateObject[{#+1}]],DayName@#==Sunday&],DateValue[#,"Month"]&]]&

最初の数学ゴルフ。大幅に削減できると思います。


0

VB-192

Function z(y)
For i = 1 To 11
a = 0
s = IIf(i <> 11, DateSerial(y, i + 1, 1), DateSerial(y + 1, 1, 1))
While Weekday(s - a) <> 1
a = a + 1
Wend
r = r + Str(s - a) + " "
Next
z = r
End Function

悪化する可能性があります^^

2番目と最後のエントリ(小さくすることはできないと思います)

142

Function z(y)
Dim m(12)
For i = 1 To 366
s = DateSerial(y, 1, 1) + i
If Weekday(s) = 1 Then m(Month(s)) = s
Next
z = Join(m, " ")
End Function

0

ルビー76

コマンドラインパラメータを使用しますruby sundays.rb 1900。日付ライブラリを使用します。

require'date';puts (1..12).map{|m|d=Date.new($*[0].to_i,m,-1);d-d.wday}*" "
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.