指定された年と月の週のn番目の日付を取得する


17

前書き

多くの場合、人々は日付を「2018年8月の第2金曜日」または「2012年3月の第4日曜日」と呼びます。しかし、それが何の日付であるかを伝えるのは難しいです!あなたの仕事は、年、月、曜日、整数を受け取るプログラムを作成し、その日付を出力することです。

チャレンジ

  • 入力については、年、月、曜日、および数字を取得します。

  • 曜日に文字列を使用したり、ゼロインデックス付きの平日を使用したり、年と月を1つの文字列にしたりするなど、妥当な形式で入力を取得できます。ただし、回答では入力形式を説明してください。

  • 月のどの曜日をターゲットにするかを示す整数は、1〜5の整数になります。整数は、存在しない曜日を指すことはありません(たとえば、存在しない2019年2月の5番目の金曜日)。

  • 年は常にプラスになります。

  • 出力は、最終日を印刷するなど、合理的な形式で作成できます。ただし、回答の出力形式を説明してください。

  • 出力での年と月の指定はオプションです。また、日付が有効であると想定することもできます。

入力と出力の例

次の入力を考えてください。形式は、年を4桁の数字、月を整数、曜日を文字列、序数を整数として取ります。

2019、3、2、土曜日、2
2019、12、日曜日、1
2019、9、土曜日、1

出力:

3月9日
12月1日
9月7日

これはなので、最短の回答が勝ちます。


1
私はGNUを使用できるかもしれないと思ったdateが、面白いことに、パーサーには... ここで興味深い解釈があります。
ドアノブ

週番号に0をインデックス付けできますか?
ジョーキング

もちろん、それがあなたのプログラムに合っていれば
無知の具体化

推奨テストケース:2018、12、日曜日1
アダム・

推奨されるテストケース:2019
シャギー

回答:


4

MediaWikiテンプレート、19バイト

{{#time:r|{{{1}}}}}

これは、このPHP回答の MediaWikiテンプレートParserFunctionsポートです

注:内部で#timePHPを使用しますstrtotime


サンプル入力

{{#time:r | 2019年3月の第2土曜日}}

サンプル出力

土、2019年3月9日00:00:00 +0000


3

Japt、19 15バイト

入力は、年、月の0から始まるインデックス、曜日の0から始まるインデックス(0日曜日)&nです。

_XµW¶Ze}f@ÐUVYÄ

それを試してみてください

                    :Implicit input of U=year, V=month, W=weekday & X=n
       }f           :Output the first element generated by the right function that returns
                    : falsey (0) when passed through the left function
         @          :Right function. Y=0-based index of current iteration
          ÐUVYÄ     :  new Date(U,V,Y+1)
_                   :Left function. Z=date being passed
 Xµ                 :  Decrement X by
   W¶               :   Test W for equality with
     Ze             :    Z.getDay()

2

C#(Visual C#Interactive Compiler)、59バイト

(y,m,d,w)=>1+(d-(int)new DateTime(y,m,1).DayOfWeek+7)%7+7*w

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

@EmbodimentOfIgnoranceに感謝-27バイト!

より少ないゴルフコード...

// y: year
// m: month
// d: day of week (0 is Sunday)
// w: week number (0 based)
(y,m,d,w)=>
  // start on the first day of the month
  1+
  // determine the number of days to
  // the first occurrence of the
  // requested weekday
  (d-(int)new DateTime(y,m,1).DayOfWeek+7)%7+
  // add the number of requested weeks
  7*w

戻り値は、要求された日付の月の日を表す整数です。


許可されている月の日のみを返す場合、これを59バイト
無知の具体化

再びヒントをありがとう-(今日は2倍です。)答えを更新します。
ダナ

2

SmileBASIC、58 51 48 46 45バイト

READ N,M$DTREAD M$OUT,,D,W?(5-W+D*2)MOD 7+N*7

入力の形式は次のとおりです。 week,year/month/weekday

  • week:週番号、0インデックス付き
  • year:年、4桁
  • month:月(1から0始まる)、2桁- 埋め込み
  • weekday:曜日(1-indexed、1 = Sunday)、2桁- 0パディング

出力は月の日であり、0がインデックス付けされています。
2019年3月の第2土曜日は1,2019/03/078(3月9日)

非ゴルフ

READ WEEK,M$
DTREAD M$ OUT ,,D,W
'Functions in SB can output multiple values using OUT.
'In this case, we don't need the first 2 values, so no variables are given.

PRINT (5-W+ D*2) MOD 7 +WEEK*7

説明

入力フォームは、年/月/曜日がに直接渡されるように特別に選択されました。DTREADこれは、YYYY/MM/DD文字列を解析し、年/月/日を数値として返し、曜日を計算する関数です。

ただし、DTREAD月の日付が予想される場合は、代わりに曜日を指定していることに注意してください。これは事態を複雑にしますが、入力値が少なくなり/01、日付文字列の最後に追加する必要がないことも意味します。

DTREAD出力WおよびD
W平日である、とDの曜日でW、月の日目。
(だから、あなたが入力した場合7、平日として、Dなります7と、W曜日、月の7日が何であれになります)

(5-W+D*2)MOD 7は、入力された曜日の最初のオカレンスを取得するために使用されます。これは、月の0から始まる日です。(私はこれを主に試行錯誤を通して見つけました)

その後、プログラムは単にを追加しますWEEK*7


「曜日」と「月の日」に別々の単語があったことを本当に願っています。


2

Perl 6の52の 48バイト

{1+($^c+4-Date.new($^a,$^b,1).daycount)%7+$^d*7}

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

年、月、曜日(日曜日は0)および週番号(0はインデックス付き)として入力を受け取る匿名コードブロック。出力は日付オブジェクトです。

古い説明:

{                                                  } # Anonymous code block
 (   Date.new(         ))   # Create a new date with
              $^a,$^b,1     # With year, month and the first day
  $_=                       # Save in the variable $_
                         +  # Add to this
                           $^c+4                     # The given day plus 4
                          (     -.daycount)          # The number of days since 17 Nov, 1858
                                           %7        # Modulo 7 to get the correct day
                                             +$^d*7  # Plus the 7 times the number of weeks

週番号は1インデックスである必要があると思います
12Me21

12Me21 @質問は、その入力が柔軟であると言いますが、私たちは0としてテイク週番号がインデックス化するかどうかを尋ねてきました
ジョー・キング

これは他の月には機能しないようです。あなたが必要だと思います$^c+4-$!.daycount
nwellnhof

@nwellnhofああ、私は試行錯誤の代わりにそれを考えるべきだった、笑。今修正する必要があります
ジョーキング

1

MATL28 27バイト

'1 'ihYO31:q+t8XOi=!A)i)1XO

