タイムシートの計算


14

タイムシート

職場では、タイムシートに記入する必要があります。このタスクは、これを支援するコードを書くことです。

入力

スペースで区切られた1日の始まりと終わりを示すわずかに非標準の12時間時計で2回。3番目の数字は、昼食にかかった時間を表します。例えば

9:14 5:12 30

つまり、午前9時14分に作業を開始し、午後5時12分に作業を終了し、昼食に30分かかりました。

あなたはそれを仮定することができます

  • 最初の列の時間は00:00(真夜中)から午後1時までで、2番目の列の時間は少なくとも午後11:59までです。
  • 昼休みは営業日より長くありません!

入力形式は、指定された例のとおりでなければなりません。

仕事

コードは、これらのトリプルのファイル(または標準入力)を読み取り、各出力ごとに作業時間を読み取ります。この出力は時間数を示す必要があります。上記の例の場合:

7時間と58分から30分を差し引いた7時間28分です。

出力

出力では、(全体の)時間数と分数を指定する必要があり、59分を超えてリストすることはできません。つまり、2時間123分は出力できません。それとは別に、あなたのコードはあなたにとって便利な人間が読むことができるフォーマットで出力できます。

10:00 1:00 30    --> 2hr 30min
12:59 1:00 0     --> 0hr 1min
00:00 11:59 0    --> 23hr 59min
10:00 2:03 123   --> 2hr 0min 

3
厳密な入力形式(:12時間制で区切られた時間)がこの課題に何かを追加する方法がわかりません。
シャギー

3
時間は、1つまたは2つの文字...かもしれないので、あなたは文字の位置を取ることができないため@Shaggy解析は、入力フォーマットは、少なくとも私にとっては挑戦のほとんどをだった
ライアン

コードは数行を読む必要がありますか?または、1行を読み取れば十分ですか?
ルイスメンドー

1
はい、コードは複数行を受け入れる必要があります。
Anush

5
@ mbomb007投票することはできますが、入力形式が気に入らないことがVTCの理由ではありません。
Okx

回答:


7

MATL、28バイト

`jYb0&)YOd.5+wgU13L/- 15XODT

オンラインでお試しください!


1
これは非常に印象的です!
アヌーシュ

出力はこの形式ではあり"XXhr YYmin"ませんか?
イブラヒムmahrir

@ibrahimmahrir挑戦は述べていますあなたのために便利である任意の簡単人間読み込み形式でコードを出力することができる
ルイスMendo

1
ああ、分かった!回答を編集して短くします。ありがとう!
イブラヒムmahrir

5

Retina 0.8.2、83バイト

\d+
$*
 (1+:)
 12$*1$1
+`1:
:60$*
(1*) :\1(1*)(1*) \2
$3
:(1{60})*(1*)
$#1hr $.2min

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

\d+
$*

入力を単項に変換します。

 (1+:)
 12$*1$1

停止時間に12時間を追加します。

