Thời gian sau một thời gian


15

Đối với thử thách này, chúng tôi đang viết thời gian theo mẫu sau: hh:mm:ss

Vài ví dụ:

12:34:08

06:05:30

23:59:00

Thách thức là xuất ra thời gian sau khi hết số giờ , phútgiây , với thời gian bắt đầu 00:00:00. Bạn có thể so sánh điều này với một bộ đếm thời gian bắt đầu lúc 00:00:00.

Dưới đây là một ví dụ về đầu vào (sử dụng STDIN ) và đầu ra:

Input: 1h20m5s
Output: 01:20:05

Input: 0h100m0s
Output: 01:40:00

Sau 24 giờ, bộ hẹn giờ tự đặt lại:

Input: 25h0m0s
Output: 01:00:00

Hình thức của đầu vào luôn giống nhau : XhYmZs, với Xgiờ, Yphút và Zgiây (giả sử rằng X, YZtoàn bộ số nguyên nhỏ hơn 100000 và không bao giờ âm)

Đây là , vì vậy số lượng byte ít nhất sẽ chiến thắng thử thách này


3
Chúng ta có thể viết các chức năng?
LegionMammal978

1
@ LegionMammal978, có
Adnan

"Giả sử X, Y và Z là toàn bộ số nguyên nhỏ hơn 99999 và không bao giờ âm" là 99999h99999m99999 là đầu vào hợp lệ?
Cruncher

@Cruncher, vâng, đó là một đầu vào hợp lệ
Adnan

99999 không ít hơn 99999.
Luke

Câu trả lời:



4

Ruby - 131 115 107 97 84 byte

Tôi vẫn đang chơi gôn.

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

Cảm ơn @Doorknob vì / \ w / inshead của / h | m | s /


Bạn có thể tách trên regex: gets.tr('ms',?h).split(?h)-> gets.split(/\w/).
Doorknob

@Doorknob Tôi vừa viết lại nó thành regexes nhưng của bạn thì ngắn hơn. Cảm ơn!
Peter Lenkefi

1
Tôi từ bỏ việc cố gắng cạnh tranh. Mma chỉ là quá dài dòng.
LegionMammal978

3
@ LegionMammal978 Không bao giờ bỏ cuộc;)
Peter Lenkefi

2

Toán học, 133 116 112 111 byte

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

2

Python 2, 138 126 byte

Bây giờ tôi đang sử dụng regex, vẫn còn khá lâu ..

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)

Đầu vào nên được trích dẫn.


2

C 149 112 byte

Kiểm tra nó ở đây

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);}

Tín dụng cho @Dennis để thoát khỏi nó rất nhiều.


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 byte, đọc từ STDIN)
Dennis

@Dennis cảm ơn, quên nó không phải là một đối số dòng lệnh. Điều duy nhất không làm việc với tôi là khai báo các biến trong danh sách đối số hàm; Tôi đã nhận được lỗi trình biên dịch với điều đó.
Chris Loonam

h,m,s;main()nên di động hơn. main(h,m,s)hoạt động với GCC ( liên kết )
Dennis

Được rồi cảm ơn. Giảm xuống còn 112.
Chris Loonam

m=s/60;h=m/60;? Sau này, bạn có thể thoát khỏi s+=quá.
ugoren

2

JavaScript 110 byte

Trong đó x là đầu vào

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

Tôi không nghĩ rằng đây là cách hiệu quả nhất

// 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 Byte

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

(được lưu dưới dạng ISO-8859-1)

Chỉ hoạt động trên PHP 5 vì splitchức năng không dùng nữa . Giả định rằng các thông báo không được hiển thị.

Làm thế nào nó hoạt động:

  • ¤—’¢được "[hm]"đảo ngược và một tên hằng hợp lệ, PHP sử dụng các hằng số không xác định làm chuỗi (lưu một ký tự cho dấu ngoặc kép)
  • ·Å–ÅŒ giống nhau cho "H:i:s"
  • Tất cả mọi thứ là một tuyên bố tiếng vang ngắn tay duy nhất. <?=x,yđầu ra x và y. Sử dụng !, kết quả của $sbài tập được chuyển đổi thành boolean và phủ định, sau đó được chuyển đổi thành chuỗi thành đầu ra.(string)false === ''
  • split("[hm]", "XhYmZs")chia chuỗi thành [X,Y,Zs]. Sau đó, 3600*X+60*Y+Zslà số giây. PHP chuyển đổi Zsthành số nguyên nhưZ
  • Chúng tôi trừ phần bù múi giờ date(Z), sử dụng kết quả này dưới dạng dấu thời gian và in phần thời gian của nó là "giờ: phút: giây". Trong UTC (offset 0), dấu thời gian 01970/01/01 00:00:00. Trừ phần bù múi giờ sẽ bình thường hóa ngày thành UTC mà không thay đổi múi giờ thực sự được sử dụng (điều này đã lưu 8 byte để đặt múi giờ).
  • Thuận tiện, 25 giờ sẽ có kết quả vào 01:00:00 (vào ngày hôm sau).

1

Tự động, 208 byte

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

Quá lâu. Kiểm tra:

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


1

Perl 5, 84 (83 byte + 1)

Sử dụng tràn các giây hoặc phút.

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

Kiểm tra

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

1

VBA ( 150 149 byte)

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
Có vẻ tốt. VBA có vẻ tuyệt vời cho nhiệm vụ này. Nếu bạn sử dụng msgboxlàm đầu ra, bạn có thể thay đổi thành a Subvà lưu 2 byte. Bạn cũng có thể chơi gôn tất cả các khoảng trắng không cần thiết xung quanh =và sau mỗi lần ,hạ gục nó vào khoảng 134.
JimmyJazzx

1

JavaScript, 97 byte

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`:`)

Bạn có thể biến điều này thành một Fiddle không? Dường như không làm việc cho tôi. Tôi nhận đượcInvalid left-hand side in assignment
Gust van de Wal

@GustvandeWal Cho đến nay FireFox là trình duyệt duy nhất hỗ trợ phá hủy bài tập , vì vậy một điều khó hiểu sẽ không giúp ích gì.
Mwr247

1

PowerShell, 84 byte

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

Chia đầu vào dòng lệnh thành một chuỗi các chuỗi dựa trên biểu thức chính quy [hms]. Sử dụng chức năng tích hợp dài .AddSeconds()để thêm (giờ * 3600, phút * 60 và giây) vào (date 0)a / k / a Monday, January 1, 0001, 12:00:00 AM, sau đó cung cấp chức năng đó -fvới định dạng HH:mm:sssẽ tự động chuyển đổi sang định dạng đồng hồ 24 giờ và xuất ra.

Thí dụ:

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

1

Lua, 104 byte

h,m,s=io.read():match"(%d+)h(%d+)m(%d+)"m=m+s/60;print(("%02d:%02d:%02d"):format((h+m/60)%24,m%60,s%60))


1

Con trăn 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]))

Phiên bản bị đánh cắp:

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 byte

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

1

GNU sed + ngày, 51 byte

(bao gồm +1 byte cho -rcờ)

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

Điều này chỉ đơn giản là datethêm số giờ, phút và giây được chỉ định vào 00:00:00(hôm nay) và hiển thị phần thời gian. Khuyến nghị đặt TZ=UTChoặc tránh chạy chương trình xung quanh thay đổi theo giờ địa phương (ví dụ: tiết kiệm ánh sáng ban ngày).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.