O tempo depois de algum tempo


15

Para esse desafio, estamos escrevendo o horário da seguinte forma: hh:mm:ss

Alguns exemplos:

12:34:08

06:05:30

23:59:00

O desafio é produzir o tempo após decorridas horas , minutos e segundos , com o tempo de início 00:00:00. Você pode comparar isso com um cronômetro iniciado em 00:00:00.

Aqui está um exemplo de entradas (usando STDIN ) e saídas:

Input: 1h20m5s
Output: 01:20:05

Input: 0h100m0s
Output: 01:40:00

Após 24 horas, o cronômetro se redefine:

Input: 25h0m0s
Output: 01:00:00

A forma de entrada é sempre a mesma: XhYmZscom Xhoras, Yminutos e Zsegundos (assumir que X, Ye Zsão números inteiros inferior a 100000 e nunca negativo)

Isso é , então a menor quantidade de bytes vence esse desafio


3
Podemos escrever funções?
usar o seguinte

1
@ LegionMammal978, yes #
Adnan

"suponha que X, Y e Z sejam inteiros inteiros menores que 99999 e nunca negativos" 99999h99999m99999s é uma entrada válida?
Cruncher

@Cruncher, sim, que é uma entrada válida
Adnan

99999 não é inferior a 99999.
Lucas

Respostas:



4

Ruby - 131 115 107 97 84 bytes

Eu ainda estou jogando golfe.

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

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


Você pode dividir em uma regex: gets.tr('ms',?h).split(?h)-> gets.split(/\w/).
Maçaneta

@ Doorknob Acabei de reescrevê-lo para regexes, mas o seu é mais curto. Obrigado!
Peter Lenkefi

1
Desisto de tentar competir. Mma é muito detalhado.
LegionMammal978

3
@ LegionMammal978 Nunca desista;)
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

Agora eu estou usando regex, ainda muito tempo ..

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)

A entrada deve estar entre aspas.


2

C 149 112 bytes

Teste aqui

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 ao @Dennis por se livrar muito disso.


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, lê STDIN)
Dennis

@ Dennis obrigado, esqueci que não precisava ser um argumento de linha de comando. A única coisa que não estava funcionando para mim foi a declaração das variáveis ​​na lista de argumentos da função; Eu estava recebendo erros de compilador com isso.
Chris Loonam

h,m,s;main()deve ser mais portátil. main(h,m,s)trabalha com o GCC ( link )
Dennis

Ok obrigado. Entendi para baixo para 112.
Chris Loonam

m=s/60;h=m/60;? Depois disso, você pode se livrar do s+=também.
ugoren

2

JavaScript 110 bytes

Onde x é a 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

Eu não acho que essa é a maneira mais 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));

(salvo como ISO-8859-1)

Funciona apenas no PHP 5 por causa da splitfunção obsoleta . Supõe que os avisos não sejam mostrados.

Como funciona:

  • ¤—’¢é "[hm]"invertido e um nome constante válido, o PHP usa constantes indefinidas como string (salva um caractere entre aspas)
  • ·Å–ÅŒ é o mesmo para "H:i:s"
  • Tudo é uma única declaração de eco de mão curta. <?=x,yproduz x e y. Usando !, o resultado da $satribuição é convertido em booleano e negado, depois convertido em string para saída.(string)false === ''
  • split("[hm]", "XhYmZs")divide a string em [X,Y,Zs]. Então, 3600*X+60*Y+Zsé o número de segundos. PHP converte Zsem número inteiro comoZ
  • Subtraímos o deslocamento do fuso horário date(Z) , usamos esse resultado como carimbo de data e hora e imprimimos sua parte do tempo como "horas: minutos: segundos". No UTC (deslocamento 0), o registro de data 0e hora é 1970/01/01 00:00:00. Subtrair o deslocamento do fuso horário normaliza a data como UTC sem alterar o fuso horário realmente usado (isso economizou 8 bytes para definir o fuso horário).
  • Convenientemente, 25 horas resultarão em 01:00:00 (no dia seguinte).

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 longo. Teste:

ConsoleWrite(_("1h20m5s") & @LF)
ConsoleWrite(_("0h100m0s") & @LF)
ConsoleWrite(_("25h0m0s") & @LF)


1

Perl 5, 84 (83 bytes + 1)

Usa o excesso de segundos ou minutos.

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

Teste

$ 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
Parece bom. O VBA parece ótimo para esta tarefa. Se você usar msgboxcomo saída, poderá alterar para a Sube salvar 2 bytes. Você pode também Golf afastado todo o espaço em branco desnecessários ao redor do =e depois de cada ,derrubá-lo em torno 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`:`)

Você pode transformar isso em um violino? Não parece funcionar para mim. Eu receboInvalid left-hand side in assignment
Gust van de Wal

@GustvandeWal Até agora, o FireFox é o único navegador a suportar tarefas de desestruturação , portanto, um violino não ajudará infelizmente.
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 a entrada da linha de comandos em uma matriz de cadeias de caracteres com base no [hms]regex. Usa a função interna detalhada .AddSeconds()para adicionar (horas * 3600, minutos * 60 e segundos) a (date 0)/ k / a Monday, January 1, 0001, 12:00:00 AM, e depois alimenta isso -fcom formataçãoHH:mm:ss que a converterá automaticamente no formato de relógio de 24 horas e a produzirá.

Exemplo:

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

Versão não destruída:

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 + data, 51 bytes

(incluindo +1 byte para -rsinalizador)

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

Isso simplesmente dateadiciona o número especificado de horas, minutos e segundos a 00:00:00(hoje) e exibe a parte do tempo. Recomendado para configurar TZ=UTCou evitar a execução do programa em torno de uma alteração na hora local (por exemplo, horário de verão).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.