Lấy cảm hứng từ một kịch bản đời thực, mà tôi đã yêu cầu một câu trả lời ở đây: /superuser/1312212/wr-a-formula-to-count-how-many-times-each-date- xuất hiện trong một tập hợp của ngày
Đưa ra một mảng các khoảng thời gian (hoặc các cặp startdate-enddate), xuất ra một số lượng bao nhiêu lần mỗi ngày, cho tất cả các ngày trong tổng phạm vi.
Ví dụ:
# Start End
1 2001-01-01 2001-01-01
2 2001-01-01 2001-01-03
3 2001-01-01 2001-01-02
4 2001-01-03 2001-01-03
5 2001-01-05 2001-01-05
Cho các dữ liệu trên, kết quả sẽ như sau:
2001-01-01: 3 (Records 1,2,3)
2001-01-02: 2 (Records 2,3)
2001-01-03: 2 (Records 2,4)
2001-01-04: 0
2001-01-05: 1 (Record 5)
Bạn chỉ cần xuất số đếm cho mỗi ngày (theo thứ tự, được sắp xếp cũ nhất - mới nhất); không phải hồ sơ mà họ xuất hiện trong.
Bạn có thể giả sử rằng mỗi lần chỉ chứa ngày, không phải ngày; và vì vậy cả ngày luôn được đại diện.
Tôi / O
Đầu vào có thể là bất kỳ định dạng nào đại diện cho một tập hợp thời gian - vì vậy, một tập hợp các cặp thời gian hoặc một tập hợp các đối tượng (dựng sẵn) có chứa ngày bắt đầu và ngày kết thúc. Thời gian ngày được giới hạn trong khoảng từ 1901 đến 2099, như thường lệ đối với các thách thức PPCG.
Bạn có thể giả sử đầu vào được sắp xếp trước theo cách bạn muốn (chỉ định trong câu trả lời của bạn). Ngày đầu vào được bao gồm (vì vậy phạm vi bao gồm toàn bộ ngày bắt đầu và ngày kết thúc).
Bạn cũng có thể giả sử rằng, trong hai ngày trong bất kỳ phạm vi cụ thể nào, ngày đầu tiên sẽ cũ hơn hoặc bằng ngày thứ hai (nghĩa là bạn sẽ không có phạm vi ngày âm).
Đầu ra là một mảng chứa số đếm cho mỗi ngày, từ cũ nhất đến mới nhất trong đầu vào khi được sắp xếp theo Ngày bắt đầu.
Vì vậy, đầu ra cho ví dụ trên sẽ là {3,2,2,0,1}
Có thể một số ngày không được bao gồm trong bất kỳ phạm vi thời gian nào, trong trường hợp đó 0
là đầu ra cho ngày đó.
Tiêu chí chiến thắng
Đây là mã golf, vì vậy byte thấp nhất sẽ thắng. Loại trừ thông thường được áp dụng
Ví dụ thuật toán giả
For each time range in input
If start is older than current oldest, update current oldest
If end is newer than current newest, update current newest
End For
For each day in range oldest..newest
For each time range
If timerange contains day
add 1 to count for day
End For
Output count array
Các thuật toán khác để có được kết quả tương tự là tốt.
0
nên có trong một từ điển? Nó chỉ xuất hiện để buộc người dùng phải lặp từ min(input)
để max(input)
, mà dường như không thêm bất cứ điều gì đến cốt lõi của sự thách thức (timespans máy tính).