지속 시간 합계


18

도전

stdin에 나타나는 모든 지속 시간을 합할 수있는 가장 짧은 코드를 작성하십시오. 프로그램은 다음 패턴 중 하나와 일치하는 문자열 만 고려하고 나머지는 무시하십시오.

    HH:MM:SS     (it will be interpreted as HH hours, MM minutes and SS seconds)        
    H:MM:SS      (it will be interpreted as H hours, MM minutes and SS seconds)
    MM:SS        (it will be interpreted as MM minutes, SS seconds)
    M:SS         (it will be interpreted as M minutes, SS seconds)

열거 된 패턴과 일치하는 문자열의 예 :

    12:00:01  
    2:03:22  
    00:53  
    9:13

출력 형식이어야합니다

    HHh MMm SSs      (that means HH hours, MM minutes and SS seconds with non-zero-padding)

STDIN

환영 비디오를보십시오.
비디오 : 10:37 분
과정에 대한 비디오 소개를보십시오.
비디오 : 3:30 분 학습 개요 사용 방법에 대한 비디오를보십시오.
비디오 : 9:13 분
Epsilen 시스템을 사용하여 작업을 공유하는 방법에 대한 비디오 개요를보십시오.
비디오 : 03:15 분
텍사스 주 학업 준비 상태 평가 (STAAR)에 대해 알아 보려면 비디오를보십시오.
비디오 : 1:05:26 분

STDOUT

1 시간 32 분 1 초


문자열은 10:4:56어떻습니까? 현재 사양에 따라로 취급해야 4m 56s하며 부분 10은 무시됩니다. 에 대해 같은 질문 을 무시 10:12:7한다는 의미 입니까? 아니면 그러한 문자열의 처리가 구현 정의 될 수 있습니까? 10m 12s7
Qwertiy

프로그램은 분 및 초 필드에서 패딩이 0 인 지속 시간 만 고려해야합니다. 귀하의 예에서 문자열 "10 : 4 : 56"은 4m 56s로 취급됩니다. 또한 문자열 "10 : 12 : 7"은 10m 12s로 해석됩니다.
Alfredo Diaz

이상하지만 괜찮습니다 :)
Qwertiy

1h 19m 18s결과물을 어떻게 얻었 습니까? 37+30+13+15+26==121, 10+3+9+3+5==30, 1==1, 그래서 기대합니다 1h 32m 01s. 이 논리에 어떤 문제가 있습니까? 또한 이러한 출력 형식은 예상되는 형식입니까?
Qwertiy

네 말이 맞아 죄송합니다 : S
알프레도 디아즈

답변:


3

피스 105