+`1:
:60$*

時間に60を掛けて、分に加算します。

(1*) :\1(1*)(1*) \2
$3

停止時間から開始時間と休憩時間を引きます。

:(1{60})*(1*)
$#1hr $.2min

60で除算します(より退屈な出力形式のために5バイトを節約します)。



4

Python 3、161バイト

私はこれが最小に近くないことを知っていますが、ファイルを読み込みます:

for l in open('t'):
    l=l[:-1].split(':')
    m=-int(l[0])*60+int(l[1][:2])+(int(l[1][3:])*60+720+int(l[2][:2])-int(l[2][2:]))
    print(f'{m//60}hr {m-(m//60*60)}min')

これを行うためにタイムシートを一時停止する皮肉を感じています...

Python 2.7、133バイト

コメントの提案をありがとう!Python 2.7に切り替えると、整数除算がデフォルトになるため、さらに数バイト節約できます。

for l in open('t'):i,h,l=int,60,l[:-1].split(':');m=-i(l[0])*h+i(l[1][:2])+(i(l[1][3:])*h+720+i(l[2][:2])-i(l[2][2:]));print m/h,m%60

python3での同じアプローチは、printステートメントとデフォルトの浮動小数点除算のために135バイトです。

for l in open('t'):i,h,l=int,60,l[:-1].split(':');m=-i(l[0])*h+i(l[1][:2])+(i(l[1][3:])*h+720+i(l[2][:2])-i(l[2][2:]));print(m//h,m%60)

1
i=int先頭に配置し、3行目をm=-i(l[0])*60+i(l[1][:2])+(i(l[1][3:])*60+720+i(l[2][:2])-i(l[2][2:]))
DJMcMayhemに

@DJMcMayhemありがとうございます!私はそれらを単純化する方法を考えていました
ライアン

2
非常に素晴らしい最初の答え、プログラミングパズルとコードゴルフへようこそ!ゴルフを少し楽にするためにmap(int,l[:-1].split(':'))、STDINから入力を取得し、intへの複数の変換を使用してドロップし、インデントを;等で置き換えることですべてを1ライナーにまとめて、数バイト節約できます。さらに、他のユーザーがゴルファーの生活中に発見した、より巧妙なトリックについては、Pythonでのゴルフのヒントをご覧ください:)。
ミスターXcoder

1
さらに、OPは出力形式に関する制限が少ないようですので、print(m,m%60)十分だと思います。(またの使用注意m%60の代わりにm-(m//60*60)
ミスターXcoder

@ Mr.Xcoderありがとう!
ライアン

4

C、105バイト

a,b,c,d,e;f(){for(;scanf("%d:%d%d:%d%d",&a,&b,&c,&d,&e);)a=(12+c-a)*60+d-b-e,printf("%d:%d ",a/60,a%60);}

完全に簡単です。こちらからオンラインでお試しください。

ゴルフをしていない:

a, b, c, d, e; // start hours, minutes; end hours, minutes; break - all implicitly int
f() { // function - return type is implicitly int (unused)
    for(; scanf("%d:%d%d:%d%d", &a, &b, &c, &d, &e) ;) // until EOF is hit, read line by line
        a = (12 + c - a) * 60 + d - b - e, printf("%d:%d,", a / 60, a % 60); // calculate the minutes and store, then output separated: "h m"
}

a,b,c,d;f(e)代わりにa,b,c,d,e;f();printf("%d:%d ",a/60,a%60))a=(12+c-a)*60+d-b-e;}代わりに;)a=(12+c-a)*60+d-b-e,printf("%d:%d ",a/60,a%60);
シーリングキャット

4

Wolfram言語125119111バイト

i=Interpreter;j=IntegerPart;Row@{j[t=(i["Time"][#2<>"pm"]-i["Time"][#])[[1]]-#3/60],"hr ",j[60Mod[t,1]],"min"}&

ユーザー202729のおかげで8バイト節約

ロジックを簡単に理解できるように、ここでは略語は使用しません。

Row[{IntegerPart[
 t = (Interpreter["Time"][#2 <> "pm"] - 
      Interpreter["Time"][#])[[1]] - #3/60], "hr ",
IntegerPart[60 Mod[t,1]], "min"}] &["9:00", "4:12", 20]

6時間51分

Interpreter["Time"][#2 <> "pm"] 2番目のパラメーターの後に「pm」、つまりこの場合は「4:12 pm」が続く時刻として解釈され、TimeObject対応する午後4時12分を返します。

-Interpreter["Time"][# <> "am"])[[1]] - #3/60]#33番目のパラメーター、つまり20分です。マイナス記号は、シフト時間の終わりから昼食時間間隔を引きます。調整されたシフト終了時間、つまり、その人が昼休みを取らなかった場合に適用されるシフト終了時間を返します。

Interpreter["Time"][#] は、最初のパラメーター(この場合は「9:00」)を時刻として解釈し、TimeObject対応する午前9時を返します。

調整されたシフト時間の終了からシフトの開始を減算するtと、時間間隔が時間で表されます。 IntegerPart[t]勤務時間数を返します。 IntegerPart[60 Mod[t,1]], "min"}]作業時間の追加分を返します。


はい。ありがとう。初めてMod[x, 1]使用するのを見ます。
DavidC

この(削除された)ヒントから取られました。/実際、mod 1は負の数の小数部とは異なる動作をします。/ Floorに使用できますIntegerPartか?
user202729

Floorは、-6hr 52min私が使用したサンプル値の不可解な結果を返します 。時間(および明らかに分)の負の値が生成された理由を理解するために、これを調べる必要があります。
DavidC

3

JavaScript、83バイト 76バイト

s=>(r=s.match(/\d+/g),r=(r[2]-r[0]+12)*60-r[4]-r[1]+ +r[3],(r/60|0)+':'+r%60)

以下の解決策から内側の機能を取り除きました(私は何を考えていましたか?)出力形式も変更しました。

オンラインでお試しください!


OLD:JavaScript、112バイト 111バイト 110バイト

s=>(t=(h,m,a)=>(a?12+h:h)*60+m,r=s.match(/\d+/g),r=t(+r[2],r[3]-r[4],1)-t(r[0],+r[1]),`${r/60|0}hr ${r%60}min`)

説明:

メイン関数内で、特定の時間の分を計算するのに役立つ別のパラメーターを定義することから始めます。3番目のパラメーターが真実であれば、12時間を時間パラメーターに追加します。

(hours, minutes, addTwelve) =>
    (addTwelve? hours + 12: hours) * 60 + minutes

次に、我々は、いずれかによって、文字列を分割' 'または':'文字列内のすべての番号の配列が得られる文字列内の数字と一致します。

次に、前に定義した関数を使用して、終了時間と開始時間の差を計算し、昼食時間を減算します(必要に応じて文字列を数値に変換します)。

最後に、結果文字列を生成します。時間はの整数部でr/60、分はr%60です。

オンラインでお試しください!


@Jakob私は新しいcodegolfユーザーです。TIOを含め、ここでどのように動作するかはまだわかりません。また、私はこのコメントで javascriptを使用してこれにどのようにアプローチするのか尋ねましたが、誰も応答しませんでした。
イブラヒムmahrir

@Jakob TIOが修正されました。そして、私はNodeJSを使用していません。ブラウザのコンソールを使用しています。NodeJSはTIOによって追加されました。
イブラヒムmahrir

入力方法が合法であるかどうかはまだわかりません(この質問は残念ながら制限的です)が、チャイムをするにはより経験豊富なJSゴルファーが必要な場合があります。しかし、プログラムは複数の入力データをサポートする必要があることに注意してください。説明で非常に明確です。
ヤコブ

@Jakobより多くの日を入力として使用する必要がある場合、関数に配列を受け入れて使用させることができますmapa=>a.map(...)。回答に5バイトが追加されます。しかし、私はまだコメントに対するOP(または誰か)の応答を待っています。
イブラヒムmahrir

純粋なJavaScriptは標準入力またはファイルにアクセスできないため、GUIプロンプトを使用するデフォルトの方法を使用することをお勧めします。codegolf.meta.stackexchange.com
2459

3

Python 2、100バイト

for I in open('x'):x,y,z,w,l=map(int,I.replace(':',' ').split());d=60*(12+z-x)+w-y-l;print d/60,d%60

オンラインでお試しください!

OPの指示に従って、テキストファイルから複数の行を読み取る完全なプログラム。単一の行を解析するだけの関数では、さらに10バイト節約できます。


1
これは私の試みよりもずっと読みやすいです!
ライアン

3

Java 10、194 191バイト

u->{var s=new java.util.Scanner(System.in).useDelimiter("\\D");for(int i,a[]=new int[5];;i=(12+a[2]-a[0])*60+a[3]-a[1]-a[4],System.out.println(i/60+":"+i%60))for(i=0;i<5;)a[i++]=s.nextInt();}

I / OはJavaでは苦痛です。読み込む入力の次の行がない場合、異常終了します。こちらからオンラインでお試しください。

ゴルフをしていない:

u -> { // lambda taking a dummy input – we're not using it, but it saves a byte
var s = new java.util.Scanner(System.in).useDelimiter("\\D"); // we use this to read integers from standard input; the delimiter is any character that is not part of an integer
for(int i, a[] = new int[5]; ; // infinite loop; i will be used to loop through each line and to store the result in minutes between lines; a will hold the inputs
    i = (12 + a[2] - a[0]) * 60 + a[3] - a[1] - a[4], // after each line, calculate the result in minutes ...
    System.out.println(i / 60 + ":" + i % 60)) // ... and output the result in hours:minutes, followed by a newline
    for(i = 0; i < 5; ) // read the five integers on the current line ...
        a[i++] = s.nextInt(); // ... into the array
}


2

R、97バイト

s=matrix(strtoi(unlist(strsplit(scan(,""),':'))),5,,T)%*%c(-60,-1,60,1,-1);paste(12+s%/%60,s%%60)

オンラインでお試しください!

各行について "hours minutes"

  • JayCeのおかげで-16バイト!

私はa data.frameを使っていくつかのバイトを節約しようとしましたが、今のところうまくいきません。だがこの単純な変更は:)
JayCe


すごい!ありがとう:)
digEmAll
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.