计算时间表


14

时间表

在工作场所,您通常必须填写时间表。此任务是编写代码来帮助实现此目的。

输入值

在稍微不标准的12小时时钟中两次,表示一天的开始和结束,以空格隔开。第三个数字代表午餐时间。例如

9:14 5:12 30

这意味着您在上午9:14开始工作,在下午5:12完成工作,花了30分钟的午餐时间。

您可以假设

  • 第一列中的任何时间是从00:00(午夜)开始至下午1点(但不包括下午1点),第二列中的任何时间最早是从1pm直到11:59 pm。
  • 午休时间不超过工作日!

输入格式必须与给定的示例中相同。

任务

您的代码应读取这些三元组的文件(或标准输入),并且对于每个输出,您需要工作多长时间。此输出应指示小时数。对于上面的示例,这是:

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
@Shaggy解析输入格式至少对我来说是最大的挑战,因为您不能假设字符位置,因为小时可能是一个或两个字符……
Ryan

代码是否必须读取几行?还是读一行就足够了吗?
路易斯·门多

1
是的,代码必须接受多行。
Anush

5
@ mbomb007您可以拒绝投票,但不喜欢输入格式不是VTC的理由。
Okx

Answers:



5

视网膜0.8.2字节

\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

Divmod减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的相同方法是135个字节,这是因为有print语句,并且默认为float除法:

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在开头放置第三行并将其更改为m=-i(l[0])*60+i(l[1][:2])+(i(l[1][3:])*60+720+i(l[2][:2])-i(l[2][2:]))
James James

@DJMcMayhem谢谢!我想尝试一种简化这些方法的方法
瑞安

2
非常好的第一答案,欢迎来到“编程拼图和代码高尔夫”!为了帮助打高尔夫球,您可能可以从STDIN接收输入,使用map(int,l[:-1].split(':'))或将多次转换丢弃为int,通过将缩进替换为;etc等将所有内容折叠为一个直线,以节省几个字节。此外,您可以访问Python高尔夫技巧,以获取其他用户在高尔夫爱好者生活中发现的更多巧妙技巧:)。
Xcoder先生18年

1
另外,OP似乎对输出格式的限制不太严格,所以我认为print(m,m%60)就足够了。(还请注意使用m%60代替m-(m//60*60)
Xcoder先生,18年

@ 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);
ceilingcat

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"] 将第二个参数后跟“ pm”(在这种情况下为“ 4:12 pm”)解释为时间,返回一个 TimeObject对应于4:12 pm的值。

-Interpreter["Time"][# <> "am"])[[1]] - #3/60]#3是第三个参数,即20分钟。减号从轮班时间结束时减去午餐时间间隔。它返回调整后的轮班时间结束,即,如果该人没有午休时间,则将适用的轮班结束时间。

Interpreter["Time"][#] 将第一个参数(在这种情况下为“ 9:00”)解释为时间,并返回 TimeObject对应于上午9:00的参数。

从调整的换挡时间结束时减去换挡开始时间t,该时间间隔以小时表示。 IntegerPart[t]返回完整的工作小时数。 IntegerPart[60 Mod[t,1]], "min"}]返回工作的额外分钟数。


是。谢谢。我第一次看到Mod[x, 1]用过的。
DavidC

摘自此(已删除)提示。/实际上,对于负数,mod 1的行为与小数部分不同。/可以Floor用于IntegerPart
user202729

-6hr 52min对于我使用的样本值,Floor向我返回了一个莫名其妙的结果 。我需要对此进行调查,以了解为什么会产生几个小时(显​​然是几分钟)的负值。
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`)

说明:

在主函数内部,我们首先定义另一个函数,该函数将帮助我们计算给定时间的分钟数,如果第三个参数为true,则将小时数增加12小时:

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

接下来,我们通过分割字符串或者' '':'匹配中的数字,从而得到字符串中所有数字的数组。

然后,使用先前定义的函数(需要时将字符串转换为数字)来计算结束时间和开始时间之间的差以及减去午餐时间。

最后,我们生成结果字符串:hours是的整数部分,r/60minutes是r%60

在线尝试!


@Jakob我是codegolf的新用户。我仍然不知道这里的情况如何,包括TIO。我也曾在此评论中问过,我将如何使用javascript处理此问题,但没有人回应。
易卜拉欣·莫里尔

@Jakob TIO已修复。而且我没有使用NodeJS,而是使用了浏览器的控制台。TJS添加了NodeJS。
易卜拉欣·莫里尔

仍然不确定输入法是否合法(不幸的是,这个问题是限制性的),但是我们可能需要经验更丰富的JS高尔夫球手来插手。但是还要注意,程序需要支持多天的输入数据-不幸的是,这并没有在描述中非常清楚。
Jakob

@Jakob如果应该用更多的时间作为输入,我可以使函数接受数组并使用mapa=>a.map(...)。它将为我的答案增加5个字节。但我仍在等待OP(或任何人)对我的评论的回应。
易卜拉欣·莫里尔

由于纯JavaScript无法访问标准输入文件,因此我建议您使用使用GUI提示符的默认方法:codegolf.meta.stackexchange.com/a/2459/79343
OOBalance

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
}


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.