Điều này dựa trên cách công ty của tôi xử lý việc theo dõi thời gian làm việc cho mỗi nhân viên. Mỗi người trong chúng ta đều có một thẻ có thể được chuyển qua trước một cảm biến, để đồng hồ đăng ký thời gian mà nhân viên đăng ký vào hoặc ra khỏi văn phòng. Mỗi lần đăng ký được liên kết với một mã:
- Mã 0: nhân viên đến (hoặc quay lại) văn phòng.
- Mã 1: nhân viên rời văn phòng ăn trưa.
- Mã 2: nhân viên rời văn phòng vào cuối ngày.
- Mã 3: nhân viên rời văn phòng vì lý do công việc.
- Mã số 4: nhân viên rời khỏi văn phòng vì lý do cá nhân.
Các thanh ghi mã 0 đôi khi sẽ được gọi là "các thanh ghi 0" và các thanh ghi mã 1 đến mã 4 đôi khi sẽ được gọi là "các thanh ghi khác không".
Vì vậy, một ngày bình thường cho một công nhân sẽ tạo ra một danh sách đăng ký như thế này:
Code/Time
------------
0 8:17 // The employee arrives at the office
4 11:34 // The employee leaves the office to smoke
0 11:41 // The employee returns to the office
1 13:37 // The employee leaves the office to have lunch
0 14:11 // The employee returns to the office
3 15:02 // The employee leaves the office to visit a client
0 16:48 // The employee returns to the office
2 17:29 // The employee leaves the office to go home
Tuy nhiên, các nhân viên đôi khi mắc lỗi. Các lỗi sau được hệ thống tự động sửa:
Có hai hồ sơ khác không liên tiếp. Nếu bản ghi khác không đầu tiên có mã 4, một thanh ghi mã 0 tự động được thêm 15 phút sau hoặc 1 phút trước các thanh ghi tiếp theo nếu nó đã được đăng ký ít hơn 15 phút sau. Nếu bản ghi khác không đầu tiên có mã 3, thì thanh ghi mã tự động 0 luôn được thêm 1 phút trước khi đăng ký tiếp theo. Mỗi trường hợp khác tạo ra một lỗi. Ví dụ:
Code/Time ------------ 0 8:17 // The employee arrives at the office 4 11:34 // The employee leaves the office to smoke 1 13:37 // The employee leaves the office to have lunch // Automatic register with code 0 added at 11:49. Code/Time ------------ 0 8:17 // The employee arrives at the office 4 11:34 // The employee leaves the office to smoke 4 11:39 // The employee leaves again the office for personal reasons // Automatic register with code 0 added at 11:38. Code/Time ------------ 0 8:17 // The employee arrives at the office 3 11:34 // The employee leaves the office to visit a client 1 14:09 // The employee leaves the office to have lunch // Automatic register with code 0 added at 14:08.
Nhân viên đã đăng ký hai thanh ghi 1 mã hoặc hai thanh ghi 2 mã. Vì hai cái này trong thực tế có thể hoán đổi cho nhau, điều đó không được tính là một lỗi. Nếu các thanh ghi mã 1 hoặc mã 2 tổng hợp nhiều hơn 2 thanh ghi, điều đó sẽ gây ra lỗi.
Các thách thức
Mục tiêu chính là tính toán nhân viên đã dành bao nhiêu giờ và phút trong văn phòng. Điều này được thực hiện sau khi sửa chữa (nếu cần và có thể) danh sách đăng ký đầu vào. Lưu ý rằng một danh sách thanh ghi thích hợp sẽ thay thế các thanh ghi 0 với các thanh ghi khác không.
Vì vậy, thuật toán sẽ nhận được danh sách các thanh ghi cho một nhân viên và một ngày cho, và sẽ trả lại thời gian làm việc cho ngày đó. Nếu thời gian không thể tính được thời gian sử dụng trong trường hợp có lỗi, nó sẽ trả về 0 giờ, 0 phút.
Quy tắc:
- Thời gian sử dụng là tổng thời gian dành cho mỗi thanh ghi 0 mã và thanh ghi khác không sau đây. Nếu mã khác không là 3, thời gian giữa thanh ghi đó và thanh ghi mã 0 sau đây cũng sẽ được tính.
- Bạn có thể giả định rằng danh sách thanh ghi đầu vào sẽ theo thứ tự thời gian tăng dần và tất cả các thanh ghi sẽ có cùng ngày (không ai sẽ làm việc quá nửa đêm).
- Thanh ghi đầu vào sẽ không trống.
- Định dạng đầu vào có thể là bất cứ thứ gì mã của bạn cần, miễn là thời gian được biểu thị bằng giá trị giờ và giá trị phút (số giờ trôi nổi sẽ không phải là đầu vào hợp lệ). Ví dụ: Một danh sách có mã và danh sách có thời gian là chuỗi, cả hai danh sách đều có cùng chiều dài; một danh sách các danh sách số nguyên, là số nguyên mã, giờ và phút của các thanh ghi ...
- Đầu ra có thể là một chuỗi với thời gian (ở bất kỳ định dạng nào bạn muốn: H: mm, HH: mm, H: m ...); danh sách hai số nguyên với số giờ và phút được tính; bất cứ điều gì có thể được hiểu là một tuple giờ (một số dấu phẩy động với số giờ đã sử dụng sẽ không được phép). Hoặc bạn có thể in kết quả sang STDOUT.
Các trường hợp thử nghiệm
Code/Time
------------
0 8:17 // Check in
4 11:34 // Check out. Time spent since check in: 3:17
0 11:41 // Check in
1 13:37 // Check out. Time spent since check in: 1:56
0 14:11 // Check in
3 15:02 // Check out. Time spent since check in: 0:51
0 16:48 // Check in. Time spent working outside: 1:46
2 17:29 // Check out. Time spent since check in: 0:41
// Total time (value returned): 8:31
Code/Time
------------
0 8:17
4 11:34 // Time spent: 3:17
1 15:52 // Time spent since 11:49 (automatic register 15 minutes after
// a code 4 register): 4:03
// Total time: 7:20
Code/Time
------------
0 8:17
4 15:47 // Time spent: 7:30
1 15:52 // Time spent since 15:51 (automatic register after a code 4
// register 1 minute before the next register as it is too
// close in time): 0:01
// Total time: 7:31
Code/Time
------------
0 8:17
1 13:34 // Time spent: 5:17
0 14:04
1 17:55 // Time spent: 3:51 (last code 1 should be a code 2 but it does not matter)
// Total time: 9:08
Code/Time
------------
0 8:17
1 13:34
0 14:04
1 17:05
0 17:08
2 17:44
// Total time: 0:00 (too many code 1 and code 2 registers)
Code/Time
------------
0 8:17
1 13:34 // A code 1 register does not generate an automatic code 0 register
2 17:41
// Total time: 0:00 (there's a code 0 register missing)
Code/Time
------------
0 8:17
0 13:34 // what happened between these two check in registers?
2 17:41
// Total time: 0:00 (there's a check out register missing)
Code/Time
------------
0 8:17
0 13:37 // This should probably be a code 1 register, but we cannot be sure
0 14:11
2 17:29
// Total time: 0:00
Tôi biết điều này có thể gây nhầm lẫn (vấn đề trong thế giới thực thậm chí còn có nhiều trường hợp cần xem xét, vì vậy tôi biết điều đó). Xin vui lòng, đừng ngần ngại hỏi thêm ví dụ.
Đây là môn đánh gôn , vì vậy có thể mã ngắn nhất cho mỗi ngôn ngữ sẽ giành chiến thắng!
Bạn có thể nhận xét cách cải thiện hệ thống nếu bạn muốn, nhưng đó không phải là vấn đề. Sếp của tôi không thiên về thời gian thay đổi nó. :-)