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


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 /


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

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.


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.


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

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

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)


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

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

¿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

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

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

1

CJam, 50 bytes

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.