ตรวจสอบระยะเวลาการทำงาน


16

บทนำ

ที่นี่ในเยอรมนีเวลาในการพิจารณาคดีมีความเข้มงวดมาก หากคุณทำงาน 6 ชั่วโมงขึ้นไปต่อวันคุณต้องหยุดพักอย่างน้อย 30 นาที ถ้าคุณทำงาน 9 ชั่วโมงขึ้นไปคุณจะต้องหยุดพัก 45 นาที หากคุณทำงานน้อยกว่า 6 ชั่วโมงคุณไม่ต้องหยุดพัก

แน่นอนว่าคุณสามารถแบ่งช่วงพักเหล่านั้นได้ แต่แต่ละส่วนจะต้องมีความยาวอย่างน้อย 15 นาที

ความท้าทาย

ในการท้าทายนี้คุณจะได้รับรายการช่วงเวลาทำงานและคุณต้องตรวจสอบว่ามีการหยุดพักเพียงพอหรือไม่โดยใช้กฎต่อไปนี้:

อนุญาตwเป็นเวลาทำงานเป็นชั่วโมง:

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

นอกจากนี้การพักแต่ละครั้งจะต้องมีความยาวอย่างน้อย 15 นาที นอกจากนี้คุณสามารถหยุดพักมากกว่าที่จำเป็น นั่นคือค่าทั้งหมด "อย่างน้อย"

อินพุต

ข้อมูลที่คุณป้อนจะเป็นรายการของช่วงเวลาทำงาน รูปแบบที่แน่นอนนั้นขึ้นอยู่กับคุณ แต่จะต้องมีค่าเวลาเป็นชั่วโมงและนาทีเท่านั้น

ตัวอย่าง:

รูปแบบที่นี่คือรายการของสิ่งอันดับในขณะที่แต่ละสิ่งอันดับแสดงถึงระยะเวลาการทำงาน องค์ประกอบแรกใน tuple จะเป็นเวลาเริ่มต้นส่วนที่สองจะเป็นเวลาสิ้นสุด

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

ส่งผลให้เวลาทำงานทั้งหมด 9.5 ชั่วโมงและเวลาพักทั้งหมด 45 นาที

โปรดทราบว่าช่วงเวลาทำงานเหล่านั้นไม่จำเป็นต้องแยกจากกันด้วยการหยุดพัก อาจมีช่วงเวลาการทำงานที่เพิ่งทำตามกัน (ตัวอย่างดูกรณีทดสอบ)

นอกจากนี้โปรดทราบว่าตัวแบ่งจะไม่นับรวมในเวลาทำงาน นั่นคือค่าที่แยกกันสองค่า

คุณอาจสันนิษฐานว่ามีการสั่งงานช่วงเวลาทำงาน

เอาท์พุต

ได้รับการป้อนข้อมูลนี้ส่งออกtruthyค่าถ้าแบ่งพอถูกนำและfalsyคุ้มค่าหากไม่ได้

กฎระเบียบ

  • ระบุรูปแบบอินพุตที่คุณใช้ในการส่งของคุณ
  • คุณไม่ต้องจัดการกับอินพุตว่าง จะมีระยะเวลาการทำงานอย่างน้อยหนึ่งครั้งเสมอ
  • ระยะเวลาการทำงานจะครอบคลุมเพียงหนึ่งวันดังนั้นคุณจึงไม่ต้องทำงานเกินเที่ยงคืน
  • อนุญาตให้ใช้ Date- / Time- / Anything- Builtins ได้ตราบใดที่มันมีภาษาของคุณ
  • อนุญาตให้ใช้ฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ
  • กฎเริ่มต้นสำหรับอินพุต / เอาต์พุต
  • ช่องโหว่มาตรฐานใช้
  • นี่คือดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงชนะ Tie-breaker เป็นการส่งก่อนหน้านี้

กรณีทดสอบ

รูปแบบอินพุตเหมือนกับในตัวอย่างด้านบน

[("07:00", "12:00"), ("12:30", "15:30"), ("15:45", "17:15")] -> TRUE // 9: ทำงาน 30 ชั่วโมงหยุดพัก 45 นาที -> ตกลง
[("07:20", "07:45"), ("07:59", "11:30"), ("11:55", "15:00")] -> FALSE // 7: ทำงาน 1 ชั่วโมงหยุดพัก 39 นาที แต่พักครั้งแรกไม่นับเพราะ <15 นาที
[("06:00", "09:00"), ("09:00", "11:50")] -> TRUE // งาน 5: 50 ชม. เพียงชั่วโมงเดียวจึงไม่ต้องหยุดพัก
[("07:30", "12:00"), ("12:30", "16:00")] -> งาน TRUE // 8 ชม., 30 นาทีพัก -> ตกลง
[("08:00", "12:30"), ("13:05", "17:45")] -> งาน FALSE // 9: 10 ชม. ทำงานเพียง 35 นาทีแทนที่จะหยุดพัก 45
[("08:00", "14:00")] -> FALSE // 6 ชั่วโมงทำงานไม่หยุดพัก แต่ต้องใช้เวลา 30 นาที


Happy Coding!

คำตอบ:


1

Pyth, 56 52 ไบต์

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

จะเข้าในรูปแบบ[[hh,mm], [hh,mm], ...]ที่ไม่มีชั้นนำ0s

คำอธิบาย:

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

ลองที่นี่

หรือลองกรณีทดสอบทั้งหมดที่นี่


5

Javascript, 108 106 ไบต์

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)

รับอาร์เรย์ของอาร์เรย์ แต่ละอาร์เรย์ภายในจะมีชั่วโมงเริ่มต้นและนาทีและชั่วโมงสิ้นสุดและนาทีตามลำดับสำหรับแต่ละช่วงเวลา


3

Python 3, 135

บันทึก 3 ไบต์ด้วย DSM

นี่เป็นหนึ่งในวิธีแก้ปัญหาทางคณิตศาสตร์ของฉันในขณะที่

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)

นี่คือกรณีทดสอบของฉันมันยังแสดงให้เห็นว่าฉันคาดหวังว่าฟังก์ชันจะถูกเรียกใช้

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)])
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.