Bir süre sonra


15

Bu zorluk için zamanı aşağıdaki biçimde yazıyoruz: hh:mm:ss

Bazı örnekler:

12:34:08

06:05:30

23:59:00

Bir miktar sonra meydan çıkış zamanı saat , dakika ve saniye süre başlangıç maddesi olarak sahip geçtikten 00:00:00. Bunu, adresinde başlayan bir zamanlayıcı ile karşılaştırabilirsiniz 00:00:00.

İşte giriş ( STDIN kullanarak ) ve çıkışlara bir örnek :

Input: 1h20m5s
Output: 01:20:05

Input: 0h100m0s
Output: 01:40:00

24 saat sonra zamanlayıcı kendini sıfırlar:

Input: 25h0m0s
Output: 01:00:00

Giriş formu her zaman aynıdır: XhYmZsile Xsaat Ydakika ve Zsaniye (farz X, Yve Zbütün tamsayılar az 100000 ve asla negatif)

Bu , bu yüzden bu meydan okumayı en az bayt kazanır


3
Fonksiyon yazabilir miyiz?
LegionMammal978

1
@ LegionMammal978, evet
Adnan

"X, Y ve Z'nin tam 99999'dan küçük tamsayı olduğunu ve asla negatif olmadığını varsayalım" 99999h99999m99999s geçerli bir girdi mi?
Cruncher

@Cruncher, evet, bu geçerli bir girdi
Adnan

99999, 99999'dan az değildir.
Luke

Yanıtlar:



4

Yakut - 131 115 107 97 84 bayt

Hala golf oynuyorum.

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

/ \ W / inshead / h | m | s / için @Doorknob için teşekkürler


Bir normal ifadeye bölebilirsiniz: gets.tr('ms',?h).split(?h)-> gets.split(/\w/).
Kapı tokmağı

@Doorknob Az önce regexes için yeniden yazdım ama seninki daha kısa. Teşekkürler!
Peter Lenkefi

1
Rekabet etmeye çalışmaktan vazgeçiyorum. Mma fazla ayrıntılı.
LegionMammal978

3
@ LegionMammal978 Asla pes etmeyin;)
Peter Lenkefi

2

Mathematica 133 116 112 111 bayt

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

2

Python 2, 138126 Bayt

Şimdi regex kullanıyorum, yine de oldukça uzun ..

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)

Giriş tırnak içinde olmalıdır.


2

C 149 112 bayt

Burada test edin

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

@Dennis için çok şey kurtulmak için kredi.


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 bayt, STDIN'den okuyor)
Dennis

@Dennis teşekkürler, bir komut satırı argümanı olması gerekmediğini unuttum. Benim için çalışmayan tek şey işlev argüman listesindeki değişkenlerin bildirilmesiydi; Bununla derleyici hataları alıyordum.
Chris Loonam

h,m,s;main()daha taşınabilir olmalıdır. main(h,m,s)GCC ( link ) ile çalışır
Dennis

Tamam teşekkürler. 112'ye
ulaştı.

m=s/60;h=m/60;? Bundan sonra da kurtulabilirsiniz s+=.
ugoren

2

JavaScript 110 bayt

X, girdi

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

Bunun en etkili yol olduğunu düşünmüyorum

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

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

(ISO-8859-1 olarak kaydedildi)

Kullanımdan kaldırıldığı için yalnızca PHP 5 üzerinde çalışır split işlev çalışır. Bildirimlerin gösterilmediğini varsayar.

Nasıl çalışır:

  • ¤—’¢ dır-dir "[hm]" ters ve geçerli bir sabit adı PHP dize olarak tanımlanmamış sabitleri kullanır (tırnak işaretleri için bir karakter kazandırır)
  • ·Å–ÅŒ için aynı "H:i:s"
  • Her şey kısa süreli tek yankı ifadesidir. <?=x,yx ve y çıkışları. Kullanıldığında !, $satamanın sonucu boole ve reddedilir, ardından çıktıya dizeye dönüştürülür.(string)false === ''
  • split("[hm]", "XhYmZs")dizgiyi böler [X,Y,Zs]. Sonra 3600*X+60*Y+Zssaniye sayısıdır. PHP ZstamsayıyaZ
  • date(Z)Saat dilimi sapmasını özetliyoruz, bu sonucu zaman damgası olarak kullanıyoruz ve zaman bölümünü "saat: dakika: saniye" olarak yazdırıyoruz. UTC'de (ofset 0), zaman damgası0 olan1970/01/01 00:00:00 . Saat dilimi ofsetinin çıkarılması, gerçekte kullanılan saat dilimini değiştirmeden tarihi UTC olarak normalleştirir (bu, saat dilimini ayarlamak için 8 bayt tasarruf eder).
  • Uygun şekilde, 25 saat 01:00:00 (ertesi gün) ile sonuçlanacaktır.

1

Otomatik, 208 bayt

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

Çok uzun. Ölçek:

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


1

Perl 5, 84 (83 Bayt + 1)

Saniye veya dakika taşmasını kullanır.

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

Ölçek

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

1

Vba ( 150 149 bayt)

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
İyi görünüyor. VBA bu görev için harika görünüyor. msgboxÇıktı olarak kullanıyorsanız, a olarak değiştirebilir Subve 2 bayt kaydedebilirsiniz. Ayrıca etrafında =ve sonra her ,yere 134 etrafında yıkmak için gereksiz tüm beyaz boşluk Golf.
JimmyJazzx

1

JavaScript, 97 bayt

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

Bunu bir Keman'a çevirebilir misin? Benim için çalışmıyor gibi görünüyor. EldeInvalid left-hand side in assignment
Gust van de Wal

@GustvandeWal Şimdiye kadar FireFox yıkıcı atamayı destekleyen tek tarayıcıdır , bu yüzden bir keman maalesef yardımcı olmaz.
Mwr247

1

PowerShell, 84 Bayt

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

Komut satırı girişini [hms]normal ifadeye dayalı olarak bir dizeler dizisine böler . A / k / a öğesine .AddSeconds()(saat * 3600, dakika * 60 ve saniye) eklemek için ayrıntılı yerleşik işlevi kullanır , ardından bunu biçimlendirmeyle besler(date 0)Monday, January 1, 0001, 12:00:00 AM-fHH:mm:ss bunu otomatik olarak 24 saat biçimine dönüştürecek ve çıktısını .

Misal:

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

1

Lua, 104 bayt

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

Ungolfed sürümü:

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 bayt

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

1

GNU sed + tarih, 51 bayt

( -rbayrak için +1 bayt dahil )

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

Bu date, 00:00:00(bugün) ' e belirtilen sayıda saat, dakika ve saniye ekler ve zaman bölümünü görüntüler. TZ=UTCProgramı yerel saat değişikliği etrafında ayarlamak veya önlemek için önerilir (örn. Yaz saati uygulaması).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.