これは3つの入力を使用します。

  • 月と年を含む文字列: 'March 2019'
  • 曜日を示す、最初が大文字の3文字の文字列: ' Sat'
  • 番号:2

出力は、ダッシュで区切られた日、年、月の文字列です09-Mar-2019

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

説明

入力を考えてみましょう'March 2019''Sat'2

'1 '    % Push this string
        % STACK: '1 '
ih      % Input string: month and year. Concatenate
        % STACK: '1 March 2019'
YO      % Convert to serial date number
        % STACK: 737485
31:q+   % Create vector [0 1 2 ... 30] and add element-wise
        % STACK: [737485 737486 737487 ... 737515]
t8XO    % Duplicate. Convert to date format 'ddd': day of week in three letters. Gives
        % a 2D char array
        % STACK: [737485 737486 737487 ... 737515], ['Fri'; 'Sat'; 'Sun'; ...; 'Sun']
i=      % Input string: day of week in three letters. Compare element-wise with broadcast
        % STACK: [737485 737486 737487 ... 737515],
        % [0 0 0; 0 0 0; ...; 1 1 1; 0 0 0; ... 1 1 1; ...]
!A      % True for rows containing only 1
        % STACK: [737485 737486 737487 ... 737515], [0 0 ... 1 ... 0 ... 1 ...]
)       % Index: uses the second vector as a mask into the first
        % STACK: [737486 737493 737500 737507 737514]
i)      % Input number. Index
        % STACK: 737493
1XO     % Convert to date format 'dd-mmm-yyyy'. Implicit display
        % STACK: '09-Mar-2019'

1

Pythonの392の 82バイト

@Jo Kingのおかげで82バイト

lambda y,m,d,w:z(y,m)[w-(z(y,m)[0][d]>0)][d]
from calendar import*
z=monthcalendar

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

オリジナルバージョン、92バイト

from calendar import*
def f(y,m,d,w):
 x=monthcalendar(y,m)
 if x[0][d]:w-=1
 return x[w][d]

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

年を整数、月を1のインデックス付き整数、曜日を0のインデックス整数(月曜日0と日曜日)6、月の週を1のインデックス整数とみなします。

使い方:

# import monthcalendar
from calendar import*
# function with 4 inputs
def f(y,m,d,w):
 # get a 2-D array representing the specified month
 # each week is represented by an array
 # and the value of each element is its date of the month
 # Monday is the 0th element of each week, Sunday is the 6th element
 # days of the first week of the month before the 1st are 0s 
 x=monthcalendar(y,m)
 # if the first week of the month includes the desired day of week
 # convert the week of month to 0-index so that it takes into account the first week
 if x[0][d]:w-=1
 # return the weekday of the week number specified
 return x[w][d]

1

R72 69バイト

function(y,m,d,n,D=as.Date(paste0(y,-m,-1))+0:31)D[weekdays(D)==d][n]

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

次のように入力する:

  • 年数
  • 月番号(1〜12)
  • 現在のロケールの曜日文字列(TIOには大文字の英語名が必要です)
  • 序数(1-indexed)

0