K"smh"J"\D\D+|\d+:(?=\d:)|:\d\D"W:QJ1=Q:QJd;FN_msdCfn2lTm+*]0</k\:2msbck\:cQ)~k+d+hK_`%+NZ60=Z/N60=KtK;_k

온라인으로 사용해보십시오.

여기에는 줄 바꿈 문자가 \ns 로 인용 된 텍스트와 같이 Javascript 응답과 같은 방식으로 STDIN에서 입력해야합니다 .

견본:

"View the Welcome video.\nVideo: 10:37 min.\nView the video introduction to the course.\nVideo: 3:30 min. View the video of how to use the Lesson Overview.\nVideo: 9:13 min.\nView the video overview of how to use the Epsilen system to share your work.\nVideo: 03:15 min.\nView the video to learn about the State of Texas Assessment of Academic Readiness (STAAR).\nVideo: 1:05:26 min."

산출

1h 32m 1s

이상한 날짜로 작업하는 예 :

"10:10:5 and 5:1:10 and 27 or 16: or 1:1:1 or 11:1\n"

산출

0h 11m 20s

(10:10과 1:10 만 합법적 인 시간입니다)

이것이 너무 긴 주된 이유는 Pyth가 긍정적 인 일치를 추출하지 못하게하기 때문입니다. 대신 유효하지 않은 모든 것을 일치시키고 공백 문자로 바꿉니다. 그런 다음 공백으로 나누면 몇 번이고 약간의 숫자 만 남습니다. :유효하지 않은 시간에서 제거 된 문자 를 확인하여 초과 숫자를 제거 합니다. 이것은 거의 확실하게 더 골프 될 수 있습니다.)


Pyth 정규식을 가지고 운이 좋은 놈 !
Optimizer

@Optimizer : D 그것은 진짜 고통이었다. (가 아닌 문자열입니다 현재 그것은 단지 검사) 나는 "일치"동작을 변경 제안 생각하고하는 것은 당신이 그것을주는 인수에 따라 변경합니다
FryAmTheEggman

6

자바 스크립트 ES6, 138 자

기능, 139

문자열을 인수로 받아서 출력을 콘솔에 씁니다.

f=s=>(r=0,s.replace(/(\d\d?):(\d\d)(:(\d\d))?/g,(m,a,b,x,c)=>r+=x?+c+b*60+a*3600:+b+a*60),console.log("%dh %dm %ds",r/3600,r%3600/60,r%60))

프로그램, 138

prompt(r=0).replace(/(\d\d?):(\d\d)(:(\d\d))?/g,(m,a,b,x,c)=>r+=x?+c+b*60+a*3600:+b+a*60),console.log("%dh %dm %ds",r/3600,r%3600/60,r%60)

기능 테스트

f("View the Welcome video.\n\
Video: 10:37 min.\n\
View the video introduction to the course.\n\
Video: 3:30 min. View the video of how to use the Lesson Overview.\n\
Video: 9:13 min.\n\
View the video overview of how to use the Epsilen system to share your work.\n\
Video: 03:15 min.\n\
View the video to learn about the State of Texas Assessment of Academic Readiness (STAAR).\n\
Video: 1:05:26 min.")

산출

"1h 32m 1s"

확인. Firefox Developer Edition 36.0a2에서 제대로 작동하며 Firefox 34.0에서만 포맷이 실패합니다.
manatwork

Promt는 여러 줄 문자열을 허용하지 않습니다. 하지만 문자의 같은 수의 프롬프트 () 호출로 버전을 추가 할 수 있습니다 :) 난)))이 1 개 기호를 단축
Qwertiy

@Optimizer 어떻게 입력합니까?
Qwertiy

@Optimizer FF 35.0에서 줄 바꾸기가 작동하지 않습니다.
Qwertiy

나는 그것을 작동시킬 수 없다. 나는 ideone.com에 그것을 시도 ideone.com/56EHgV
알프레도 디아즈

4

자바 스크립트, ES6, 208 (200) 197 바이트

나는 이것이 매우 길다는 것을 알고 있지만 ES6의 최신 기능, 반전, 맵 감소, 화살표 기능 및 배열 이해 (확산 연산자)를 탐색하고 싶었습니다.

alert(prompt().match(/\d\d?:\d\d(:\d\d)?/g).map(x=>[...x.split(":").reverse(),z=0].slice(0,3)).reduce((a,b)=>b.map((y,i)=>+y+ +a[i])).map((x,i)=>(z=(t=x+z|0)/60,t%60+"smh"[i])).reverse().join(" "))

최신 Firefox에서 스 니펫을 실행하십시오.

작동 방식 (약간 미정)

alert(                              // Alert the final result
  prompt()                          // Take the input via prompt
  .match(/\d\d?:\d\d(:\d\d)?/g)     // Match only correct time formats
  .map(                             // Map all matches using this method
    x=>[                            // Take each element as argument x
      ...x.split(":").reverse(),    // split x on ":" and reverse the array, then spread it
      z=0                           // put 0 as last element of return array
    ].slice(0,3)                    // Take only first 3 elements of the array
  ).reduce(                         // Reduce the result using this method
    (a,b)=>                         // Pairwise elements of the array
    b.map(                          // Map array b
      (y,i)=>~~y+~~a[i]             // Convert b[i] to b[i]+a[i]
    )                               // Now we have array like [SS, MM, HH]
  ).map(                            // Map these three values for carry over calculation
    (x,i)=>(
      t=x+z,                        // z contains carryover amount, add it to this value
      z=(t/60)|0,                   // Carryover is now floor(t/60)
      t%60+"smh"[i]                 // Remove overflow from t and add "s", "m" or "h"
    )                               // Now we have array like ["SSs", "MMm", "HHh"]
  ).reverse().join(" ")             // Reverse it and join by space
)

4

배쉬 (grep, sed, awk 및 date 포함) : 124 바이트, 120 바이트

텍스트를 이것으로 파이프하십시오.

grep -o '[:0-9]*'|sed 's/^[^:]*:[^:]*$/:\0/'|awk -F: '{T+=3600*$1+60*$2+$3}END{print"@"T}'|xargs date +"%Hh %Mm %Ss" -ud

작동 원리

  • grep : 포함 된 입력에서만 문자열을 출력합니다 0123456789:
  • sed : MM : SS 및 M : SS를 : M : SS로 바꿉니다.
  • awk : 초를 계산하고 빈 문자열은 0입니다.
  • xargs : 입력을 인수로 날짜에 전달
  • 날짜 : 에포크 (@ 접두사) 이후의 초를 필요한 형식으로 변환

이 시간이 시간대와 관련이 있습니까?
Qwertiy

당신이 맞아요, 좋은 캐치 :) -u 플래그가 추가되었습니다.
pgy December

3

펄- 228 201

use integer;$h=0,$m=0,$s=0;while(<>){if(/(\d+:){1,2}\d+/){@a=reverse(split(/:/,$&));push @a,(0)x(3-@a);$s+=@a[0];$m+=@a[1];$h+=@a[2];}}$m+=$s/60;$s=$s%60;$h+=$m/60;$m=$m%60;print $h."h ".$m."m ".$s."s"

옵티 마이저 (grep, split, reverse, add)와 동일한 알고리즘입니다.

나는 Perl 전문가가 아니므로 바이트 수를 줄일 수 있습니다.

언 골프

use integer;                              # will do integer division
$h=0,$m=0,$s=0;
while(<>){
    if(/(\d+:){1,2}\d+/) {                # extract date formats
        @a = reverse(split(/:/,$&));      # split by ":" and reverse
        push @a,(0)x(3-@a);               # pad with zeros (minutes and hours)
        $s+=@a[0];                        # sum seconds
        $m+=@a[1];                        # sum minutes
        $h+=@a[2];                        # sum hours
    }
}

# convert seconds as minutes    
$m += $s / 60;
$s = $s % 60;

# convert minutes as hours
$h += $m / 60;
$m = $m % 60;

print $h."h ".$m."m ".$s."s";

나에 관해서는, 자바 스크립트 하나보다 긴 펄 솔루션을 보는 것이 이상합니다 :)
Qwertiy

음, 심지어 세방이라도 세어도 더 길다는 것은 정상입니다.
manatwork

@Qwertiy 동의합니다. 내 희망은 일부 Perl 전문가가 문제를 해결하는 데 도움이 될 것입니다.
coredump

@manatwork 왜 계산합니까?
Qwertiy

코어 덤프는 카운트에서 제외하는 것을 잊었 기 때문에 @Qwertiy. : S 모든 my키워드 와 함께 제거 할 수 있습니다 .
manatwork

3

리볼-174

n: charset"1234567890"a:[1 2 n]b:[":"2 n]c: 0 parse input[any[copy x[a b b](c: c + do x)| copy x[a b](c: c + do join"0:"x)| skip]]print reword"$1h $2m $3s"[1 c/1 2 c/2 3 c/3]

언 골프 + 주석 달기 :

n: charset "1234567890"                      ; setup \d regex equiv
a: [1 2 n]                                   ; parse rule for \d{1,2} 
b: [":" 2 n]                                 ; parse rule for :\d\d
c: 0                                         ; time counter

parse input [                                ; parse the input (STDIN)
                                             ; (no regex in Rebol)

  any [                                      ; match zero or more... 
                                             ;
      copy x [a b b] (c: c + do x)           ;  HH:MM:SS or H:MM:SS
                                             ;    - copy match to x
                                             ;    - increment time (c) by x
                                             ; OR
    | copy x [a b] (c: c + do join "0:" x)   ;  MM:SS or M:SS
                                             ;    - copy match to x
                                             ;    - "MM:SS" into "0:MM:SS" (join)
                                             ;    - then increment time (c)
                                             ; OR
    | skip                                   ;   no match so move through input
  ]
]

print reword "$1h $2m $3s" [1 c/1 2 c/2 3 c/3]

Rebol에는 자체 time!데이터 유형이 있습니다. 위의 코드가 아래 예에서 (Rebol 콘솔 내에서) 이것을 어떻게 사용하는지 확인할 수 있습니다.

>> 0:10:37 + 0:3:30 + 0:9:13 + 0:3:15 + 1:05:26
== 1:32:01

;; Rebol would treat 10:37 as 10 hours & 37 minutes (and not MM:SS)
;; So we have to prefix the "0:"

>> join "0:" 10:37
== "0:10:37"

;; This is a string so we use Rebol DO evaluator to convert to time!

>> do join "0:" 10:37 
== 0:10:37

>> type? do join "0:" 10:37
== time!

>> hms: do join "0:" 10:37
== 0:10:37

>> hms/hour
== 0

>> hms/second
== 37

>> hms/minute
== 10

2

그루비-195

M=60
r=(System.in.text=~/((\d?\d):)?(\d\d):(\d\d)/).collect{it[2..4]*.toInteger().inject{s,i->(s?:0)*M+i}}.inject{s,i->s+=i}
f=[];(2..0).each{j=M**it;s=r%j;f<<(r-s)/j;r=s}
printf("%sh %sm %ss",f)

압축하는 방법을 알 수 없습니다.

언 골프

M=60
r=(System.in.text=~/((\d?\d):)?(\d\d):(\d\d)/).collect{  // extract dates
    it[2..4]*.toInteger().inject{ s,i ->                 // convert to seconds
        (s?:0)*M+i
    }
}.inject{s,i ->
    s+=i                                                 // sum seconds
}

f=[];
(2..0).each{                                             // convert to h,m,s
    j=M**it;
    s=r%j;
    f<<(r-s)/j;
    r=s
}

printf("%sh %sm %ss",f)

1

매스 매 티카 300 자

이 작은 운동은 Mathematica에게도 많은 코드를 사용했습니다. 분명히 더 효율적인 방법이 있습니다.

골프

입력이에 저장되어 있다고 가정하면 txt,

n=NumberString;
t=ToExpression;
o=TimeObject;

QuotientRemainder[QuantityMagnitude[Plus@@((o[#]-o[{0,0,0}])&/@
(StringSplit[StringCases[w,{(n~~":"~~n~~":"~~n),(n~~":"~~n)}],":"]
/.{{a_,b_}:> {0,t@a,t@b},{a_,b_,c_}:> {t@a,t@b,t@c}}))],60]/.{h_,m_}:> 
Row[{h,"h ",IntegerPart@m,"m ",Round[60 FractionalPart[m]],"s "}]

작동 방식 (Golfed 코드 사용) :

1-시간을 찾으십시오.

StringCases[txt,{(NumberString~~":"~~NumberString~~":"~~NumberString),
(NumberString~~":"~~NumberString)}];

{ "10:37", "3:30", "9:13", "03:15", "1:05:26"}


2 시간, 분, 초로 나누기

StringSplit[%,":"]/.{{a_,b_}:> {0,ToExpression@a,ToExpression@b},{a_,b_,c_}:> 
{ToExpression@a,ToExpression@b,ToExpression@c}}

{{0, 10, 37}, {0, 3, 30}, {0, 9, 13}, {0, 3, 15}, {1, 5, 26}}


3 번을 합산하십시오. 시간 객체는 시계 시간입니다. 한 시간 객체를 다른 시간 객체에서 빼면 지속 시간 (이 경우 92.0167 분)이 반환됩니다. QuantityMagnitude측정 단위를 삭제합니다.

q=QuantityMagnitude[Plus@@((TimeObject[#]-TimeObject[{0,0,0}])&/@%)]

92.0167


42.0167 분을시, 분, 초로 변환합니다.

QuotientRemainder[q,60]/.{h_,m_}:> Row[{h,"h ",IntegerPart@m,"m ",
Round[60 FractionalPart[m]],"s "}]

1 시간 32 분 1 초


1

펄, 146

내 항목은 후행 공백으로 출력을 인쇄합니다.

while(<>){for(/(\d?\d(?::\d\d){1,2})/g){$m=1;for(reverse split/:/,$_){$t+=$m*$_;$m*=60}}}for('s','m'){$o=($t%60)."$_ $o";$t/=60}print int$t,"h $o"

한 줄에 한 번만 입력한다고 가정하면 4자를자를 수 있습니다.

while(<>){if(/(\d?\d(:\d\d){1,2})/){$m=1;for(reverse split/:/,$&){$t+=$m*$_;$m*=60}}}for('s','m'){$o=($t%60)."$_ $o";$t/=60}print int$t,"h $o"

이들은 총 경과 시간을 누적하고 그 값을 나중에 형식화하여 작동합니다.

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