一段时间后的时间


15

为了应对这一挑战,我们以以下形式编写时间: hh:mm:ss

一些例子:

12:34:08

06:05:30

23:59:00

挑战是在经过数小时数分钟数秒之后输出时间,并将其作为开始时间00:00:00。您可以将其与从开始的计时器进行比较00:00:00

这是输入(使用STDIN)和输出的示例:

Input: 1h20m5s
Output: 01:20:05

Input: 0h100m0s
Output: 01:40:00

24小时后,计时器将自行重置:

Input: 25h0m0s
Output: 01:00:00

输入的形式始终相同:XhYmZs,带有X小时,Y分钟和Z秒(假设XY并且Z是小于100000的整数,并且永远不会为负)

这是,因此最少的字节数将赢得这一挑战


3
我们可以编写函数吗?
LegionMammal978

1
@ LegionMammal978,是的
Adnan

“假设X,Y和Z是小于99999的整数,并且永不为负”是99999h99999m99999s有效输入吗?
Cruncher

@Cruncher,是的,这是有效输入
Adnan

99999不小于99999。–
路加福音

Answers:



4

红宝石- 131 115 107 97 84个字节

我还在打高尔夫球。

h,m,s=gets.split(/\w/).map &:to_i;$><<"#{(h+m/60+s/3600)%24}:#{(m+s/60)%60}:#{s%60}"

感谢@Doorknob为/ h | m | s /的/ \ w /插入


您可以分割正则表达式:gets.tr('ms',?h).split(?h)-> gets.split(/\w/)
门把手

@Doorknob我刚刚将其重写为正则表达式,但是您的较短。谢谢!
Peter Lenkefi 2015年

1
我放弃尝试竞争。Mma太冗长了。
LegionMammal978

3
@ LegionMammal978永不放弃;)
Peter Lenkefi 2015年

2

数学,133个 116 112 111字节

