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


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 /


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~":"&

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.


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.


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

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).

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)


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

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

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

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

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


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])

1

CJam, 50 bytes

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

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).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.