Le temps après un certain temps

15

Pour ce challenge, nous écrivons l'heure sous la forme suivante: hh:mm:ss

Quelques exemples:

12:34:08

06:05:30

23:59:00

Le défi consiste à afficher le temps après un certain nombre d' heures , de minutes et de secondes , avec comme heure de début 00:00:00. Vous pouvez comparer cela avec une minuterie qui a commencé à 00:00:00.

Voici un exemple d'entrées (en utilisant STDIN ) et de sorties:

Input: 1h20m5s
Output: 01:20:05

Input: 0h100m0s
Output: 01:40:00

Après 24 heures, la minuterie se réinitialise:

Input: 25h0m0s
Output: 01:00:00

La forme de l'entrée est toujours la même:, XhYmZsavec Xheures, Yminutes et Zsecondes (supposez que X, Yet Zsont des entiers inférieurs à 100000 et jamais négatifs)

Il s'agit de , donc le moins d'octets remporte ce défi

Adnan
la source
3
Pouvons-nous écrire des fonctions?
LegionMammal978
1
@ LegionMammal978, oui
Adnan
"supposons que X, Y et Z sont des entiers inférieurs à 99999 et jamais négatifs" 99999h99999m99999s est-il une entrée valide?
Cruncher
@Cruncher, oui, c'est une entrée valide
Adnan
99999 n'est pas inférieur à 99999.
Luke

Réponses:

4

Rubis - 131 115 107 107 97 84 octets

Je joue toujours au golf.

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

Merci pour @Doorknob pour / \ w / inshead of / h | m | s /

Peter Lenkefi
la source
Vous pouvez diviser sur une expression régulière: gets.tr('ms',?h).split(?h)-> gets.split(/\w/).
Poignée de porte
@ Doorknob Je viens de le réécrire en regex mais le vôtre est plus court. Merci!
Peter Lenkefi
1
Je renonce à essayer de rivaliser. Mma est juste trop verbeuse.
LegionMammal978
3
@ LegionMammal978 N'abandonnez jamais;)
Peter Lenkefi
2

Mathematica, 133 116 112 111 111 octets

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

Python 2, 138 126 octets

Maintenant, j'utilise regex, encore assez longtemps cependant ..

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)

L'entrée doit être entre guillemets.

Kade
la source
2

C 149 112 octets

Testez-le ici

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édits à @Dennis pour se débarrasser de beaucoup de choses.

Chris Loonam
la source
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 octets, lit de STDIN)
Dennis
@Dennis merci, j'ai oublié qu'il ne devait pas être un argument de ligne de commande. La seule chose qui ne fonctionnait pas pour moi était la déclaration des variables dans la liste des arguments de fonction; J'obtenais des erreurs de compilation avec cela.
Chris Loonam
h,m,s;main()devrait être plus portable. main(h,m,s)travaille avec GCC ( lien )
Dennis
OK merci.
Je suis
m=s/60;h=m/60;? Après cela, vous pouvez aussi vous en débarrasser s+=.
ugoren
2

JavaScript 110 octets

Où x est l'entrée

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

Je ne pense pas que ce soit le moyen le plus efficace

// 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
la source
2

PHP, 80 88 93 Octets

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

(enregistré sous ISO-8859-1)

Fonctionne uniquement sur PHP 5 en raison de la splitfonction obsolète . Suppose que les avis ne sont pas affichés.

Comment ça fonctionne:

  • ¤—’¢est "[hm]"inversé et un nom de constante valide, PHP utilise des constantes non définies comme chaîne (enregistre un caractère pour les guillemets)
  • ·Å–ÅŒ c'est pareil pour "H:i:s"
  • Tout est une seule déclaration d'écho à court terme. <?=x,ysorties x et y. À l'aide de !, le résultat de l' $saffectation est converti en booléen et annulé, puis converti en chaîne en sortie.(string)false === ''
  • split("[hm]", "XhYmZs")divise la chaîne en [X,Y,Zs]. Ensuite, 3600*X+60*Y+Zsc'est le nombre de secondes. PHP convertit Zsen entier commeZ
  • Nous soustrayons le décalage du fuseau horaire date(Z), utilisons ce résultat comme horodatage et imprimons sa partie horaire sous la forme "heures: minutes: secondes". En UTC (décalage 0), l'horodatage 0est 1970/01/01 00:00:00. La soustraction du décalage de fuseau horaire normalise la date au format UTC sans modifier le fuseau horaire réellement utilisé (cela a permis d'économiser 8 octets pour définir le fuseau horaire).
  • Idéalement, 25 heures se traduiront par 01:00:00 (le lendemain).
Fabian Schmengler
la source
1

AutoIt, 208 octets

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

Trop long. Tester:

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

Perl 5, 84 (83 octets + 1)

Utilise le débordement de secondes ou de minutes.

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

Tester

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

VBA ( 150 149 octets)

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
la source
1
Cela semble bon. VBA semble idéal pour cette tâche. Si vous utilisez msgboxcomme sortie, vous pouvez passer à a Subet enregistrer 2 octets. Vous pouvez également jouer au golf loin de tous les espaces blancs inutiles autour de =et après chacun ,pour le faire tomber vers 134.
JimmyJazzx
1

JavaScript, 97 octets

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
la source
Pouvez-vous transformer cela en violon? Ne semble pas fonctionner pour moi. Je reçoisInvalid left-hand side in assignment
Gust van de Wal
@GustvandeWal Jusqu'à présent, FireFox est le seul navigateur à prendre en charge l' assignation de déstructuration , donc un violon n'aidera malheureusement pas.
Mwr247
1

PowerShell, 84 octets

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

Fractionne l'entrée de ligne de commande en un tableau de chaînes basé sur l' [hms]expression régulière. Utilise la fonction intégrée détaillée .AddSeconds()pour ajouter (heures * 3600, minutes * 60 et secondes) à (date 0)un / k / a Monday, January 1, 0001, 12:00:00 AM, puis alimente cela en -fformatage HH:mm:ssqui le convertira automatiquement au format d'horloge de 24 heures et le sortira.

Exemple:

PS C:\Tools\Scripts\golfing> .\time-after-some-time.ps1 25h100m0s
02:40:00
AdmBorkBork
la source
1

Lua, 104 octets

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
la source
1

VB.NET (107 octets)

Première soumission pour le code golf, donc je suppose que le nombre de caractères => le nombre d'octets?

MsgBox(TimeSpan.Zero.Add(TimeSpan.Parse(Regex.Replace(InputBox("XhYmZs"),"[hm]",":").Trim("s"))).ToString)
вʀaᴎᴅᴏƞ вєнᴎєƞ
la source
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]))

Version non golfée:

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
la source
1

CJam, 50 octets

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

GNU sed + date, 51 octets

(dont +1 octet pour l' -rindicateur)

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

Cela permet simplement dated'ajouter le nombre d'heures, de minutes et de secondes spécifié à 00:00:00(aujourd'hui) et d'afficher la partie horaire. Recommandé pour définir TZ=UTCou éviter d'exécuter le programme autour d'un changement d'heure locale (par exemple, heure d'été).

Toby Speight
la source