Çalışma sürelerini kontrol edin


16

Giriş

Burada Almanya'da çalışma sürelerine ilişkin karar çok katı. Günde 6 saat veya daha fazla çalışıyorsanız, en az 30 dakikalık bir mola vermeniz gerekir. 9 saat veya daha fazla çalışıyorsanız 45 dakikalık bir mola vermeniz gerekir. 6 saatten az çalışıyorsanız, mola vermek zorunda değilsiniz.

Tabii ki bu molaları bölebilirsiniz, ancak her bölümün sayılması için en az 15 dakika uzunluğunda olması gerekir.

Meydan okuma

Bu meydan okumada, çalışma sürelerinin bir listesini alırsınız ve aşağıdaki kuralları kullanarak yeterli molaların verilip verilmediğini kontrol etmeniz gerekir:

Izin vermek wçalışma süresi saat olarak:

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

Ayrıca, her ara en az 15 dakika uzunluğunda olmalıdır. Ayrıca her zaman gerekenden daha fazla mola verebilirsiniz. Bunların hepsi "en azından" değerlerdir.

Giriş

Girişiniz çalışma sürelerinin bir listesi olacaktır. Tam biçim size bağlıdır, ancak saat ve dakika olarak yalnızca zaman değerlerini içermelidir.

Misal:

Buradaki format, bir grup listesidir, ancak her grup bir çalışma periyodunu temsil eder. Bir demet içindeki ilk eleman başlangıç ​​zamanı, ikincisi bitiş zamanı olacaktır.

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

Bu, toplam 9.5 saatlik çalışma süresi ve toplam 45 dakikalık mola süresi ile sonuçlanır.

Bu çalışma sürelerinin aralarla ayrılması gerekmediğini unutmayın. Sadece birbirini takip eden çalışma süreleri de olabilir (örnek test durumlarına bakınız).

Ayrıca, molaların çalışma süresine dahil olmadığını unutmayın. Bunlar iki ayrı değerdir.

Çalışma sürelerinin sipariş edildiğini varsayabilirsiniz.

Çıktı

Bu giriş, çıkış, belirli bir truthy yeterli sonları alınır ve bir olsaydı değeri falsy değer değilse.

kurallar

  • Gönderinizde kullandığınız giriş biçimini belirtin.
  • Boş girişi işlemek zorunda değilsiniz. Her zaman en az bir çalışma dönemi olacaktır.
  • Çalışma periyotları sadece bir gün sürecektir, bu yüzden gece yarısı işinizi halletmeniz gerekmez.
  • Tarih- / Saat- / Her neyse- Yerleşiminize dilinizle birlikte geldiği sürece izin verilir.
  • İşlev veya tam programa izin verilir.
  • Giriş / çıkış için varsayılan kurallar .
  • Standart boşluklar geçerlidir.
  • Bu , bu yüzden en düşük bayt sayısı kazanır. Tie-breaker daha erken sunuluyor.

Test senaryoları

Yukarıdaki örnekle aynı giriş formatı.

[("07:00", "12:00"), ("12:30", "15:30"), ("15:45", "17:15")] -> DOĞRU // 9: 30 saat çalışma, 45 dakika ara -> Tamam
[("07:20", "07:45"), ("07:59", "11:30"), ("11:55", "15:00")] -> YANLIŞ // 7: 01 saat çalışma, 39 dakika ara, ancak ilk ara sayılmaz çünkü <15 dakika
[("06:00", "09:00"), ("09:00", "11:50")] -> DOĞRU // Yalnızca 5: 50s çalışıyor, bu yüzden ara vermeye gerek yok
[("07:30", "12:00"), ("12:30", "16:00")] -> DOĞRU // 8 saat çalışma, 30 dakika ara -> Tamam
[("08:00", "12:30"), ("13:05", "17:45")] -> YANLIŞ // 9: 10s çalışma, gerekli 45 yerine sadece 35 dakika ara
[("08:00", "14:00")] -> YANLIŞ // 6saat iş, ara yok, ama 30 dakika gerekli


Mutlu Kodlama!

Yanıtlar:


1

Pyth, 56 52 bayt

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

[[hh,mm], [hh,mm], ...]Öncü 0s olmadan formda girdi alır

Açıklama:

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

Burada deneyin

Veya tüm test senaryolarını burada deneyin


5

JavaScript, 108 106 bayt

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)

Bir dizi dizi alır. Her iç dizi, her dönem için sırasıyla başlangıç ​​saatine ve dakikaya ve bitiş saatine ve dakikasına sahiptir.


3

Python 3, 135

DSM sayesinde 3 bayt tasarruf etti.

Bu bir süredir benim matematik çözümlerimden biri.

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)

İşte benim test durumlarım, ayrıca işlevin nasıl çağrılmasını beklediğimi de gösterir.

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)])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.