TargetDate와 요일을 기준으로 가장 가까운 날짜 찾기


12

주어진 요일에 대한 TargetDate에 가장 가까운 날짜를 찾으십시오.

예를 들어, 날짜 20161219와 요일이 주어진 Friday (6)경우 대답은 20161216입니다.

또 다른 예는,의 일짜 20161219와의 요일을 Wednesday (4), 대답은 20161221.

날짜 20161219와 요일이 주어진 마지막 예 Monday (2)20161219입니다.

규칙 :

  • 입력 및 출력의 날짜 형식이 일치해야합니다. 이 예제에서는을 사용 yyyymmdd했지만 연도 (최소 두 자리 숫자), 월 및 월이 "사람이 읽을 수있는"형식이면 어떤 형식이든 사용할 수 있습니다.
  • 요일은 정수로 입력됩니다. 이 예에서 일요일은 요일의 첫 번째 요일이므로 요일은 number 1입니다. 예제와 다를 때주의하는 한 요일 번호를 지정할 수 있습니다.
  • 1970 년에서 2030 년을 수용해야합니다.
  • 공용 언어 날짜 도구와 라이브러리는 허용되지만 사용하지 않기로 선택한 사람들에게는 거리 정보가 제공됩니다.
  • 최소 바이트 수가 이깁니다.

2
편리한 경우 답변이 다른 형식으로 표시 될 수 있습니까? 또한 요일은 월요일이 요일의 첫 번째 요일이되는 언어에도 불편 함을 보였습니다
Blue

4
예, 엄격한 형식 요구 사항으로 인해이 작업은 실제 날짜 찾기보다 구문 분석 / 변환 / 형식화에 더 중요합니다. IMO가 " 입력과 출력에 동일한 형식을 사용하는 한 날짜와 요일을 임의의 적절한 형식으로 수락 할 수 있습니다. " 그러나 많은 사람들이 이미 답변을 제출 했으므로 지금 그대로 유지해야한다고 생각합니다.
smls December

@smls 동의합니다. 다음에 배운 교훈.
Brett VanderVeen12

1
@BrettVanderVeen 요구 사항을 완화하기에는 너무 늦었다 고 생각하지 않습니다. 업데이트 된 사양에 대한 각 (현재 8) 답변에 의견을 추가 할 수 있습니다. 나는 때때로 그런 짓을했습니다.
Adám

답변:


1

펄 6 , 46 바이트

{~first *.day-of-week==$^b,Date.new($^a)-3..*}

두 개의 인수 yyyy-mm-dd, 형식 의 날짜 문자열 및 1= Monday와 7= Sunday 사이의 요일 숫자 를 허용하는 람다 .

설명:

                           Date.new($^a)       # Construct Date object from first argument.
                                        -3     # Subtract 3 days.
                                          ..*  # Construct a Range from that, to infinity.
  first                   ,                    # Iterate the range, and return first date...
        *.day-of-week==$^b                     # whose weekday number equals the second arg.

예제에 사용 된 날짜 및 요일 형식을 사용하면 88 바이트가됩니다.

