Kiểm tra thời gian làm việc


16

Giới thiệu

Ở Đức, phán quyết về thời gian làm việc là rất nghiêm ngặt. Nếu bạn làm việc 6 giờ trở lên mỗi ngày, bạn phải nghỉ ít nhất 30 phút. Nếu bạn làm việc 9 giờ trở lên, bạn cần nghỉ 45 phút. Nếu bạn làm việc dưới 6 giờ, bạn không phải nghỉ ngơi.

Tất nhiên bạn có thể chia những lần nghỉ đó, nhưng mỗi phần phải dài ít nhất 15 phút để được tính.

Các thách thức

Trong thử thách này, bạn sẽ nhận được một danh sách các khoảng thời gian làm việc và bạn phải kiểm tra xem đã nghỉ đủ chưa, sử dụng các quy tắc sau:

Hãy wlà thời gian làm việc trong giờ:

w < 6         -> No breaks needed
6 <= w < 9    -> 30 minute break needed
w >= 9        -> 45 minute break needed

Ngoài ra, mỗi lần nghỉ phải dài ít nhất 15 phút. Ngoài ra, bạn luôn có thể nghỉ nhiều hơn cần thiết. Đó là tất cả các giá trị "ít nhất".

Đầu vào

Đầu vào của bạn sẽ là một danh sách các giai đoạn làm việc. Định dạng chính xác tùy thuộc vào bạn, nhưng nó chỉ chứa các giá trị thời gian là giờ và phút.

Thí dụ:

Định dạng ở đây là một danh sách các bộ dữ liệu trong khi mỗi bộ dữ liệu đại diện cho một khoảng thời gian làm việc. Phần tử đầu tiên trong một tuple sẽ là thời gian bắt đầu, phần tử thứ hai sẽ là thời gian kết thúc.

[("07:00","12:00"),("12:30","15:30"),("15:45","17:15")]

Điều này dẫn đến tổng thời gian làm việc là 9,5 giờ và tổng thời gian nghỉ là 45 phút.

Lưu ý rằng những khoảng thời gian làm việc đó không phải được phân tách bằng các khoảng nghỉ. Cũng có thể có những khoảng thời gian làm việc chỉ theo nhau (ví dụ xem trường hợp kiểm tra).

Cũng lưu ý rằng giờ nghỉ không được tính vào thời gian làm việc. Đó là hai giá trị riêng biệt.

Bạn có thể cho rằng các giai đoạn làm việc được ra lệnh.

Đầu ra

Với đầu vào, đầu ra một này truthy giá trị nếu đủ phá vỡ được thực hiện và một falsy giá trị nếu không muốn nói.

Quy tắc

  • Chỉ định định dạng đầu vào bạn đang sử dụng trong trình của bạn.
  • Bạn không phải xử lý đầu vào trống. Sẽ luôn có ít nhất một khoảng thời gian làm việc.
  • Thời gian làm việc sẽ chỉ kéo dài một ngày, vì vậy bạn không phải xử lý công việc quá nửa đêm.
  • Ngày- / Thời gian- / Bất cứ điều gì - Nội dung cho phép, miễn là nó đi kèm với ngôn ngữ của bạn.
  • Chức năng hoặc chương trình đầy đủ cho phép.
  • Quy tắc mặc định cho đầu vào / đầu ra.
  • Tiêu chuẩn áp dụng.
  • Đây là , do đó, số byte thấp nhất sẽ thắng. Tie-breaker là trình trước đó.

Các trường hợp thử nghiệm

Định dạng đầu vào giống như trong ví dụ trên.

