몇 주?


13

당신의 임무 는 하나의 숫자를 출력하는 것입니다; 지정된 기간이 교차하는 ISO 주 수입니다. Wikipedia :를 인용하자면 An average year is exactly 52.1775 weeks long, 이것은 평균에 관한 것이 아닙니다.

입력 은 두 개의 공백으로 구분 된 ISO 날짜로 구성됩니다.

0047-12-24 2013-06-01

종료 날짜는 시작 날짜 이전이 아닙니다. 우리는 간단하게 추정 된 그레고리력을 사용합니다.

테스트 사례 :

Format: input -> output
2015-12-31 2016-01-01 -> 1    (both are within week 53 of 2015)
2016-01-03 2016-01-04 -> 2    (the 3rd is within week 53, and the 4th is in week 1)
2015-12-24 2015-12-24 -> 1    (this single day is of course within a single week)

귀하의 솔루션 사이의 날짜 처리해야 0001-01-019999-12-31.


2
공백으로 구분 된 단일 문자열 대신 문자열 배열을 입력으로 사용할 수 있습니까? 또는 두 날짜가 함수에 대한 두 개의 인수가 될 수 있습니까?
Doorknob

나는 당신이 Proleptic Gregorian Calendar 를 의미한다고 가정합니다 .
브래드 길버트 b2gills

또한 주가 일요일이나 월요일에 시작됩니까? 두 번째 테스트 사례에 따르면 월요일이지만 확실합니다.
Doorknob

@Doorknob 冰 Wikipedia quote : "날짜는 ISO 주 번호 매기기 연도에 의해 YYYY 형식으로 지정되고, ww 형식은 주 번호 ( 'W'), 주중 번호는 1에서 7까지의 숫자입니다. 월요일부터 시작하여 일요일로 끝남 "월요일에 시작하여 ISO 8601에 따라
Tensibai

2
ISO 표준에 따르면Weeks start with Monday.
Filip Haglund

답변:


2

루비, 89 88 86 바이트

->s{a,b=s.split.map{|x|Time.gm *x.split(?-)}
n=1
(a+=86400).wday==1&&n+=1until a==b
n}

아주 원시적 인 해결책은 : 첫 데이트 주어진 a두 번째 날짜 b, 증가를 a이 월요일 인 경우 (우리가 새로운 주에 "이월"한 그렇다면) 체크, 한 번 중지 a입니다 b.

질문에 지정된 정확한 형식 (공백으로 구분 된 단일 문자열)으로 입력을받습니다. (그것을 사용하는 방법은 입력 공상 틱 인 구문 분석은 루비 "스 플랫"연산자를 사용한다 *.이 조작은 배열이나 열거 아웃, 그래서 "확장" Time.gm *[2013, 06, 01]된다 Time.gm 2013, 06, 01).

댓글 토론에서 가져옴 :

우리는 "1 년의 주"에 관심이 없습니다. 우리는 "전체 주"에만 관심이 있습니다 따라서 1 년에 52 주 또는 53 주가 있더라도 차이가 없습니다.

Wikipedia에 따르면 이것이 연도 경계를 올바르게 처리하는지 여부와의 혼란을 피하기 위해 모든주는 항상 월요일에 시작하여 일요일에 끝납니다.

좀 더 멋진 트릭의 경우 다음과 같습니다.

until a==b;a+=86400;n+=a.wday==1?1:0;end
[a+=86400,n+=a.wday==1?1:0]until a==b
n+=(a+=86400).wday==1?1:0 until a==b
(a+=86400).wday==1&&n+=1 until a==b
(a+=86400).wday==1&&n+=1until a==b

a==b의해 1 개의 문자 교체 를 저장할 수 a<b없습니까?
Tensibai

1

VBA, 125 바이트

2 개의 함수 입력을 문자열로 예상

Function u(k,j)
f=DateValue(k)
For i=0 To (DateValue(j)-f)
q=DatePart("ww",f+i,2,2)
If q<>j Then u=u+1
j=q
Next
End Function

꽤 골프입니다. 이것은 2 날짜 사이에 매일 반복되지만 ISO 날짜가 변경 될 때마다 카운터를 증가시킵니다.

DatePart("ww",f+i,2,2)VBA의 ISO 주 번호는 처음 2 개를 의미 Monday (complies with ISO standard 8601, section 3.17)합니다. 그런 다음 두 번째 2 의미Week that has at least four days in the new year (complies with ISO standard 8601, section 3.17)

단일 입력으로 140 바이트

Function g(k)
y=Split(k)
f=DateValue(y(0))
For i=0 To (DateValue(y(1))-f)
q=DatePart("ww",f+i,2,2)
If q<>j Then g=g+1
j=q
Next
End Function

1

R, 76 바이트

d=as.Date(scan("","raw"));sum(strftime(seq(d[1],d[2],"day")[-1],"%w")==1)+1

@Doorknob과의 대화가 끝나면 월요일을 계산하는 것만 큼 쉽습니다.

seq 날짜 벡터 (두 날짜 사이의 매일)를 만들고 strftime을 '주중 일수'로 변환하면 이제 1을 곱한 값을 계산하여 주를 변경 한 시간을 얻습니다. 이전 주를 고려하십시오.

또 다른 접근법 반복 :

R, 85 바이트

n=1;d=as.Date(scan("","raw"));z=d[1];while(z<d[2]){n=n+(strftime(z<-z+1,"%w")==1)};n

1
두 번째 접근 방식과 관련하여 첫 번째 날짜가 월요일에 해당하지 않는 경우 총 월요일 수에 1 만 추가해야합니다.
DavidC

@DavidCarraher 덕분에, 당신의 대답을 읽는 나를 내가 이렇게 문제 : 고정, 범위의 첫날을 제거 할 수 있다고 생각 만든
Tensibai

0

Mathematica 135 79 96 84 74 바이트

@Doorknob의 제안과 일치합니다.

  • 범위의 모든 날짜를 생성합니다

  • (제외 ) ISOWeekDay에서 월요일 수 ( == "1")를 계산합니다.DateRanged

  • 1총계에 추가 합니다.


Count[DateString[#,"ISOWeekDay"]&/@Rest@(DateRange@@StringSplit@#),"1"]+1&

Count[DateString[#,"ISOWeekDay"]&/@Rest@(DateRange@@StringSplit@#),"1"]+1&
/@ {"2015-12-31 2016-01-01", "2016-01-04 2016-01-05","2016-01-03 2016-01-04", 
"2015-12-24 2015-12-24", "1876-12-24 2016-01-01"}

{1, 1, 2, 1, 7255}

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