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


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 /


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

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.


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.


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

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

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)


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

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

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

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

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


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

1

CJam, 50 octets

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.