El tiempo después de algún tiempo

15

Para este desafío, estamos escribiendo la hora en la siguiente forma: hh:mm:ss

Algunos ejemplos:

12:34:08

06:05:30

23:59:00

El desafío es generar el tiempo después de que hayan transcurrido una cantidad de horas , minutos y segundos , con el tiempo de inicio 00:00:00. Puede comparar esto con un temporizador que comenzó en 00:00:00.

Aquí hay un ejemplo de entradas (usando STDIN ) y salidas:

Input: 1h20m5s
Output: 01:20:05

Input: 0h100m0s
Output: 01:40:00

Después de 24 horas, el temporizador se reinicia:

Input: 25h0m0s
Output: 01:00:00

La forma de la entrada es siempre la misma: XhYmZscon Xhoras, Yminutos y Zsegundos (suponga eso X, Yy Zson enteros enteros menores que 100000 y nunca negativos)

Este es el , por lo que la menor cantidad de bytes gana este desafío

Adnan
fuente
3
¿Podemos escribir funciones?
LegionMammal978
1
@ LegionMammal978, sí
Adnan
"asumir que X, Y y Z son enteros enteros menores que 99999 y nunca negativos" ¿es 99999h99999m99999s una entrada válida?
Cruncher
@Cruncher, sí, esa es una entrada válida
Adnan
99999 no es inferior a 99999.
Lucas

Respuestas:

4

Ruby - 131 115 107 97 84 bytes

Todavía lo estoy jugando al golf.

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

Gracias por @Doorknob por / \ w / inshead de / h | m | s /

Peter Lenkefi
fuente
Puede dividir en una expresión regular: gets.tr('ms',?h).split(?h)-> gets.split(/\w/).
Pomo de la puerta
@Doorknob Lo acabo de reescribir en expresiones regulares pero el tuyo es más corto. ¡Gracias!
Peter Lenkefi
1
Renuncio a intentar competir. Mma es demasiado detallada.
LegionMammal978
3
@ LegionMammal978 Nunca te rindas;)
Peter Lenkefi
2

Mathematica, 133 116 112 111 bytes

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

Python 2, 138 126 Bytes

Ahora estoy usando expresiones regulares, aunque todavía bastante largo ...

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)

La entrada debe estar entre comillas.

Kade
fuente
2

C 149 112 bytes

Pruébalo aquí

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

Créditos a @Dennis por deshacerse de mucho.

Chris Loonam
fuente
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, lecturas de STDIN)
Dennis
@ Dennis gracias, olvidé que no tenía que ser un argumento de línea de comando. Lo único que no me funcionó fue la declaración de las variables en la lista de argumentos de la función; Estaba recibiendo errores del compilador con eso.
Chris Loonam
h,m,s;main()Debería ser más portátil. main(h,m,s)funciona con GCC ( enlace )
Dennis
OK gracias. Lo bajé a 112.
Chris Loonam
m=s/60;h=m/60;? Después de esto, también puedes deshacerte de él s+=.
Ugoren
2

JavaScript 110 bytes

Donde x es la entrada

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

No creo que esta sea la forma más eficiente.

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

PHP, 80 88 93 Bytes

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

(guardado como ISO-8859-1)

Funciona solo en PHP 5 debido a la splitfunción obsoleta . Asume que los avisos no se muestran.

Cómo funciona:

  • ¤—’¢está "[hm]"invertido y es un nombre constante válido, PHP usa constantes indefinidas como cadena (guarda un carácter para las comillas)
  • ·Å–ÅŒ es lo mismo para "H:i:s"
  • Todo es una sola declaración de eco de mano corta. <?=x,ysalidas x e y. Utilizando !, el resultado de la $sasignación se convierte en booleano y se niega, luego se convierte en cadena para la salida.(string)false === ''
  • split("[hm]", "XhYmZs")divide la cadena a [X,Y,Zs]. Entonces, 3600*X+60*Y+Zses el número de segundos. PHP convierte Zsa entero comoZ
  • Restamos el desplazamiento de la zona horaria date(Z), usamos este resultado como una marca de tiempo e imprimimos su parte de tiempo como "horas: minutos: segundos". En UTC (desplazamiento 0), la marca de tiempo 0es 1970/01/01 00:00:00. Restar el desplazamiento de la zona horaria normaliza la fecha como UTC sin cambiar la zona horaria realmente utilizada (esto ahorró 8 bytes para configurar la zona horaria).
  • Convenientemente, 25 horas resultarán en 01:00:00 (al día siguiente).
Fabian Schmengler
fuente
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

Demasiado largo. Prueba:

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

Pyth, 40 bytes

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

Todavía estoy aprendiendo. Pruébalo aquí!

Lynn
fuente
1

Perl 5, 84 (83 Bytes + 1)

Utiliza el desbordamiento de segundos o minutos.

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

Prueba

$ echo 35:124:224s |perl -n 61736-time-after-some-time.pl
13:07:44
LukStorms
fuente
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
usuario3819867
fuente
1
Se ve bien. VBA parece genial para esta tarea. Si lo usa msgboxcomo salida, puede cambiar a Subay guardar 2 bytes. También puede Golf todo el espacio en blanco innecesario alrededor =y después de cada uno ,para derribarlo alrededor de 134.
JimmyJazzx
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
fuente
¿Puedes convertir esto en un violín? No parece funcionar para mí. ObtengoInvalid left-hand side in assignment
Gust van de Wal
@GustvandeWal Hasta ahora FireFox es el único navegador que admite tareas de desestructuración , por lo que un violín no ayudará desafortunadamente.
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])

Divide la entrada de la línea de comandos en una matriz de cadenas basadas en la [hms]expresión regular. Utiliza la función incorporada detallada .AddSeconds()para agregar (horas * 3600, minutos * 60 y segundos) a (date 0)a / k / a Monday, January 1, 0001, 12:00:00 AM, luego lo alimenta -fcon formato HH:mm:ssque lo convertirá automáticamente a formato de reloj de 24 horas y lo emitirá.

Ejemplo:

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

VB.NET (107 bytes)

Primer envío para el código de golf, así que supongo que el recuento de caracteres => ¿recuento de bytes?

MsgBox(TimeSpan.Zero.Add(TimeSpan.Parse(Regex.Replace(InputBox("XhYmZs"),"[hm]",":").Trim("s"))).ToString)
вʀaᴎᴅᴏƞ вєнᴎєƞ
fuente
1

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

Versión sin golf:

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
fuente
1

CJam, 50 bytes

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

GNU sed + fecha, 51 bytes

(incluido +1 byte para -rbandera)

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

Esto simplemente dateagrega el número especificado de horas, minutos y segundos a 00:00:00(hoy) y muestra la parte de tiempo. Se recomienda configurar TZ=UTCo evitar ejecutar el programa alrededor de un cambio de hora local (por ejemplo, horario de verano).

Toby Speight
fuente