Czas po jakimś czasie

15

Do tego wyzwania piszemy czas w następującej formie: hh:mm:ss

Kilka przykładów:

12:34:08

06:05:30

23:59:00

Wyzwanie polega na wyprowadzeniu czasu po upływie godzin , minut i sekund jako początkowego czasu 00:00:00. Możesz to porównać z timerem, który zaczął się od 00:00:00.

Oto przykład danych wejściowych (przy użyciu STDIN ) i danych wyjściowych:

Input: 1h20m5s
Output: 01:20:05

Input: 0h100m0s
Output: 01:40:00

Po 24 godzinach licznik resetuje się sam:

Input: 25h0m0s
Output: 01:00:00

Formularz wejścia jest zawsze taka sama: XhYmZsz Xgodzinach, Yminutach i Zsekundach (zakładamy, że X, Yi Zsą liczbami całkowitymi mniej niż 100.000 i nie ujemna)

To jest , więc najmniejsza ilość bajtów wygrywa to wyzwanie

Adnan
źródło
3
Czy możemy pisać funkcje?
LegionMammal978,
1
@ LegionMammal978, tak
Adnan
„Załóżmy, że X, Y i Z są liczbami całkowitymi mniejszymi niż 99999 i nigdy nie są ujemne” Czy 99999h99999m99999s jest prawidłowym wejściem?
Cruncher
@Cruncher, tak, to jest poprawny wpis
Adnan
99999 to nie mniej niż 99999.
Łukasz

Odpowiedzi:

4

Rubinowy - 131 115 107 97 84 bajtów

Nadal gram w golfa.

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

Dzięki za @Doorknob za / \ w / inshead of / h | m | s /

Peter Lenkefi
źródło
Możesz podzielić na regex: gets.tr('ms',?h).split(?h)-> gets.split(/\w/).
Klamka
@Doorknob Właśnie przepisałem go na regexy, ale twój jest krótszy. Dzięki!
Peter Lenkefi
1
Rezygnuję z próby konkurowania. Mma jest po prostu zbyt gadatliwa.
LegionMammal978,
3
@ LegionMammal978 Nigdy się nie poddawaj;)
Peter Lenkefi
2

Mathematica, 133 116 112 111 bajtów

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

Python 2, 138 126 bajtów

Teraz używam wyrażenia regularnego, choć wciąż dość długo ...

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)

Dane wejściowe powinny być w cudzysłowach.

Kade
źródło
2

do 149 112 bajtów

Sprawdź to tutaj

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

Podziękowania dla @Dennis za pozbycie się go dużo.

Chris Loonam
źródło
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 bajtów, odczyt ze STDIN)
Dennis,
@Dennis dzięki, zapomniałem, że nie musiał to być argument wiersza poleceń. Jedyną rzeczą, która nie działała dla mnie, była deklaracja zmiennych na liście argumentów funkcji; Z tego powodu pojawiały się błędy kompilatora.
Chris Loonam,
h,m,s;main()powinien być bardziej przenośny. main(h,m,s)współpracuje z GCC ( link )
Dennis,
Ok dzięki.
Zrobiłem
m=s/60;h=m/60;? Po tym możesz się też pozbyć s+=.
ugoren
2

JavaScript 110 bajtów

Gdzie x jest wejściem

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

Nie sądzę, że jest to najbardziej efektywny sposób

// 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
źródło
2

PHP, 80 88 93 Bajty

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

(zapisany jako ISO-8859-1)

Działa tylko na PHP 5 z powodu przestarzałej splitfunkcji. Zakłada, że ​​powiadomienia nie są wyświetlane.

Jak to działa:

  • ¤—’¢jest "[hm]"odwrócony i jest prawidłową nazwą stałą, PHP używa niezdefiniowanych stałych jako łańcucha (zapisuje jeden znak dla cudzysłowów)
  • ·Å–ÅŒ jest taki sam dla "H:i:s"
  • Wszystko to jedno krótkie echo. <?=x,ywyjścia x i y. Używając !, wynik $sprzypisania jest konwertowany na wartość logiczną i negowany, a następnie konwertowany na ciąg znaków na wyjście.(string)false === ''
  • split("[hm]", "XhYmZs")dzieli ciąg na [X,Y,Zs]. Zatem 3600*X+60*Y+Zsjest liczbą sekund. PHP konwertuje Zsna liczbę całkowitą jakoZ
  • Odejmujemy przesunięcie strefy czasowej date(Z), wykorzystujemy ten wynik jako znacznik czasu i wypisujemy jego część czasu jako „godziny: minuty: sekundy”. W UTC (przesunięcie 0) znacznik czasu 0to 1970/01/01 00:00:00. Odjęcie przesunięcia strefy czasowej normalizuje datę jako UTC bez zmiany faktycznie używanej strefy czasowej (dzięki temu zaoszczędzono 8 bajtów na ustawienie strefy czasowej).
  • Dogodnie, 25 godzin da 01:00:00 (następnego dnia).
Fabian Schmengler
źródło
1

AutoIt, 208 bajtów

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

Za długo. Test:

ConsoleWrite(_("1h20m5s") & @LF)
ConsoleWrite(_("0h100m0s") & @LF)
ConsoleWrite(_("25h0m0s") & @LF)
mınxomaτ
źródło
1

Perl 5, 84 (83 bajtów + 1)

Wykorzystuje przepełnienie sekund lub minut.

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

Test

$ echo 35:124:224s |perl -n 61736-time-after-some-time.pl
13:07:44
LukStorms
źródło
1

VBA ( 150 149 bajtów)

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
użytkownik3819867
źródło
1
Wygląda dobrze. VBA wydaje się świetny do tego zadania. Jeśli użyjesz msgboxjako wyjścia, możesz zmienić na a Subi zapisać 2 bajty. Możesz także =,
odegrać w
1

JavaScript, 97 bajtów

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
źródło
Czy potrafisz zamienić to w skrzypce? Wydaje mi się, że to nie działa. RozumiemInvalid left-hand side in assignment
Gust van de Wal
@GustvandeWal Do tej pory FireFox jest jedyną przeglądarką, która obsługuje przypisywanie destrukcji , więc skrzypce niestety nie pomogą.
Mwr247,
1

PowerShell, 84 bajtów

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

Dzieli dane z wiersza poleceń na tablicę ciągów znaków opartych na [hms]wyrażeniu regularnym. Używa pełnej wbudowanej funkcji, .AddSeconds()aby dodać (godziny * 3600, minuty * 60 i sekundy) do (date 0)/ k / a Monday, January 1, 0001, 12:00:00 AM, a następnie przekazuje to do -fformatowaniaHH:mm:ss który automatycznie przekonwertuje go na format 24-godzinny i wyśle ​​go.

Przykład:

PS C:\Tools\Scripts\golfing> .\time-after-some-time.ps1 25h100m0s
02:40:00
AdmBorkBork
źródło
1

Lua, 104 bajty

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
źródło
1

VB.NET (107 bajtów)

Pierwsze zgłoszenie do kodu golfa, więc zgaduję liczbę znaków => liczbę bajtów?

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

Wersja bez golfa:

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
źródło
1

CJam, 50 bajtów

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

GNU sed + data, 51 bajtów

(w tym +1 bajt na -rflagę)

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

To po prostu datedodaje określoną liczbę godzin, minut i sekund do 00:00:00(dzisiaj) i wyświetla część czasu. Zalecane, aby ustawić TZ=UTClub unikać uruchamiania programu wokół zmiany czasu lokalnego (np. Czas letni).

Toby Speight
źródło