{S:g/\-//with ~first *.day-of-week==($^b-2)%7+1,Date.new(|($^a~~/(....)(..)(..)/))-3..*}

참고로, 날짜 및 요일 형식 규칙이 완화되었습니다. 다시 제출해주세요.
Brett VanderVeen12

@BrettVanderVeen : 업데이트되었습니다.
smls

2

펄 6 , 83 바이트

->$_,\w{~(Date.new(|m/(....)(..)(..)/)-3...*.day-of-week%7+1==w)[*-1]~~{S:g/"-"//}}

시도 해봐

넓히는

->     # pointy block lambda
  $_,
  \w
{
  ~(  # turn into a Str

    Date.new( |m/(....)(..)(..)/ ) - 3 # three days earlier
    ...                                # generate a sequence
    *.day-of-week % 7 + 1 == w         # stop when the right day is found

  )[*-1]  # the last one

  ~~      # apply the following block

  {
    S:g/"-"//  # remove 「-」
  }
}

참고로, 날짜 및 요일 형식 규칙이 완화되었습니다. 다시 제출해주세요.
Brett VanderVeen12

2

자바 스크립트 (ES6), 93 바이트

(s,n,d=new Date(s))=>d.setDate(d.getDate()+(n+9-d.getDay())%7-3)&&d.toISOString().slice(0,10)

%Y-%m-%d날짜 형식을 사용 합니다. 경우 %a %b %d %Y82 바이트 다음, 허용되는 날짜 형식입니다 :

(s,n,d=new Date(s))=>d.setDate(d.getDate()+(n+9-d.getDay())%7-3)&&d.toDateString()

일요일 = 10에서 토요일 = 16을 요구하여 2 바이트를 더 절약 할 수는 있지만 어리석은 요일 매핑입니다. 설명과 함께 특정 YYYYMMDD 날짜 형식을 사용한 이전 142 141 바이트 (@Guedes 덕분) 버전 :

(s,n,d=new Date(s.replace(/(?=..(..)?$)/g,'-')))=>d.setDate(d.getDate()+(n+9-d.getDay())%7-3)&&d.toISOString().replace(/-(..)-(..).*/,'$1$2')

너무 오래 느껴집니다. 설명 : 먼저 -날짜에 s를 삽입 하여 ISO 형식으로 new Date가져온 후 구문 분석 할 수 있습니다. 다음으로, 사이의 값을 얻기 위해 실제 하루 원하는 일을 비교 -33실제 오프셋에 대한. 마술 97( %참 모듈로가 아닌 CPU 모듈로 인해 ) 플러스 3( -3오프셋으로) 빼기 1( n1- 인덱스 및 getDay0- 인덱스) 에서 비롯됩니다 . 그런 다음 날짜가 ISO 형식으로 다시 변환되고 원하지 않는 문자가 제거됩니다.


당신에게 먼저 대체 변경 한 바이트를 저장할 수 있습니다.replace(/(?=..(..)?$)/g,'-')
워싱턴 오 Guedes

참고로, 날짜 및 요일 형식 규칙이 완화되었습니다. 다시 제출해주세요.
Brett VanderVeen12

1

파이썬 150 149 바이트

from datetime import*
lambda s,n,t='%Y%m%d':[d for d in[datetime.strptime(s,t)+timedelta(o-3)for o in range(7)]if(n-2)%7==d.weekday()][0].strftime(t)

Oouuf, 149. repl.it

string s, 지정된 날짜 ( t='%Y%m%d'입력 및 출력 모두에 형식 문자열 사용 ) 및 [1,7]의 숫자를 사용 하는 명명되지 않은 함수 n.
요청한 요일에 대해 주어진 날로부터 3 일 전 3 일에서 7 일을 검사합니다. 의주는 월요일
datetime시작하며 0을 기준으로하므로 테스트는 (n-2)%7==d.weekday()입니다.


참고로, 날짜 및 요일 형식 규칙이 완화되었습니다. 다시 제출해주세요.
Brett VanderVeen12

1

배쉬 + 코어 유틸리티, 50

date -d$1+$[($2-`date -d$1 +%u`+9)%7-3]day +%Y%m%d

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

  • date -d$1 +%u요일 (1..7)을 제공합니다. 1은 월요일입니다
  • 입력 된 요일에서 빼서 일별 인덱스를 제공합니다. 가장 가까운 날짜를 얻기 위해 입력 날짜에 [-3, 3] 범위의 인수를 더하고 싶습니다. 그래서 우리는 마법 인자 9를 더하고 모듈로 7을 빼고 3을 뺍니다. 마법 인자 9는 3 + 7 - 1입니다. 3은 [-3, 3] 범위에 대한 입력 범위를 조정하고 모듈로 후에 다시 뺍니다. bash 모듈러스는 CPU 모듈러스와 동일하고 7 개의 추가 조정이 올바른 범위로 조정되므로 결과는 7이됩니다. -1은 입력에서 1이 일요일이지만 % u 출력의 경우 1이 월요일이기 때문입니다.
  • date그런 다음 바깥 쪽 <input date> + <magic factor>days은 YYYYMMDD 형식으로 구문 분석 하여 표시합니다.

참고로, 날짜 및 요일 형식 규칙이 완화되었습니다. 다시 제출해주세요.
Brett VanderVeen12

1

SAS 매크로 언어, 110 바이트

%macro s(d,a);%put %sysfunc(putn(%sysfunc(intnx(week.&a.,%eval(%sysfunc(putn(&d,8.))-4),1)),yymmddn8.));%mend;

끔찍한 골프 언어이지만 여기에 설명이 있습니다 (내부에서) :

s날짜 입력 d과 숫자 요일 을 허용 하는 매크로 를 작성하십시오 a. 그런 다음 %eval(%sysfunc(putn(&d,8.))-4)날짜를 SAS 숫자 날짜로 변환하고 4 일씩 줄입니다. intnx그런 다음 이 함수는 지정된 요일의 다음 발생을 반환합니다. putn그런 다음 날짜를 yyyymmdd로 다시 포맷하고 %put출력을 로그에 인쇄합니다.


참고로, 날짜 및 요일 형식 규칙이 완화되었습니다. 다시 제출해주세요.
Brett VanderVeen12

1

Mathematica, 85 49 바이트

#~DatePlus~Mod[#2-#~DateValue~"ISOWeekDay",7,-3]&

날짜의 입력 형식 {2016, 12, 16}은 실제 목록 이거나 실제 목록입니다 DateObject(다른 사람도 잘 작동한다고 생각하지만 테스트했습니다). 두 경우 모두 출력 형식이 자동으로 일치합니다. 요일 번호는 1월요일 부터 시작됩니다 .

아이디어는 입력 요일과 목표 요일 간의 차이를 계산 #2-#~DateValue~"ISOWeekDay"한 다음 [-3, 3]오프셋이있는 모듈로 를 사용하여 매핑하는 것입니다 (예 :) Mod[...,7,-3]. 결과는 단순히 입력 날짜에 추가됩니다 (날짜 개체 추가의 기본 단위는 일).


참고로, 날짜 및 요일 형식 규칙이 완화되었습니다. 다시 제출해주세요.
Brett VanderVeen12

@BrettVanderVeen 감사합니다.
Martin Ender

1

R, 119 77 56 바이트

날짜 D(문자열)와 요일 d(숫자)의 두 가지 입력을받는 명명되지 않은 함수 .

function(D,d,s=-3:3+as.Date(D))s[lubridate::wday(s)==d]

패키지 의 기능 wday()을 사용합니다 lubridate. 기본적으로 일요일로 처리되어 Date객체를 요일 로 편리하게 변환 할 수 있습니다 1.

편집 : 이제 I / O가 as.Date()기능 의 기본값입니다 ."YYYY-mm-dd"

언 골프 및 설명

function(D,d){
    D=as.Date(D);            # Format input date
    s=-3:3+D;                # Generate sequence of +- 3 days
    s[lubridate::wday(s)==d] # Match the weekday that equals to target day                                    
}

편집 : 이제 +-3주어진 요일을 찾을 수 있는 일련의 일을 만듭니다 . 결과적으로 우리는 하루 만 일치하면 문제가 훨씬 쉬워졌습니다.


참고로, 날짜 및 요일 형식 규칙이 완화되었습니다. 다시 제출해주세요.
Brett VanderVeen12

@BrettVanderVeen 감사합니다.
Billywob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.