이것은 회사가 모든 직원의 근무 시간 모니터링을 처리하는 방식을 기반으로합니다. 우리 각자는 센서 앞에 카드를 전달할 수 있으므로 시계는 직원이 사무실을 체크인 또는 체크 아웃하는 시간을 등록합니다. 레지스터가 코드에 연결될 때마다 :
- 코드 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
그럼에도 불구하고 직원들은 때때로 실수를합니다. 다음 오류는 시스템에 의해 자동으로 수정됩니다.
0이 아닌 두 개의 연속 레코드가 있습니다. 0이 아닌 첫 번째 레코드에 코드 4가있는 경우 자동 코드 0 레지스터는 15 분 후 또는 15 분 미만에 등록 된 경우 다음 레지스터 1 분 전에 추가됩니다. 0이 아닌 첫 번째 레코드에 코드 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 시간 0 분을 반환합니다.
규칙 :
- 소요 시간은 모든 코드 0 레지스터와 다음 0이 아닌 레지스터 사이에서 소비 한 시간의 합입니다. 0이 아닌 코드가 3이면 해당 레지스터와 다음 코드 0 레지스터 사이의 시간도 계산됩니다.
- 입력 레지스터 목록이 오름차순으로 정렬되고 모든 레지스터가 같은 날에 있다고 가정 할 수 있습니다 (자정 이후에는 아무도 작동하지 않음).
- 입력 레지스터가 비어 있지 않습니다.
- 입력 형식은 시간이시 값과 분 값으로 표현되는 한 코드에 필요한 모든 것이 될 수 있습니다 (부동 소수점 수는 유효한 입력이 아닙니다). 예제 : 코드가있는 목록과 시간이 문자열 인 목록 (둘 다 동일한 길이 임); 정수의 목록, 정수는 코드, 레지스터의 시간 및 분입니다.
- 출력은 시간이 포함 된 문자열 일 수 있습니다 (원하는 형식 : H : mm, HH : mm, H : m ...); 시간과 분이 계산 된 두 정수 목록; 1 분 튜플로 해석 될 수있는 모든 항목 (소요 시간이 포함 된 부동 소수점 숫자는 허용되지 않음). 또는 결과를 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
나는 이것이 혼란 스러울 수 있음을 알고 있습니다 (실제 문제는 더 많은 경우를 고려해야하기 때문에 알고 있습니다). 주저하지 말고 더 많은 사례를 요청하십시오.
이것은 코드 골프언어별로 가장 짧은 코드가 이길 수 있습니다!
원하는 경우 시스템을 개선하는 방법에 대해 의견을 제시 할 수 있지만, 요점은 아닙니다. 상사는 그것을 바꾸는 데 시간을 소비하지 않습니다. :-)