Il tempo dopo qualche tempo


15

Per questa sfida, stiamo scrivendo l'ora nel seguente formato: hh:mm:ss

Qualche esempio:

12:34:08

06:05:30

23:59:00

La sfida consiste nell'emettere il tempo dopo che sono trascorse ore , minuti e secondi , con l'ora di inizio 00:00:00. È possibile confrontare questo con un timer che è iniziato a 00:00:00.

Ecco un esempio di input (usando STDIN ) e output:

Input: 1h20m5s
Output: 01:20:05

Input: 0h100m0s
Output: 01:40:00

Dopo 24 ore, il timer si ripristina automaticamente:

Input: 25h0m0s
Output: 01:00:00

La forma dell'input è sempre la stessa:, XhYmZscon Xore, Yminuti e Zsecondi (supponiamo che X, Ye Zsiano numeri interi interi inferiori a 100000 e mai negativi)

Questo è , quindi il minor numero di byte vince questa sfida


3
Possiamo scrivere funzioni?
LegionMammal978,

1
@ LegionMammal978, sì
Adnan,

"supponiamo che X, Y e Z siano numeri interi interi inferiori a 99999 e mai negativi" è 99999h99999m99999s un input valido?
Cruncher,

@Cruncher, sì, questo è un input valido
Adnan,

99999 non è inferiore a 99999.
Luca,

Risposte:



4

Rubino - 131 115 107 97 84 byte

Lo sto ancora giocando a golf.

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

Grazie per @Doorknob per / \ w / inshead of / h | m | s /


Puoi dividere su una regex: gets.tr('ms',?h).split(?h)-> gets.split(/\w/).
Maniglia della porta

@Doorknob L'ho appena riscritto in regex ma il tuo è più corto. Grazie!
Peter Lenkefi,

1
Rinuncio a provare a competere. Mma è troppo prolissa.
LegionMammal978,

3
@ LegionMammal978 Non mollare mai;)
Peter Lenkefi,

2

Mathematica, 133 116 112 111 byte

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

2

Python 2, 138 126 byte

Ora sto usando regex, comunque abbastanza a lungo ..

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'input dovrebbe essere tra virgolette.


2

C 149 112 byte

Provalo qui

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

Ringraziamenti a @Dennis per esserti sbarazzato molto.


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 byte, legge STDIN)
Dennis,

@Dennis grazie, ho dimenticato che non doveva essere un argomento da riga di comando. L'unica cosa che non funzionava per me era la dichiarazione delle variabili nell'elenco degli argomenti delle funzioni; Stavo ottenendo errori del compilatore con quello.
Chris Loonam,

h,m,s;main()dovrebbe essere più portatile. main(h,m,s)lavora con GCC ( link )
Dennis,

Ok grazie. Sono arrivato al 112.
Chris Loonam il

m=s/60;h=m/60;? Dopo questo puoi anche sbarazzartene s+=.
ugoren,

2

JavaScript 110 byte

Dove x è l'input

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

Non penso che questo sia il modo più efficiente

// 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 byte

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

(salvato come ISO-8859-1)

Funziona solo su PHP 5 a causa della splitfunzione deprecata . Presuppone che gli avvisi non vengano visualizzati.

Come funziona:

  • ¤—’¢viene "[hm]"invertito e un nome di costante valido, PHP utilizza costanti indefinite come stringa (salva un carattere tra virgolette)
  • ·Å–ÅŒ è lo stesso per "H:i:s"
  • Tutto è una singola dichiarazione di eco a breve termine. <?=x,yuscite x e y. Utilizzando !, il risultato $sdell'assegnazione viene convertito in booleano e negato, quindi convertito in stringa in output.(string)false === ''
  • split("[hm]", "XhYmZs")divide la stringa in [X,Y,Zs]. Quindi, 3600*X+60*Y+Zsè il numero di secondi. PHP converte Zsin numero intero comeZ
  • Sottraiamo l'offset del fuso orario date(Z), utilizziamo questo risultato come data e ora e stampiamo la sua parte temporale come "ore: minuti: secondi". In UTC (offset 0), il timestamp 0è 1970/01/01 00:00:00. Sottrarre l'offset del fuso orario normalizza la data come UTC senza modificare il fuso orario effettivamente utilizzato (questo ha salvato 8 byte per l'impostazione del fuso orario).
  • Convenientemente, 25 ore comporteranno 01:00:00 (il giorno successivo).

1

AutoIt, 208 byte

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

Troppo lungo. Test:

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


1

Perl 5, 84 (83 byte + 1)

Utilizza l'overflow di secondi o minuti.

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

Test

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

1

VBA ( 150 149 byte)

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
Sembra buono. VBA sembra ottimo per questo compito. Se si utilizza msgboxcome output è possibile passare a a Sube salvare 2 byte. Puoi anche golf via tutto lo spazio bianco non necessario intorno =e dopo ciascuno ,per
buttarlo

1

JavaScript, 97 byte

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

Puoi trasformarlo in un violino? Non sembra funzionare per me. RicevoInvalid left-hand side in assignment
Gust van de Wal,

@GustvandeWal Finora FireFox è l'unico browser a supportare compiti di destrutturazione , quindi un violino non aiuterà purtroppo.
Mwr247,

1

PowerShell, 84 byte

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

Divide l'input della riga di comando in una matrice di stringhe in base al [hms]regex. Utilizza la funzione integrata dettagliata .AddSeconds()per aggiungere (ore * 3600, minuti * 60 e secondi) a (date 0)/ k / a Monday, January 1, 0001, 12:00:00 AM, quindi lo inserisce -fcon la formattazioneHH:mm:ss lo inserisce che lo convertirà automaticamente in formato 24 ore e lo emetterà.

Esempio:

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

1

Lua, 104 byte

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

Versione non golfata:

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 byte

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

1

GNU sed + data, 51 byte

(incluso +1 byte per -rflag)

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

Questo semplicemente dateaggiunge il numero specificato di ore, minuti e secondi a 00:00:00(oggi) e visualizza la parte temporale. Consigliato per impostare TZ=UTCo evitare di eseguire il programma in base a un cambio di ora locale (ad esempio, l'ora legale).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.