주어진 연도 및 월의 n 번째 요일을 가져옵니다.


17

소개

종종 사람들은 날짜를 "2018 년 8 월 둘째 금요일"또는 "2012 년 3 월 넷째 일요일"이라고합니다. 그러나 그 날짜가 무엇인지 말하기는 어렵습니다! 당신의 임무는 년, 월, 요일 및 정수를 수신하고 그 날짜를 출력하는 프로그램을 작성하는 것입니다.

도전

  • 입력을 위해 1 년, 1 개월, 요일 및 숫자를 얻게됩니다.

  • 요일에 문자열을 사용하거나 색인이없는 요일을 사용하는 등의 합리적인 형식으로 입력하거나 단일 문자열에 연도 및 월을 사용할 수도 있습니다. 그래도 답변에 입력 형식을 설명하십시오.

  • 타겟팅 할 월의 요일을 알려주는 정수는 1 ~ 5의 정수입니다. 정수는 존재하지 않는 요일 (예 : 2019 년 2 월 5 일 금요일, 존재하지 않음)을 나타내지 않습니다.

  • 년은 항상 긍정적입니다.

  • 최종 날짜 인쇄를 포함하여 합리적인 형식으로 출력 할 수 있습니다. 그러나 출력 형식을 답변으로 설명하십시오.

  • 출력에 연도 및 월을 제공하는 것은 선택 사항입니다. 또한 날짜가 유효하다고 가정 할 수 있습니다.

입력 및 출력 예

연도를 4 자리 숫자로, 월을 정수로, 요일을 문자열로, 서수를 정수로 취하는이 입력을 고려하십시오.

2019, 3, 토요일, 2
2019, 12, 일요일, 1
2019, 9 토요일, 1

산출:

3 월 9
일 12 월 1
일 9 월 7 일

이것은 이므로 가장 짧은 답변이 이깁니다.


1
나는 GNU를 사용할 수 있다고 생각 date했지만, 파서는 여기에 흥미로운 해석을 가지고 있습니다.
Doorknob

주 번호가 0으로 색인 될 수 있습니까?
Jo King

물론, 프로그램에 적합하다면
무지의 구현

권장 테스트 사례 : 2018, 12, 일요일 1
Adám

권장 테스트 사례 : 2019 년 9 월 첫 번째 토요일
Shaggy

답변:


4

미디어 위키 템플릿, 19 바이트

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

이것은 이 PHP 답변 의 MediaWiki 템플릿 ParserFunctions 포트입니다

참고 : 내부적으로 #timePHP를 사용 하십시오 strtotime.


샘플 입력

{{#time : r | 2019 년 3 월 2 일 토요일}}

샘플 출력

2019 년 3 월 09 일 00:00:00 +0000


3

apt, 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 # 대화식 컴파일러) , 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 배); 답변을 업데이트하겠습니다.
dana

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 색인), 2 자리 0 -padded
  • weekday: 요일 (1 색인, 1 = 일요일), 2 자리- 0패드

출력은 월의 일이며 0은 색인화됩니다.
2019 년 3 월 둘째 토요일은 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출력 WD.
W평일이고, D의 날 - 중 - 주입니다 W월의 일 일.
(그래서, 당신은 입력하면 7평일 같이 D될 것입니다 7W일 - 중 - 주 달의 7 일이 무엇이든 될 것입니다)

이 표현식 (5-W+D*2)MOD 7은 입력 요일의 첫 번째 항목을 0으로 색인 된 날짜로 가져 오는 데 사용됩니다. (나는 주로 시행 착오를 통해 이것을 알아 냈습니다)

그 후 프로그램은을 추가합니다 WEEK*7.


"요일"과 "달"에 대해 별도의 단어가 있었으면 좋겠습니다.


2

펄 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으로 주 번호를 인덱싱했는지 물었습니다
Jo King

다른 달에는 작동하지 않는 것 같습니다. 당신이 필요하다고 생각합니다 $^c+4-$!.daycount.
nwellnhof

@nwellnhof 아, 나는 시행 착오 대신에 그것을 생각해야했습니다. 지금
Jo King

1

MATL , 28 27 바이트

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

여기에는 세 가지 입력이 사용됩니다.

  • 월과 연도가 포함 된 문자열 : 'March 2019'
  • 요일을 나타내는 첫 글자가 대문자 인 세 글자가 포함 된 문자열 : ' 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

파이썬 3 , 92 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을 나타내고, 요일은 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

R , 72 69 바이트

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

온라인으로 사용해보십시오!

입력을 :

  • 연도 번호
  • 월 번호 (1-12)
  • 현재 로케일의 평일 문자열 (TIO에는 영어 이름이 대문자 여야 함)
  • 서수 (1 색인)

0

PHP , 46 , 43 , 31 바이트

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

온라인으로 사용해보십시오!

프로그램은 다음과 같은 문자열을 입력으로받습니다. "second saturday of March 2019"

프로그램은 요일 번호를 인쇄합니다.

Shaggy 덕분에 -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일이다. 아마도 이것은 크리스마스 이브 형식 도전에 유용 할 것입니다
ASCII-only


1
예,하지만 대체 방법을 생각하고있었습니다 (즉, <repeat " Eve"date2-date1 times> 방법 iirc)
ASCII 전용

>> 25-Dec-2019 - 1-1-2019 == 358
Galen Ivanov

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)+내가  추가 ntegers 1… 31을

d← 의 저장 d을 위해 ( D AY 번호)

7| 7로 나눌 때의 남은 나눗셈

⎕= 요일 번호에 대한 프롬프트 콘솔 및 요일 번호와 동일한 마스크를 가져옵니다.

d/⍨ 필터 d해당 마스크로

⎕⊃ n에 대한 프롬프트 콘솔을 사용하여 요일 번호 목록에서 선택하십시오.

date[c]  날짜 / 시간 스탬프 [n] (시간, 분, 초, 밀리 초 동안 후미 0이 있음)


코드는 [c] 를 클릭 하고 노트는 [n] 을 클릭하십시오 .


0

자바 스크립트 (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 바이트가 절약되었습니다.


요일이 일요일-토요일 또는 월요일-일요일 형식입니까?
무지의 구현

@ 무지의 구현 죄송합니다. 무언가를 잊어 버린 것을 알았습니다. (스 니펫은 이제 더 쉽게 만들기 위해 select를 사용합니다.)
Neil

@ImbodimentofIgnorance, 일요일은 0JS입니다.
얽히고 설킨

오. 나는 그것을 몰랐다. 나는 자바 스크립트에 익숙하지 않다.
무지의 구현


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

코 틀린 , 131 84 바이트

ASCII 전용 코드 및 주석 덕분에 47 바이트

입력 : year, monthNumber, weekdayNumber, weekNumber

한 줄에 1에서 최대 1까지의 모든 정수. 요일 번호는 일요일 1에서 토요일 7까지입니다. 주 프로그램은 날짜 클래스에서 1900 년을 잃게하고 월과 요일은 람다를 호출하기 전에 1 대신 1로 시작하도록 변경됩니다. 입력 텍스트 상자에 인수를 입력하여 자신의 날짜를 시험해 볼 수 있습니다.

출력 : 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 -Scala 및 Groovy 답변과 동일한 방법을 사용합니다
ASCII 전용


1
더 이상 import 명령이 필요하지 않으므로 문제가되지 않습니다. : P
ASCII 전용
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.