Waktu setelah beberapa waktu

15

Untuk tantangan ini, kami menulis waktu dalam bentuk berikut: hh:mm:ss

Beberapa contoh:

12:34:08

06:05:30

23:59:00

Tantangannya adalah untuk mengeluarkan waktu setelah jumlah jam , menit dan detik berlalu, dengan waktu mulai 00:00:00. Anda dapat membandingkan ini dengan timer yang dimulai pada 00:00:00.

Berikut adalah contoh input (menggunakan STDIN ) dan output:

Input: 1h20m5s
Output: 01:20:05

Input: 0h100m0s
Output: 01:40:00

Setelah 24 jam, timer akan mereset sendiri:

Input: 25h0m0s
Output: 01:00:00

Bentuk input selalu sama:, XhYmZsdengan Xjam, Ymenit dan Zdetik (anggap saja X, Ydan Zbilangan bulat utuh kurang dari 100000 dan tidak pernah negatif)

Ini adalah , jadi jumlah byte yang paling sedikit memenangkan tantangan ini

Adnan
sumber
3
Bisakah kita menulis fungsi?
LegionMammal978
1
@ LegionMammal978, ya
Adnan
"berasumsi bahwa X, Y dan Z adalah bilangan bulat utuh kurang dari 99999 dan tidak pernah negatif" apakah 99999h99999m99999s merupakan input yang valid?
Cruncher
@Cruncher, ya, itu adalah input yang valid
Adnan
99999 tidak kurang dari 99999.
Lukas

Jawaban:

4

Ruby - 131 115 107 97 84 byte

Saya masih bermain golf.

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

Terima kasih atas @ Doorknob untuk / \ w / inshead dari / h | m | s /

Peter Lenkefi
sumber
Anda dapat membagi pada regex: gets.tr('ms',?h).split(?h)-> gets.split(/\w/).
Gagang Pintu
@ Doorknob Saya baru saja menulis ulang untuk regex tetapi milik Anda lebih pendek. Terima kasih!
Peter Lenkefi
1
Saya menyerah untuk mencoba bersaing. Mma terlalu bertele-tele.
LegionMammal978
3
@ LegionMammal978 Jangan pernah menyerah;)
Peter Lenkefi
2

Mathematica, 133 116 112 111 byte

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

Python 2, 138 126 Bytes

Sekarang saya menggunakan regex, masih cukup lama ..

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)

Masukan harus dalam tanda kutip.

Kade
sumber
2

C 149 112 byte

Uji di sini

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

Kredit ke @ Dennis untuk menyingkirkan banyak itu.

Chris Loonam
sumber
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, dibaca dari STDIN)
Dennis
@ Dennis terima kasih, lupa itu tidak harus menjadi argumen baris perintah. Satu-satunya hal yang tidak berfungsi untuk saya adalah deklarasi variabel dalam daftar argumen fungsi; Saya mendapatkan kesalahan kompilator dengan itu.
Chris Loonam
h,m,s;main()harus lebih portabel. main(h,m,s)bekerja dengan GCC ( tautan )
Dennis
Ok terima kasih. Turun ke 112.
Chris Loonam
m=s/60;h=m/60;? Setelah ini, Anda juga bisa menyingkirkannya s+=.
ugoren
2

JavaScript 110 byte

Di mana x adalah input

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

Saya rasa ini bukan cara yang paling efisien

// 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
Gust van de Wal
sumber
2

PHP, 80 88 93 Bytes

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

(disimpan sebagai ISO-8859-1)

Hanya splitberfungsi di PHP 5 karena fungsinya yang sudah tidak digunakan lagi . Menganggap bahwa pemberitahuan tidak ditampilkan.

Bagaimana itu bekerja:

  • ¤—’¢adalah "[hm]"terbalik dan nama konstan valid, PHP menggunakan konstanta terdefinisi sebagai string (menghemat satu karakter untuk tanda kutip)
  • ·Å–ÅŒ adalah sama untuk "H:i:s"
  • Semuanya adalah satu pernyataan gema tangan pendek. <?=x,youtput x dan y. Dengan menggunakan !, hasil $spenugasan akan dikonversi ke boolean dan dinegasikan, kemudian dikonversi ke string ke output.(string)false === ''
  • split("[hm]", "XhYmZs")membagi string menjadi [X,Y,Zs]. Lalu, 3600*X+60*Y+Zsadalah jumlah detik. PHP mengonversi Zsmenjadi integer sebagaiZ
  • Kami mengurangi offset zona waktu date(Z), menggunakan hasil ini sebagai cap waktu dan mencetak bagian waktunya sebagai "jam: menit: detik". Di UTC (offset 0), cap waktu 0adalah 1970/01/01 00:00:00. Mengurangi zona waktu akan menormalkan tanggal sebagai UTC tanpa mengubah zona waktu yang sebenarnya digunakan (ini menghemat 8 byte untuk pengaturan zona waktu).
  • Dengan mudah, 25 jam akan menghasilkan 01:00:00 (pada hari berikutnya).
Fabian Schmengler
sumber
1

AutoIt, 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

Terlalu panjang. Uji:

ConsoleWrite(_("1h20m5s") & @LF)
ConsoleWrite(_("0h100m0s") & @LF)
ConsoleWrite(_("25h0m0s") & @LF)
mınxomaτ
sumber
1

Pyth, 40 byte

j\:%L"%02d">3j+%ivM:z"\d+"1K60 86400^KTK

Saya masih belajar. Coba di sini!

Lynn
sumber
1

Perl 5, 84 (83 Bytes + 1)

Menggunakan luapan detik atau menit.

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

Uji

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

VBA ( 150 149 bytes)

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
pengguna3819867
sumber
1
Kelihatan bagus. VBA sepertinya bagus untuk tugas ini. Jika Anda menggunakan msgboxsebagai output, Anda dapat mengubah ke Subdan menyimpan 2 byte. Anda juga dapat =,
bermain
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`:`)
Mwr247
sumber
Bisakah Anda mengubahnya menjadi Fiddle? Sepertinya tidak bekerja untuk saya. Saya mengertiInvalid left-hand side in assignment
Gust van de Wal
@GustvandeWal So far FireFox is the only browser to support destructuring assignment, so a fiddle won't help unfortunately.
Mwr247
1

PowerShell, 84 Bytes

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

Splits the command-line input into an array of strings based on the [hms] regex. Uses the verbose built-in function .AddSeconds() to add (hours*3600, minutes*60, and seconds) to (date 0) a/k/a Monday, January 1, 0001, 12:00:00 AM, then feeds that into -f with formatting HH:mm:ss which will automatically convert it to 24-hour clock format and output it.

Example:

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

Lua, 104 bytes

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))
Henrik Ilgen
sumber
1

VB.NET (107 bytes)

First submission for code golf so I'm guessing character count => byte count?

MsgBox(TimeSpan.Zero.Add(TimeSpan.Parse(Regex.Replace(InputBox("XhYmZs"),"[hm]",":").Trim("s"))).ToString)
вʀaᴎᴅᴏƞ вєнᴎєƞ
sumber
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]))

Ungolfed version:

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])
Morgan Thrapp
sumber
1

CJam, 50 bytes

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

GNU sed + date, 51 byte

(termasuk +1 byte untuk -rflag)

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

Ini cukup datedengan menambahkan jumlah jam, menit, dan detik yang ditentukan ke 00:00:00(hari ini) dan menampilkan bagian waktu. Disarankan untuk mengatur TZ=UTCatau menghindari menjalankan program di sekitar perubahan waktu setempat (mis. Penghematan siang hari).

Toby Speight
sumber