IntegerString[(f=FromDigits)[f/@StringSplit[#,_?LetterQ],60]~Mod~86400~IntegerDigits~60,10,2]~StringRiffle~":"&

2

Python 2中,138个 126字节

现在我正在使用正则表达式,尽管时间仍然很长。

import re
a=input();b=map(int,re.split('h|m|s',a)[:-1])
s=b[0]*3600+b[1]*60+b[2]
print(':%02d'*3)[1:]%(s/3600%24,s/60%60,s%60)

输入应使用引号。


2

C 149 112字节

在这里测试

main(h,m,s){scanf("%dh%dm%ds",&h,&m,&s);s+=h*3600+m*60;h=s/3600;m=s/60;printf("%02d:%02d:%02d",h%24,m%60,s%60);}

感谢@Dennis摆脱了很多麻烦。


2
main(h,m,s){scanf("%dh%dm%ds",&h,&m,&s);s+=h*3600+m*60;m=s/60;h=m/60;printf("%02d:%02d:%02d",h%24,m%60,s%60);}(110字节,从STDIN读取)
丹尼斯

@Dennis谢谢,忘记了它不必是命令行参数。唯一对我不起作用的是在函数参数列表中声明变量。我正在与此有关的编译器错误。
克里斯·洛南

h,m,s;main()应该更便携。main(h,m,s)与GCC合作(链接
丹尼斯

好,谢谢。得到它下降到112
克里斯Loonam

m=s/60;h=m/60;?在此之后,您也可以摆脱s+=
ugoren 2015年

2

JavaScript 110字节

其中x是输入

x=x.split(/[hms]/).map(Number);for(z=2;z--;)x[z+1]-60&&(x[z]+=~~(x[z+1]/60));y=x[0]%24+":"+x[1]%60+":"+x[2]%60

我认为这不是最有效的方法

// How it works:
x=x.split(/[hms]/).map(Number);                // splitting the string into an array of numbers
for(z=2;z--;)x[z+1]-60&&(x[z]+=~~(x[z+1]/60)); // shifting excess of seconds to minutes, and then minutes to hours
y=x[0]%24+":"+x[1]%60+":"+x[2]%60              // putting them all together

2

PHP,80 88 93 字节数

<?=!$s=split(~¤—’¢,fgets(STDIN)),date(~·Å–ÅŒ,$s[0]*3600+$s[1]*60+$s[2]-date(Z));

(保存为ISO-8859-1)

由于split功能已弃用,因此仅在PHP 5上有效。假设未显示通知。

怎么运行的:

  • ¤—’¢"[hm]"反转并且是有效的常量名称,PHP使用未定义的常量作为字符串(为引号节省一个字符)
  • ·Å–ÅŒ 是相同的 "H:i:s"
  • 一切都是一条简短的echo语句。<?=x,y输出x和y。使用!$s赋值的结果将转换为布尔值并取反,然后转换为字符串以输出。(string)false === ''
  • split("[hm]", "XhYmZs")将字符串拆分为[X,Y,Zs]。然后,3600*X+60*Y+Zs是秒数。PHP将转换Zs为整数Z
  • 我们减去时区偏移量date(Z),将此结果用作时间戳,并将其时间部分打印为“ hours:minutes:seconds”。在UTC(偏移量0)中,时间戳01970/01/01 00:00:00。减去时区偏移量会将日期标准化为UTC,而不更改实际使用的时区(这节省了8个字节用于设置时区)。
  • 方便地,25小时将导致第二天的01:00:00。

1

AutoIt,208个字节

Func _($0)
$1=StringRegExp($0,"[0-9]+",3)
For $2=2 To 1 Step -1
If $1[$2]>59 Then
$1[$2]=Mod($1[$2],59)-1
$1[$2-1]+=1
EndIf
Next
Return StringFormat("%02u:%02u:%02u",$1[0]-($1[0]>23?24:0),$1[1],$1[2])
EndFunc

太长。测试:

ConsoleWrite(_("1h20m5s") & @LF)
ConsoleWrite(_("0h100m0s") & @LF)
ConsoleWrite(_("25h0m0s") & @LF)


1

Perl 5,84(83字节+1)

使用秒或分钟的溢出。

($h,$m,$s)=split/\D/;$h+=($m+=$s/60)/60;printf"%0.2d:%0.2d:%0.2d",$h%24,$m%60,$s%60

测试

$ echo 35:124:224s |perl -n 61736-time-after-some-time.pl
13:07:44

1

VBA(150 149个字节)

Function t(s)
x = Split(Replace(Replace(Replace(s, "s", ""), "m", " "), "h", " "))
t = Format(TimeSerial(x(0), x(1), x(2)), "HH:MM:SS")
End Function

1
看起来不错。VBA似乎很适合此任务。如果msgbox用作输出,则可以更改为a Sub并保存2个字节。您还可以打高尔夫球并消除所有不必要的空白,=然后,将其击倒到134附近
。– JimmyJazzx

1

JavaScript,97个字节

x=>([h,m,s]=x.match(/\d+/g),[(+h+m/60|0)%24,(+m+s/60|0)%60,s%=60].map(a=>(a>9?'':'0')+a).join`:`)

你能把它变成小提琴吗?似乎不适合我。我知道了Invalid left-hand side in assignment
古斯塔·范·德·沃尔

@GustvandeWal到目前为止,FireFox是唯一支持解构分配的浏览器,因此,很麻烦。
Mwr247

1

PowerShell,84字节

$a=$args-split'[hms]';"{0:HH:mm:ss}"-f(date 0).AddSeconds(3600*$a[0]+60*$a[1]+$a[2])

根据[hms]正则表达式将命令行输入拆分为字符串数组。使用详细的内置函数.AddSeconds()将(小时* 3600,分钟* 60和秒)添加到(date 0)a / k / a Monday, January 1, 0001, 12:00:00 AM,然后-f使用格式化将其输入HH:mm:ss将其输入,将其自动转换为24小时制并输出。

例:

PS C:\Tools\Scripts\golfing> .\time-after-some-time.ps1 25h100m0s
02:40:00



1

Python 3、158

import re
e=input()
b=[];p=0
for s in re.split('\D',e)[:3][::-1]:c,a=divmod(int(s),60);b+=[a+p];p=c
b[2]=(b[2]+p)%24;f=':%02d'*3;print(f[1:]%(b[2],b[1],b[0]))

非高尔夫版本:

import re
def timer(elapsed):
    base=[]
    previous_carry=0
    for section in re.split('\D+',elapsed)[:3][::-1]:
        carry,amount=divmod(int(section),60)
        base+=[amount+previous_carry]
        previous_carry=carry
    base[2]=(base[2]+previous_carry)%24
    format_str = ':%02d'*3
    return format_str[1:]%(base[2],base[1],base[0])

1

CJam,50个字节

0[l"hms"Ser~][24 60 60].{md}(;+2/::+{"%02d"e%}%':*

1

GNU sed + date,51个字节

(包括+1字节的-r标志)

#!/bin/sed -rf
s/(.*h)(.*m)(.*s)/date -d"0:0 \1our\2in\3ec" +%T/e

只需将date指定的小时数,分钟数和秒数添加到00:00:00(今天)并显示时间部分。建议设置TZ=UTC或避免在本地时间更改时运行程序(例如,夏令时)。

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.