얼마 후의 시간


15

이 도전을 위해 우리는 다음과 같은 형식으로 시간을 쓰고 있습니다. hh:mm:ss

몇 가지 예 :

12:34:08

06:05:30

23:59:00

문제는 시작 시간 으로 시간 , 초가 경과 한 후 시간을 출력하는 것 00:00:00입니다. 에서 시작한 타이머와 이것을 비교할 수 있습니다 00:00:00.

다음은 입력 ( STDIN 사용 ) 및 출력 의 예입니다 .

Input: 1h20m5s
Output: 01:20:05

Input: 0h100m0s
Output: 01:40:00

24 시간이 지나면 타이머 자체가 재설정됩니다.

Input: 25h0m0s
Output: 01:00:00

입력의 형태는 항상 동일합니다 : XhYmZsX시간, Y분, Z초 (즉 가정 X, Y그리고 Z전체 정수 미만 100000 결코 음)

이것은 이므로 최소 양의 바이트 가이 도전에 당첨됩니다.


3
함수를 작성할 수 있습니까?
LegionMammal978

1
@ LegionMammal978, 예
Adnan

"X, Y 및 Z가 99999보다 작은 정수이고 절대 음수가 아닌 것으로 가정하십시오"는 99999h99999m99999s가 유효한 입력입니까?
런처

@Cruncher, 예, 그것은 유효한 입력입니다
Adnan

99999는 99999 이상입니다.
Luke Luke

답변:



4

루비 - 131 115 107 97 84 바이트

나는 아직도 골프를하고있다.

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

/ h | m | s /의 / \ w / inshead에 대한 @Doorknob에 감사드립니다.


정규식으로 나눌 수 있습니다 : gets.tr('ms',?h).split(?h)-> gets.split(/\w/).
Doorknob

@Doorknob 방금 정규식으로 다시 작성했지만 더 짧습니다. 감사!
Peter Lenkefi

1
나는 경쟁을 포기합니다. Mma는 너무 장황하다.
LegionMammal978

3
@ LegionMammal978 절대 포기하지 마라;)
Peter Lenkefi

2

매쓰, 133 116 112 111 바이트

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

2

파이썬 2, 138126 바이트

이제 정규식을 사용하고 있지만 여전히 ..

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)

입력은 따옴표로 묶어야합니다.


2

149 112 바이트

여기에서 테스트

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의 크레딧.


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 바이트, STDIN에서 읽음)
Dennis

@Dennis 덕분에 명령 줄 인수 일 필요는 없습니다. 나를 위해 일하지 않은 유일한 것은 함수 인수 목록에서 변수를 선언하는 것입니다. 컴파일러 오류가 발생했습니다.
Chris Loonam

h,m,s;main()더 휴대하기 쉬워야합니다. main(h,m,s)GCC와 함께 작동 ( 링크 )
Dennis

알았어 고마워. 112로
줄였습니다

m=s/60;h=m/60;? 이 후에도 제거 할 수 s+=있습니다.
ugoren

2

자바 스크립트 110 바이트

여기서 x는 입력입니다

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

이것이 가장 효율적인 방법이라고 생각하지 않습니다

// 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 바이트

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

(ISO-8859-1로 저장)

더 이상 사용되지 않는 split기능으로 인해 PHP 5에서만 작동 합니다. 통지가 표시되지 않는다고 가정합니다.

작동 방식 :

  • ¤—’¢되고 "[hm]"반전 유효한 상수 이름, PHP 문자열로서 정의 정수를 사용한다 (따옴표 하나 개의 문자를 저장)
  • ·Å–ÅŒ 동일하다 "H:i:s"
  • 모든 것은 단일 핸즈 드 에코 문입니다. <?=x,yx와 y를 출력합니다. 을 사용 !하면 $s할당 결과 가 부울로 변환되고 부정 된 다음 문자열로 변환되어 출력됩니다.(string)false === ''
  • split("[hm]", "XhYmZs")문자열을로 분할합니다 [X,Y,Zs]. 그런 다음 3600*X+60*Y+Zs초 수입니다. PHP는 다음 Zs과 같이 정수로 변환 합니다Z
  • 시간대 오프셋을 빼고이 date(Z)결과를 타임 스탬프로 사용하고 시간 부분을 "시 : 분 : 초"로 인쇄합니다. UTC (오프셋 0)에서 타임 스탬프 01970/01/01 00:00:00입니다. 시간대 오프셋을 빼면 실제로 사용 된 시간대를 변경하지 않고 날짜를 UTC로 정규화합니다 (이는 시간대 설정을 위해 8 바이트를 절약 함).
  • 편리하게 25 시간이면 01:00:00 (다음 날)이됩니다.

1

AutoIt, 208 바이트

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

너무 오래. 테스트:

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


1

펄 5, 84 (83 바이트 + 1)

초 또는 분의 오버플로를 사용합니다.

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

테스트

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

1

VBA ( 150 149 바이트)

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
좋아 보인다. VBA는이 작업에 좋습니다. msgbox출력으로 사용 하는 경우 a로 변경 Sub하고 2 바이트를 저장할 수 있습니다 . 또한 주변에 떨어진 모든 불필요한 공백 골프 수 =및 각 후에는 ,약 134 아래로 노크
JimmyJazzx

1

자바 스크립트, 97 바이트

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

이것을 바이올린으로 바꿀 수 있습니까? 나를 위해 작동하지 않는 것 같습니다. 나는 얻는다Invalid left-hand side in assignment
Gust van de Wal

@GustvandeWal 지금까지 FireFox는 구조 해제 할당 을 지원하는 유일한 브라우저 이므로 바이올린은 불행히도 도움이되지 않습니다.
Mwr247

1

PowerShell, 84 바이트

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

명령 행 입력을 [hms]정규식을 기반으로하는 문자열 배열로 분할합니다 . 용장 내장 용도 기능을 .AddSeconds()추가하는 (시간 분 60 * 3600 * 초)로 (date 0)A / K / A Monday, January 1, 0001, 12:00:00 AM다음 피드 해당에 -f서식 HH:mm:ss자동 24 시간 형식으로 출력한다으로 변환 할 것이다.

예:

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

1

루아, 104 바이트

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

파이썬 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]))

언 골프 버전 :

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 바이트

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

1

GNU sed + date, 51 바이트

( -r플래그에 +1 바이트 포함 )

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

이것은 단순히 date지정된 시간, 분 및 초를 00:00:00(오늘)에 추가하고 시간 부분을 표시합니다. 설정하는 것이 좋습니다 TZ=UTC현지 시간 변화의 주위에 프로그램을 실행하지 마십시오 (예 : 일광 절약).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.