Перевірте періоди роботи


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 хвилин. Також ви завжди можете робити більше перерв, ніж потрібно. Це все "принаймні" значення.

Вхідні дані

Вашим вкладом буде список періодів роботи. Точний формат залежить від вас, але він повинен містити лише значення часу, як години та хвилини.

Приклад:

Формат тут - це список кортежів, тоді як кожен кортеж являє собою робочий період. Першим елементом в кортежі буде час початку, другим - час закінчення.

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

Це призводить до загального робочого часу 9,5 годин і загального часу перерви в 45 хвилин.

Зауважте, що ці робочі періоди не повинні бути розділені перервами. Також можуть бути робочі періоди, які просто слідують один за одним (наприклад, див. Тестові випадки).

Також зауважте, що перерви не враховуються в робочий час. Це два окремих значення.

Ви можете припустити, що робочі періоди впорядковані.

Вихідні дані

Враховуючи цей вхід, виведіть триєдне значення, якщо було зроблено достатню кількість перерв, а помилкове - якщо ні.

Правила

  • Укажіть формат введення, який ви використовуєте для подання.
  • Вам не доведеться обробляти порожній вхід. Завжди буде хоча б один робочий період.
  • Періоди роботи триватимуть лише один день, тож вам не доведеться працювати над робочою півночі.
  • Дата- / Час- / Що б не було - Дозволено вбудовані, якщо це відповідає вашій мові.
  • Функція або повна програма дозволена.
  • Правила вводу / виводу за замовчуванням .
  • Застосовуються стандартні лазівки .
  • Це , тому виграє найменший байт. Автоматичний вимикач - це раніше подання.

Тестові справи

Той самий формат введення, як у наведеному вище прикладі.

[("07:00", "12:00"), ("12:30", "15:30"), ("15:45", "17:15")] -> ІСТИНА // 9: 30 годин роботи, 45 хвилин перерви -> ОК
[("07:20", "07:45"), ("07:59", "11:30"), ("11:55", "15:00")] -> ЛАЖКА // 7: 01 год роботи, 39 хвилин перерви, але перша перерва не вважається тому, що <15 хвилин
[("06:00", "09:00"), ("09:00", "11:50")] -> ІСТИНА // Тільки 5: 50 год роботи, тому перерва не потрібна
[("07:30", "12:00"), ("12:30", "16:00")] -> ІСТИНА // 8 годин роботи, перерва на 30 хвилин -> ОК
[("08:00", "12:30"), ("13:05", "17:45")] -> ФАЛЬШ // 9: 10 год роботи, лише 35 хвилин перерви замість потрібних 45
[("08:00", "14:00")] -> ФАЛЬШ // 6 годин роботи, без перерв, але потрібно 30 хвилин


Щасливе кодування!

Відповіді:


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

Пітон 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)])
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.