Bao nhiêu tuần?


13

Nhiệm vụ của bạn là xuất ra một số duy nhất; số tuần ISO mà một phạm vi ngày nhất định giao nhau. Để trích dẫn Wikipedia : An average year is exactly 52.1775 weeks long, nhưng đây không phải là về mức trung bình.

Đầu vào bao gồm hai ngày ISO được phân tách bằng dấu cách:

0047-12-24 2013-06-01

Ngày kết thúc không bao giờ trước ngày bắt đầu. Chúng tôi sẽ sử dụng lịch Gregorian ngoại suy cho đơn giản.

Các trường hợp thử nghiệm:

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)

Giải pháp của bạn nên xử lý ngày giữa 0001-01-019999-12-31.


2
Đầu vào có thể là một chuỗi các chuỗi thay vì một chuỗi được phân tách bằng dấu cách không? Ngoài ra, hai ngày có thể là hai đối số cho một chức năng?
Doorknob

Tôi giả sử bạn có nghĩa là Lịch Gregorian Proleptic .
Brad Gilbert b2gills

Ngoài ra, làm tuần bắt đầu vào Chủ nhật hay thứ Hai? Theo trường hợp thử nghiệm thứ hai của bạn, đó là thứ Hai, nhưng chỉ cần đảm bảo.
Doorknob

@Doorknob quote Trích dẫn Wikipedia: "Một ngày được chỉ định bởi năm đánh số tuần theo ISO theo định dạng YYYY, một số tuần ở định dạng được đặt trước bởi chữ 'W' và số ngày trong tuần, một chữ số d từ 1 đến 7 , bắt đầu từ thứ Hai và kết thúc vào Chủ nhật "Vì vậy, bắt đầu vào thứ Hai theo ISO 8601
Tensibai

2
Theo tiêu chuẩn ISO,Weeks start with Monday.
Filip Haglund

Câu trả lời:


2

Ruby, 89 88 86 byte

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

Một giải pháp rất thô sơ: cho ngày đầu tiên avà ngày thứ hai b, tăng a, kiểm tra nếu đó là một thứ Hai (nếu như vậy, chúng tôi đã "cán qua" đến một tuần mới), và dừng lại một lần ab.

Đưa đầu vào theo định dạng chính xác được chỉ định trong câu hỏi: một chuỗi được phân tách bằng dấu cách. (Cách phân tích cú pháp đầu vào là Fancy-ish: nó sử dụng toán tử "splat" của Ruby *. Toán tử này "mở rộng" một mảng hoặc liệt kê ra, vì vậy Time.gm *[2013, 06, 01]sẽ trở thành Time.gm 2013, 06, 01.)

Được nhập từ một cuộc thảo luận bình luận:

Chúng tôi không quan tâm đến "tuần trong một năm;" chúng tôi chỉ quan tâm đến "tuần tổng thể." Vì vậy, cho dù một năm có 52 hay 53 tuần không có sự khác biệt.

Chỉ để tránh nhầm lẫn trong tương lai với việc liệu điều này có xử lý chính xác ranh giới năm theo Wikipedia hay không , tất cả các tuần luôn bắt đầu vào thứ Hai và kết thúc vào Chủ nhật.

Đối với một số thủ thuật lạ mắt hơn, tất cả đều tương đương:

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

Bạn không thể lưu 1 char thay thế a==bbằng a<b?
Tensibai

1

VBA, 125 byte

Yêu cầu 2 đầu vào hàm dưới dạng chuỗi

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

Khá chắc chắn Điều này có thể được chơi golf. Đây là vòng lặp mặc dù hàng ngày giữa 2 ngày và tăng bộ đếm mỗi khi ngày ISO thay đổi.

DatePart("ww",f+i,2,2)là số tuần ISO trong VBA có nghĩa là 2 đầu tiên Monday (complies with ISO standard 8601, section 3.17). sau đó thứ 2 có nghĩa làWeek that has at least four days in the new year (complies with ISO standard 8601, section 3.17)

140 byte w / đầu vào đơn

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 byte

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

Sau cuộc nói chuyện với @Doorknob, cuối cùng cũng dễ dàng như đếm thứ Hai.

seq cho phép tạo một vectơ ngày (của mỗi ngày giữa hai ngày) và strftime biến nó thành 'số ngày trong tuần', bây giờ đếm số lần 1 để lấy số thời gian bạn thay đổi trong tuần và thêm 1 vào đưa vào tài khoản tuần trước.

Một cách tiếp cận khác:

R, 85 byte

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

1
Về cách tiếp cận thứ hai của bạn, bạn chỉ nên thêm 1 vào tổng số Thứ Hai nếu ngày đầu tiên không rơi vào Thứ Hai.
DavidC

@DavidCarraher Cảm ơn, đọc câu trả lời của bạn khiến tôi nghĩ rằng tôi có thể xóa ngày đầu tiên của phạm vi, do đó khắc phục vấn đề :)
Tensibai

0

Toán học 135 79 96 84 74 byte

Phù hợp với đề xuất của @ Doorknob, điều này

  • tạo ra tất cả các ngày trong phạm vi

  • đếm số thứ Hai ( ISOWeekDay== "1") trong DateRange(không bao gồm d) và

  • thêm 1vào tổng số.


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}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.