PHP4643、31のバイト

<?=date(d,strtotime($argv[1]));

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

プログラムは、次のような文字列を入力として受け取ります "second saturday of March 2019"

プログラムは日数を出力します。

シャギーのおかげで-12バイト。



また、私はあなたがof入力に必要とは思わない。
シャギー

@Shaggy、これらは詳細だと思います。多くのオプションがあります。
КириллМалышев



0

64 60バイト

func[y m d n][a: to-date[1 m y]d - a/10 - 7 % 7 +(n * 7)+ a]

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

年、月、曜日を1から始まる数字として、月曜日を週の最初の日とします。


ええ、to-dateものです。多分これはchristmase前夜形式の挑戦で有用であろう
ASCIIのみ


1
ええ、しかし、私は別の方法(つまり、<repeat " Eve"date2-date1 times>メソッドiirc)を考えていました
ASCIIのみ

>> 25-Dec-2019 - 1-1-2019 == 358
@ASCII

0

APL(Dyalog Unicode)、36 バイトSBCS

完全なプログラム。[year,month](1月が1)、次に日(日曜日が0)、n(最初が1)のプロンプトが表示されます。

date⎕⊃d/⍨⎕=7|d←(⍳31)+days⎕⊣⎕CY'dfns'

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

⎕CY'dfns'dfnsライブラリのc o p y

 その結果を捨てて…

[year,month]番号の プロンプトコンソール

days[c]  日 [n]その月の0番目の 1899-12-31以降

(⍳31)+ それにi整数1…31を追加します

d← ストア内d(のためのD AY番号)

7| 7で除算するときの除算の余り(エポックが良好なため日曜日が0の曜日)

⎕= コンソールに曜日番号を入力し、曜日番号に等しいマスクを取得します

d/⍨dそのマスクで フィルター

⎕⊃ nのコンソールをプロンプトし、それを使用して日番号のリストから選択します

date[c]  日時スタンプ [n](時間、分、秒、ミリ秒の末尾にゼロがあります)


コードの場合は[c]をクリックし、メモの場合は[n]をクリックします。


0

JavaScript(ES6)、49 48バイト

f=
(a,d,n)=>(d+6-new Date(...a,7).getDay())%7+n*7-6
<div oninput=o.textContent=f([+y.value,+m.value],+d.value,+n.value)>Year: <input id=y type=number value=2019><br>Month: <select id=m><option value=0>Jan<option value=1>Feb<option value=2>Mar<option value=3>Apr<option value=4>May<option value=5>Jun<option value=6>Jul<option value=7>Aug<option value=8>Sep<option value=9>Oct<option value=10>Nov<option value=11>Dec</select><br>Day: <select id=d><option value=0>Sun<option value=1>Mon<option value=2>Tue<option value=3>Wed<option value=4>Thu<option value=5>Fri<option value=6>Sat</select><br>Count: <input id=n type=number value=1 min=1 max=5><pre id=o>

パラメータを受け取りますf([year, month], day, number)。月曜日と曜日(日曜日から始まる)はゼロインデックスが付けられます。編集:@Shaggyのおかげで1バイト保存されました。


曜日は日曜日から土曜日、または月曜日から日曜日の形式ですか?
無知の具現化

@EmbodimentofIgnorance申し訳ありませんが、私は何かを忘れていたことを知っていました。(スニペットはselectを使用して簡単にしています。)
ニール

@EmbodimentofIgnorance、日曜日は0JSです。
シャギー

ああ。私はそれを知りませんでした、私はJavascriptにそれほど精通していません。
無知の具現化


0

TSQL、106バイト

DECLARE @ datetime='2019',@m int=3,@w char(2)='saturday',@p int=2

SELECT dateadd(wk,datediff(d,x,dateadd(m,@m-1,@)-1)/7,x)+@p*7FROM(SELECT
charindex(@w,' tuwethfrsasu')/2x)x

出力:

2019-03-09 00:00:00.000

やってみよう


0

Kotlin131 84バイト

ASCIIのみのコードとコメントのおかげで47バイト。

入力:年、月番号、週番号、週番号

単一行のすべての整数1から最大。週の日数は1の日曜日から7の土曜日です。メインプログラムにより、Dateクラスの年が1900年失われ、ラムダを呼び出す前に月と曜日が1ではなく0から始まるようにシフトされます。入力テキストボックスに引数を入力して、独自の日付を試すことができます。

出力:Dateクラスインスタンス。メインプログラムは次のような結果を表示します:Sat Mar 09 00:00:00 UTC 2019。

詳細については、コードを説明するコメント付きの拡張バージョンがあります。

{y,m,d,w->val r=java.util.Date(y,m,7*w)
r.setDate(r.getDate()-(r.getDay()+7-d)%7)
r}

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


1
74は -スカラ座とGroovyの回答と同様の方法を使用しています
ASCIIのみの


1
importコマンドはもう必要ないので問題ありません:P
ASCIIのみ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.