[("07:00", "12:00"), ("12:30", "15:30"), ("15:45", "17:15")] -> THẬT // 9: 30h làm việc, nghỉ 45 phút -> OK
[("07:20", "07:45"), ("07:59", "11:30"), ("11:55", "15:00")] -> FALSE // 7: 01h làm việc, nghỉ 39 phút, nhưng giờ nghỉ đầu tiên không được tính vì <15 phút
[("06:00", "09:00"), ("09:00", "11:50")] -> TRUE // Chỉ làm việc 5: 50h, vì vậy không cần nghỉ
[("07:30", "12:00"), ("12:30", "16:00")] -> TRUE // 8h làm việc, nghỉ 30 phút -> OK
[("08:00", "12:30"), ("13:05", "17:45")] -> FALSE // 9: 10h làm việc, chỉ nghỉ 35 phút thay vì 45 phút cần thiết
[("08:00", "14:00")] -> FALSE // 6h làm việc, không nghỉ, nhưng cần 30 phút


Chúc mừng mã hóa!

Câu trả lời:


1

Pyth, 56 52 byte

La.*bgsm*ydgyd15cPt_Jmid60Q2@[0030 45)hS,/syRcJ2C\´3

Đưa đầu vào ở dạng [[hh,mm], [hh,mm], ...]không có 0s hàng đầu

Giải trình:

La.*bgsm*ydgyd15cPt_Jmid60Q2@[0030 45)hS,/syRcJ2C\´3

La.*b                                                - def y(b): return absdiff(*b)

                    Jmid60Q                          - Unpack the input to mins and assign to J
                    J                                - autoassign J = V
                     m    Q                          - [V for d in Q]
                      id60                           - conv_base(V, 60)

      sm*ydgyd15cPt_J      2                         - Get the total break
                   _J                                - reverse(J)
                 Pt                                  - ^[1:-1]
                c          2                         - chop(2, ^)
                                                     -
       m                                             - [V for d in ^]
            yd                                       - y(d)
           g  15                                     - >= 15
         yd                                          - y(d)
        *                                            - y(d) * (y(d)>=15)
                                                     -
      s                                              - sum(^)

                            @[0030 45)hS,/syRcJ2C\´3 - Get the break required
                                             cJ2     - chop(J, 2)
                                           yR        - map(y, ^)
                                          s          - sum(^)
                                                     - Now have the total time worked in mins
                                         /      C\´  - ^/ord("`")
                                                     - (^/180)
                                                     - Now have the time worked in 3 hour intervals
                                      hS,          3 - sorted([^, 3])[0]
                                                     - (min(^, 3))
                                                     - Now have hours worked in 3 hour intervals capped at 9 hours
                            @[0030 45)               - [0,0,30,45][^]
                                                     - Get the break required for that time

     g                                               - break >= break required

Hãy thử nó ở đây

Hoặc thử tất cả các trường hợp thử nghiệm ở đây


5

Javascript, 108 106 byte

m=>(k=t=0,m.map(l=>(a=l[0]*60+l[1],k+=t?a-b<15?0:a-b:0,b=l[2]*60+l[3],t+=b-a)),t/=60,t<6||k>44||t<9&&k>29)

Có một mảng các mảng. Mỗi mảng bên trong có giờ bắt đầu, phút và giờ kết thúc và phút tương ứng cho từng giai đoạn.


3

Trăn 3, 135

Đã lưu 3 byte nhờ DSM.

Đây là một trong những giải pháp toán học của tôi trong một thời gian.

def f(l):
 h=r=e=0
 for(a,b)in l:a+=a%1*2/3;b+=b%1*2/3;h+=b-a;r-=(e-a)*(e and(a-e)>.24);e=b
 return(h<6)|(6<=h<9and.5<=r)|(h>9and.74<r)

Đây là trường hợp thử nghiệm của tôi, nó cũng cho thấy cách tôi mong đợi hàm được gọi.

assert f([(07.00, 12.00), (12.30, 15.30), (15.45, 17.15)])
assert not f([(07.20, 07.45), (07.59, 11.30), (11.55, 15.00)])
assert f([(06.00, 09.00), (09.00, 11.50)])
assert f([(07.30, 12.00), (12.30, 16.00)])
assert not f([(08.00, 12.30), (13.05, 17.45)])
assert not f([(08.00, 14.00)])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.