근무 시간 계산기


9

이것은 회사가 모든 직원의 근무 시간 모니터링을 처리하는 방식을 기반으로합니다. 우리 각자는 센서 앞에 카드를 전달할 수 있으므로 시계는 직원이 사무실을 체크인 또는 체크 아웃하는 시간을 등록합니다. 레지스터가 코드에 연결될 때마다 :

  • 코드 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

나는 이것이 혼란 스러울 수 있음을 알고 있습니다 (실제 문제는 더 많은 경우를 고려해야하기 때문에 알고 있습니다). 주저하지 말고 더 많은 사례를 요청하십시오.

이것은 언어별로 가장 짧은 코드가 이길 수 있습니다!


원하는 경우 시스템을 개선하는 방법에 대해 의견을 제시 할 수 있지만, 요점은 아닙니다. 상사는 그것을 바꾸는 데 시간을 소비하지 않습니다. :-)


답변:


3

파이썬 3 , 327 322 318 317 바이트

일부 바이트를 제거해 준 @JonathanFrech와 @ Mr.Xcoder에게 감사합니다.

코드 목록 ( C) 및 시간 목록 ( T) ( (hours, minutes)튜플)으로 입력을받습니다. (hours, minutes)튜플을 반환합니다 .

def f(C,T):
 T,L=[m+h*60for h,m in T],C.count
 for z in range(len(C))[::-1]:
  c=C[~-z]
  if c*C[z]:
   if c<3:return 0,0
   C.insert(z,0);b=~-T[z];T.insert(z,b if c-4else min(T[~-z]+15,b))
 while L(3):i=C.index(3);del C[i:i+2],T[i:i+2]
 return(0,0)if L(1)+L(2)>2or 0in C[1::2]else divmod(sum(T[1::2])-sum(T[::2]),60)

주어진 예에 대해 확인했습니다.

언 골프

def f(C, T):
    # use minutes since midnight instead of (hours, minutes)
    T=[m+h*60 for h,m in T]

    # error correction
    for z in range(len(C))[::-1]:
        if C[z-1] and C[z]:
            if C[z-1]<3:
                return 0,0

            C.insert(z,0)
            b=T[z]-1
            T.insert(z, b if C[z-1] != 4 else min(T[z-1]+15, b))

    # simplification (remove work trips (code 3))
    while L(3): # 3 in C
        i=C.index(3)
        del C[i:i+2]
        del T[i:i+2]

    # error check
    if 0 in C[1::2] or 2 < C.count(1) + C.count(2):
        return 0,0

    # sum
    s = sum(T[1::2])-sum(T[::2])

    # to (hours, minutes)
    return divmod(s, 60)


내가 생각하지 않은 부정. 좋은 트릭.
Hannes Karppila

L(3)대신 사용할 수 있습니다 3in C.
Mr. Xcoder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.