作業期間を確認する


16

前書き

ここドイツでは、労働時間に関する裁定は非常に厳格です。1日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分である必要があります。また、必要以上の休憩を取ることができます。これらはすべて「少なくとも」値です。

入力

入力は作業期間のリストになります。正確な形式はユーザー次第ですが、時間と分として時間値のみを含める必要があります。

例:

ここでの形式はタプルのリストですが、各タプルは作業期間を表します。タプルの最初の要素は開始時間になり、2番目の要素は終了時間になります。

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

これにより、合計作業時間は9.5時間、合計休憩時間は45分になります。

これらの作業期間は、休憩で区切る必要はありません。互いにちょうど続く作業期間もあります(例はテストケースを参照)。

また、休憩は勤務時間にカウントされないことに注意してください。これらは2つの別個の値です。

作業期間が順序付けられていると想定できます。

出力

この入力、出力を考えるとtruthyの十分な休憩が取られた場合は、値とfalsy値でない場合。

ルール

  • 提出物で使用している入力形式を指定します。
  • 空の入力を処理する必要はありません。常に少なくとも1つの作業期間があります。
  • 作業期間は1日のみであるため、深夜に作業を行う必要はありません。
  • 日付/時刻-/ Whatever-ビルトインは、言語に付属している限り許可されます。
  • 機能または完全なプログラムが許可されます。
  • 入出力のデフォルト規則
  • 標準の抜け穴が適用されます。
  • これはなので、バイト数が最も少なくなります。タイブレーカーは以前の提出です。

テストケース

上記の例と同じ入力形式。

[( "07:00"、 "12:00")、( "12:30"、 "15:30")、( "15:45"、 "17:15")]-> TRUE // 9: 30時間の仕事、45分の休憩-> OK
[( "07:20"、 "07:45")、( "07:59"、 "11:30")、( "11:55"、 "15:00")]-> FALSE // 7: 01h作業、39分の休憩、ただし15分未満のため最初の休憩はカウントされません
[( "06:00"、 "09:00")、( "09:00"、 "11:50")]-> TRUE // 5:50hのみ動作するため、休憩は不要
[( "07:30"、 "12:00")、( "12:30"、 "16:00")]-> TRUE // 8時間の作業、30分間の休憩-> OK
[( "08:00"、 "12:30")、( "13:05"、 "17:45")]-> FALSE // 9:10h作業、必要な45回の代わりに35分だけ休憩
[( "08:00"、 "14:00")]-> FALSE // 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

Python 3、135

DSMのおかげで3バイト節約されました。

これは私の数学的な解決策の1つです。

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.