Die Zeit nach einiger Zeit

15

Für diese Herausforderung schreiben wir die Zeit in der folgenden Form: hh:mm:ss

Einige Beispiele:

12:34:08

06:05:30

23:59:00

Die Herausforderung besteht darin, die Zeit nach Ablauf von Stunden , Minuten und Sekunden als Startzeit auszugeben 00:00:00. Sie können dies mit einem Timer vergleichen, der um begann 00:00:00.

Hier ist ein Beispiel für Eingänge (mit STDIN ) und Ausgänge:

Input: 1h20m5s
Output: 01:20:05

Input: 0h100m0s
Output: 01:40:00

Nach 24 Stunden setzt sich der Timer zurück:

Input: 25h0m0s
Output: 01:00:00

Die Form der Eingabe ist immer gleich: XhYmZsmit XStunden, YMinuten und ZSekunden (davon ausgehen , dass X, Yund Zganze Zahlen sind weniger als 100000 und nie negativ)

Das ist , also gewinnt die geringste Anzahl von Bytes diese Herausforderung

Adnan
quelle
3
Können wir Funktionen schreiben?
LegionMammal978
1
@ LegionMammal978, ja
Adnan
"Angenommen, X, Y und Z sind ganze Zahlen kleiner als 99999 und niemals negativ" ist 99999h99999m99999s eine gültige Eingabe?
Cruncher
@ Cruncher, ja, das ist eine gültige Eingabe
Adnan
99999 ist nicht weniger als 99999.
Luke

Antworten:

4

Ruby - 131 115 107 97 84 Bytes

Ich spiele immer noch Golf.

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

Vielen Dank für @Doorknob für / \ w / inshead von / h | m | s /

Peter Lenkefi
quelle
Sie können auf einer Regex teilen: gets.tr('ms',?h).split(?h)-> gets.split(/\w/).
Türknauf
@Doorknob Ich habe es gerade in reguläre Ausdrücke umgeschrieben, aber deine ist kürzer. Vielen Dank!
Peter Lenkefi
1
Ich gebe es auf zu versuchen, zu konkurrieren. Mma ist einfach zu wortreich.
LegionMammal978
3
@ LegionMammal978 Gib niemals auf;)
Peter Lenkefi
2

Mathematica, 133 116 112 111 Bytes

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

Python 2, 138 126 Bytes

Jetzt verwende ich Regex, aber immer noch ziemlich lange ..

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)

Die Eingabe sollte in Anführungszeichen erfolgen.

Kade
quelle
2

C 149 112 Bytes

Teste es hier

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

Dank an @Dennis, der viel davon losgeworden ist.

Chris Loonam
quelle
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 Bytes, liest aus STDIN)
Dennis
@ Tennis danke, vergessen, es musste kein Kommandozeilenargument sein. Das einzige, was bei mir nicht funktionierte, war die Deklaration der Variablen in der Funktionsargumentliste; Ich habe dabei Compilerfehler bekommen.
Chris Loonam
h,m,s;main()sollte tragbarer sein. main(h,m,s)arbeitet mit GCC ( Link )
Dennis
OK danke. Auf 112 gekommen.
Chris Loonam
m=s/60;h=m/60;? Danach können Sie das auch loswerden s+=.
Ugoren
2

JavaScript 110 Bytes

Wobei x die Eingabe ist

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

Ich denke nicht, dass dies der effizienteste Weg ist

// 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
quelle
2

PHP, 80 88 93 Bytes

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

(gespeichert als ISO-8859-1)

Funktioniert nur unter PHP 5 wegen veralteter splitFunktion. Es wird davon ausgegangen, dass keine Benachrichtigungen angezeigt werden.

Wie es funktioniert:

  • ¤—’¢ist "[hm]"invertiert und ein gültiger Konstantenname, PHP verwendet undefinierte Konstanten als String (speichert ein Zeichen für die Anführungszeichen)
  • ·Å–ÅŒ ist das gleiche für "H:i:s"
  • Alles ist eine kurze Echoaussage. <?=x,ygibt x und y aus. Mit !wird das Ergebnis der $sZuweisung in einen Booleschen Wert konvertiert und negiert. Anschließend wird es in einen String für die Ausgabe konvertiert.(string)false === ''
  • split("[hm]", "XhYmZs")teilt die Zeichenfolge auf [X,Y,Zs]. Dann 3600*X+60*Y+Zsist die Anzahl der Sekunden. PHP konvertiert Zsin Integer alsZ
  • Wir subtrahieren den Zeitzonenoffset date(Z), verwenden dieses Ergebnis als Zeitstempel und drucken seinen Zeitanteil als "Stunden: Minuten: Sekunden". In UTC (Offset 0), der Zeitstempel 0ist 1970/01/01 00:00:00. Durch das Subtrahieren des Zeitzonenversatzes wird das Datum als UTC normalisiert, ohne dass die tatsächlich verwendete Zeitzone geändert wird (dies sparte 8 Byte für die Einstellung der Zeitzone).
  • Günstigerweise ergeben 25 Stunden 01:00:00 (am nächsten Tag).
Fabian Schmengler
quelle
1

AutoIt, 208 Bytes

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

Zu lang. Prüfung:

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

Perl 5, 84 (83 Bytes + 1)

Verwendet den Überlauf von Sekunden oder Minuten.

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

Prüfung

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

VBA ( 150 bis 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
user3819867
quelle
1
Sieht gut aus. VBA scheint für diese Aufgabe großartig zu sein. Wenn Sie msgboxals Ausgabe verwenden, können Sie zu a wechseln Subund 2 Bytes sparen. Sie können auch den ganzen nicht benötigten weißen Raum um das =und nach jedem ,
weggolfen
1

JavaScript, 97 Bytes

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
quelle
Kannst du daraus eine Geige machen? Scheint bei mir nicht zu funktionieren. Ich bekommeInvalid left-hand side in assignment
Gust van de Wal
@GustvandeWal Bisher ist FireFox der einzige Browser, der destrukturierende Aufgaben unterstützt , daher hilft eine Geige leider nicht.
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])

Teilt die Befehlszeileneingabe basierend auf der [hms]Regex in ein Array von Zeichenfolgen auf . Verwendet die verbose integrierte Funktion .AddSeconds(), um (date 0)a / k / a (Stunden * 3600, Minuten * 60 und Sekunden) zu addieren, und Monday, January 1, 0001, 12:00:00 AMspeist diese dann in eine -fFormatierung ein, HH:mm:ssdie sie automatisch in das 24-Stunden-Format umwandelt und ausgibt.

Beispiel:

PS C:\Tools\Scripts\golfing> .\time-after-some-time.ps1 25h100m0s
02:40:00
AdmBorkBork
quelle
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
quelle
1

VB.NET (107 Bytes)

Erste Einreichung für Code Golf, also schätze ich die Anzahl der Zeichen => Anzahl der Bytes?

MsgBox(TimeSpan.Zero.Add(TimeSpan.Parse(Regex.Replace(InputBox("XhYmZs"),"[hm]",":").Trim("s"))).ToString)
"a"
quelle
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
quelle
1

CJam, 50 Bytes

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

GNU sed + date, 51 Bytes

(einschließlich +1 Byte für -rFlag)

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

Dabei wird einfach datedie angegebene Anzahl von Stunden, Minuten und Sekunden zu 00:00:00(heute) addiert und der Zeitteil angezeigt. Es wird empfohlen, TZ=UTCdas Programm so einzustellen oder zu vermeiden, dass eine Ortszeitänderung auftritt (z. B. Sommerzeit).

Toby Speight
quelle