นี่คือวิธีที่ บริษัท ของฉันจัดการกับการตรวจสอบเวลาทำงานของพนักงานทุกคน เราแต่ละคนมีการ์ดที่สามารถส่งผ่านหน้าเซ็นเซอร์เพื่อให้นาฬิกาบันทึกเวลาที่พนักงานเช็คอินหรือออกจากสำนักงาน การลงทะเบียนทุกครั้งจะเชื่อมโยงกับรหัส:
- รหัส 0: พนักงานมาถึง (หรือกลับไปที่) สำนักงาน
 - รหัส 1: พนักงานออกจากสำนักงานเพื่อรับประทานอาหารกลางวัน
 - รหัส 2: พนักงานออกจากสำนักงานในตอนท้ายของวัน
 - รหัส 3: พนักงานออกจากสำนักงานด้วยเหตุผลการทำงาน
 - รหัส 4: พนักงานออกจากสำนักงานด้วยเหตุผลส่วนตัว
 
การลงทะเบียนรหัส 0 บางครั้งจะเรียกว่า "การลงทะเบียนเป็นศูนย์" และรหัส 1 ถึงการลงทะเบียนรหัส 4 บางครั้งจะถูกเรียกว่า "การลงทะเบียนที่ไม่ใช่ศูนย์"
ดังนั้นวันปกติสำหรับคนงานจะสร้างรายการลงทะเบียนเช่นนี้:
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
อย่างไรก็ตามบางครั้งพนักงานก็ทำผิดพลาด ระบบจะแก้ไขข้อผิดพลาดต่อไปนี้โดยอัตโนมัติ:
มีระเบียนที่ไม่เป็นศูนย์สองรายการติดต่อกัน หากระเบียนที่ไม่ใช่ศูนย์แรกมีรหัส 4 ระบบจะทำการเพิ่มรหัสอัตโนมัติ 0 ลงทะเบียน 15 นาทีหลังจากนั้นหรือ 1 นาทีก่อนการลงทะเบียนครั้งถัดไปหากมีการลงทะเบียนน้อยกว่า 15 นาทีหลังจากนั้น หากบันทึกที่ไม่เป็นศูนย์แรกมีรหัส 3 ระบบจะทำการเพิ่มรหัสอัตโนมัติ 0 การลงทะเบียน 1 นาทีก่อนการลงทะเบียนครั้งต่อไป กรณีอื่น ๆ ทุกข้อก่อให้เกิดข้อผิดพลาด ตัวอย่าง:
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.พนักงานลงทะเบียนสองรหัส 1 ลงทะเบียนหรือสองรหัส 2 ลงทะเบียน เนื่องจากความจริงทั้งสองนี้ใช้แทนกันได้จึงไม่นับเป็นข้อผิดพลาด หากการลงทะเบียนรหัส 1 หรือรหัส 2 รวมมากกว่า 2 การลงทะเบียนนั่นจะทำให้เกิดข้อผิดพลาด
ความท้าทาย
วัตถุประสงค์หลักคือการคำนวณจำนวนชั่วโมงและนาทีที่พนักงานใช้ในสำนักงาน สิ่งนี้จะทำหลังจากแก้ไข (ถ้าจำเป็นและเป็นไปได้) รายการอินพุตอินพุต โปรดทราบว่ารายการการลงทะเบียนที่เหมาะสมจะสลับการลงทะเบียนเป็นศูนย์ด้วยการลงทะเบียนที่ไม่เป็นศูนย์
ดังนั้นอัลกอริทึมจะได้รับรายการการลงทะเบียนสำหรับพนักงานและวันให้และจะคืนเวลาที่ใช้ในการทำงานในวันนั้น หากเวลาไม่สามารถคำนวณเวลาที่ใช้ในกรณีที่มีข้อผิดพลาดมันจะส่งคืน 0 ชั่วโมง, 0 นาที
กฎ:
- เวลาที่ใช้คือผลรวมของเวลาที่ใช้ระหว่างการลงทะเบียนรหัส 0 ทุกครั้งและการลงทะเบียนที่ไม่เป็นศูนย์ต่อไปนี้ หากรหัสที่ไม่ใช่ศูนย์คือ 3 เวลาที่ใช้ระหว่างการลงทะเบียนนั้นและการลงทะเบียนรหัส 0 ต่อไปนี้จะถูกนับด้วย
 - คุณสามารถสันนิษฐานได้ว่ารายการอินพุตอินพุตจะเรียงตามลำดับเวลาจากน้อยไปมากและการลงทะเบียนทั้งหมดจะมาจากวันเดียวกัน (ไม่มีใครทำงานเกินเที่ยงคืน)
 - การลงทะเบียนอินพุตจะไม่ว่างเปล่า
 - รูปแบบการป้อนข้อมูลสามารถเป็นอะไรก็ได้ที่รหัสของคุณต้องการตราบใดที่เวลาแสดงด้วยค่าชั่วโมงและค่านาที (จำนวนชั่วโมงจำนวนจุดลอยตัวจะไม่ใช่อินพุตที่ถูกต้อง) ตัวอย่าง: รายการที่มีรหัสและรายการที่มีเวลาเป็นสตริงทั้งสองรายการมีความยาวเท่ากัน รายการของรายการจำนวนเต็มเป็นจำนวนเต็มรหัสชั่วโมงและนาทีของการลงทะเบียน ...
 - เอาต์พุตสามารถเป็นสตริงพร้อมเวลา (ในรูปแบบใด ๆ ที่คุณต้องการ: H: mm, HH: mm, H: m ... ); รายการจำนวนเต็มสองจำนวนที่คำนวณชั่วโมงและนาที สิ่งใดที่สามารถตีความได้ว่าเป็น tuple ในหนึ่งชั่วโมงนาที (ไม่อนุญาตให้ใช้เลขทศนิยมที่มีชั่วโมงที่ใช้) หรือคุณสามารถพิมพ์ผลลัพธ์ไปที่ STDOUT
 
กรณีทดสอบ
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
ฉันรู้ว่าสิ่งนี้อาจทำให้เกิดความสับสน (ปัญหาในโลกแห่งความเป็นจริงมีอีกหลายกรณีที่ต้องพิจารณาดังนั้นฉันรู้เรื่องนี้) โปรดอย่าลังเลที่จะขอตัวอย่างเพิ่มเติม
นี่คือ รหัสกอล์ฟดังนั้นรหัสสั้นที่สุดสำหรับแต่ละภาษาอาจชนะ!
คุณสามารถแสดงความคิดเห็นวิธีการปรับปรุงระบบได้หากคุณต้องการ แต่นั่นไม่ใช่ประเด็น เจ้านายของฉันไม่ได้มีแนวโน้มที่จะใช้เวลาเปลี่ยนมัน :-)