마이크로 초를시 : 분 : 초 등으로 포맷


28

다음은 오늘 Stack Overflow에서 제기 된 질문에서 영감을 얻은 것 입니다 .

여러 마이크로 초 0 <= n <= 86400000000(예 :)가 주어진 경우 12345678900형식화 된 문자열을 출력합니다 (예 hh:mm:ss:000:000:) 03:25:45:678:900.

          0 -> '00:00:00:000:000'
12345678900 -> '03:25:45:678:900'
86400000000 -> '24:00:00:000:000'

파이썬에서 209 바이트의 솔루션이 있지만 더 낮아질 수 있습니까?


1
나는 이것이 실제로 쓰기 시간의 표준 형식이 아니며 hh:mm:ss.000000아마도 더 좋았을 것입니다. 그래도 지금은 갈 수 없습니다.
Sam

1
호기심에서 SO 게시물은 무엇입니까?
디지털 외상

비교적 새로운 사용자에 의한 @DigitalTrauma stackoverflow.com/questions/31251377 정답이 이미 선택 되었기 때문에 방금 IDLE에서 놀고 있었고 질문에 대한 답이 아닌 그로테스크 한 사전 이해력을 생각해 냈습니다. 누군가가 그것을보고 의견 에이 사이트를 지적했다. 나는 여기에 왔고, 질문을 작성했으며 (SO 게시물과 약간 다름), 훨씬 개선 된 내 답변 버전을 작성했습니다 (이 글은 게시하지 않았으며 아래의 훨씬 더 작고 상상력이 풍부한 모든 답변에 중복됩니다) .
Sam

입력 시간에 제한이 있습니까?
FUZxxl

예, 임의로 <= 86400000000 마이크로 초로 만들었으므로 <= 24 시간입니다.
Sam

답변:


15

파이썬 2, 82 79 바이트

n=input()
o=""
for k in[1000]*2+[60]*3:o=":%0*d"%(k%7/2,n%k)+o;n/=k
print o[1:]

일련의 divmod를 반복하여 문자열을 작성합니다. 유일한 멋진 비트는 것입니다 %7/2매핑하는 1000 -> 360 -> 2.


6

Pyth, 31 바이트

j\:_m>l`td+"00"%~/QddCM"ϨϨ<<<

온라인으로 사용해보십시오 : 데모

설명:

                                 implicit: Q = input number
                       "ϨϨ<<<   string "ϨϨ<<<" (5 chars but 7 bytes)
                     CM          convert each to number => [1000, 1000, 60, 60, 60]
    m                            map each number d to:
                 /Qd                divide Q by d
                ~                   and update Q with the new value
               %~ Q d               but use the old value to calculate Q mod d
          +"00"                     add the result to the string "00"
     >                              but only take the last 
      l`td                          len(str(d-1)) chars
   _                             revert order
j\:                              join the strings with ":"s

5

배쉬 + 코어 유틸리티, 61

지금까지 가장 짧은 "주류"언어 ...

a=%02d:
printf $a$a$a%03d:%03d `dc -e$1\ A00~rA00~r60~r60~rf`

테스트 출력 :

$ for t in 0 12345678900 86400000000; do ./usec.sh $t; echo; done
00:00:00:000:000
03:25:45:678:900
24:00:00:000:000
$ 


4

C, 97 바이트

q=1000,s=60;
#define f(n)printf("%02d:%02d:%02d:%03d:%03d",n/s/s/q/q,n/s/q/q%s,n/q/q%s,n/q%q,n%q)

테스트 코드 :

int main(int intc, char **argv)
{
    long long n = atoll(argv[1]);
    f(n);
}

1
C의 답변은 완전한 프로그램이어야합니다. 발췌문이 아닙니다.
NobodyNada-복원 모니카

질문에 언급되지 않았습니다. 글로벌 요구 사항이 있습니까?
일부 사용자


아니요. 답을 읽으면 C를 예로 사용합니다. 이 규칙은 모든 언어에 적용되었을 것입니다. 또한, 답변은 매우 논쟁의 여지가 있습니다-가장 높은 평가 의견을 참조하십시오. 결론은 전체 프로그램이 필요한 경우 질문에 명확하게 설명해야한다는 것입니다.
일부 사용자

3
이 사이트에 대한 많은 답변은 전체 프로그램 대신 함수를 사용합니다. 예를 들어, 완전한 프로그램 인 Java 답변을 본 적이 없다고 생각합니다.
Jerry Jeremiah

4

q (34)

더 짧을 수 있다고 확신합니다

":"sv 0 8 11__[;8]15$2_($)16h$1e3*

예 :

q)f:":"sv 0 8 11__[;8]15$2_($)16h$1e3*
q)f 12345678900
"03:25:45:678:900"

4
온라인 컴파일러? 즉, 게으른 사람으로 어떻게 실행합니까?
Optimizer

32 비트 버전은 kx.com
skeevey

좋은 자리. 불행히도 수정은 몇 문자를 추가합니다
skeevey

1
더 많은 바이트를 줄일 수 있습니다":"sv 0 8 11__[;8]15$2_($)"n"$1e3*
WooiKent Lee

3

줄리아, 110 96 95 바이트

t->(o="";for i=int([36e8,6e7,1e6,1e3,1]) x,t=t÷i,t%i;o*=lpad(x,i>1e3?2:3,0)*":"end;o[1:end-1])

이것은 정수를 입력으로 받아들이고 문자열을 반환하는 명명되지 않은 함수를 만듭니다. 호출하려면 이름을 지정하십시오 (예 :) f=t->....

언 골프 + 설명 :

function f(t)
    # Initialize an output string
    o = ""

    # Loop over an array consisting of the number of microseconds in
    # an hour, minute, second, millisecond, and microsecond
    for i = int([36e8, 6e7, 1e6, 1e3, 1])

        # Get the quotient and remainder for microseconds into t,
        # setting t to be the remainder
        x, t = t ÷ i, t % i

        # Left-pad x with zeroes and append it to the output
        o *= lpad(x, i > 1e3 ? 2 : 3, 0) * ":"
    end

    # o has a trailing :, so return everything but the last character
    o[1:end-1]
end

예 :

julia> f(12345678900)
"03:25:45:678:900"

julia> f(0)
"00:00:00:000:000"

julia> f(86400000000)
"24:00:00:000:000"

좋은데 Matlab의 답변에 영감을 주었으므로 투표권을 얻었습니다. :-)
Hoki

3

C #, 179175 바이트

당신이 처분에 내장을 가지고 있다면, 왜 그들을 사용하지 않습니까?

static void Main(string[]a){var t=TimeSpan.FromTicks(long.Parse(Console.ReadLine())*10);Console.Write(t.ToString((t.Days<1?"hh":@"\2\4")+@"\:mm\:ss\:ffffff").Insert(12,":"));}

더 나은 형식으로 :

static void Main(string[]a){
    var t = TimeSpan.FromTicks(long.Parse(Console.ReadLine())*10);
    Console.Write(t.ToString((t.Days<1?"hh":@"\2\4")+@"\:mm\:ss\:ffffff").Insert(12,":"));
    Console.Read();
}

3

엑셀, 65 63 자

마이크로 초가 A1에 있다고 가정합니다 .

=TEXT(A1/50/1200^3,"[HH]:mm:ss:")&RIGHT(TEXT(A1,"000\:000"),7)

산출:

        A              B
1            0  00:00:00:000:000
2  12345678900  03:25:46:678:900
3  86400000000  24:00:00:000:000

2

펄, 141 78 바이트

printf"%02d"x3.%03d:%03d",$_/36e8,$_/6e7%60,$_/1e6%60,$_/1e3%1e3,$_‌​%1e3

77 바이트의 코드, -n플래그의 경우 +1 로 실행 :

echo 12345678900 | perl -ne'printf"%02d"x3.%03d:%03d",$_/36e8,$_/6e7%60,$_/1e6%60,$_/1e3%1e3,$_‌​%1e3'

내 코드 크기를 거의 절반으로 줄인 Thomas Kwa와 chilemagic에게 감사합니다.


나는 3600000000될 수 있다고 생각 한다 36e8.
lirtosiast

대신 플래그 (1 문자로 계산) chomp($n=<STDIN>);와 함께 하나의 라이너로 실행할 수 있습니다 -n. 당신은 또한 int(..)각 주위를 필요로하지 않습니다 $_. Thomas의 팁을 적용하면 팁을 얻을 echo 12345678900 | perl -ne'printf"%02d:%02d:%02d:%03d:%03d\n",$_/36e8,$_/6e7%60,$_/1e6%60,$_/1e3%1e3,$_%1e3'수 있으며 더 짧은 방법도 있습니다!
hmatt1

\n출력 문자열에도 in이 필요하지 않습니다 . 문자열을"%02d:"x3 ."%03d:%03d"
hmatt1로

@chilemagic "echo"를 사용하면 바이트 수가 증가합니까?
ASCIIThenANSI

@ASCIIThenANSI 프로그램의 일부가 아니기 때문에 아닙니다. 계산할 문자는 작은 따옴표 사이의 문자입니다. 즉 플래그에 printf"%02d:%02d:%02d:%03d:%03d\n",$_/36e8,$_/6e7%60,$_/1e6%60,$_/1e3%1e3,$_‌​%1e3추가 바이트를 추가합니다 -n. -nle예를 들어 사용한 경우 추가 2 ( nl)로 계산됩니다. 당신은 얻을 -과을 e(또는 E당신이 사용해야하는 경우 say) 무료.
hmatt1

1

MATLAB-88 89 바이트

내장 함수를 사용하지 않고 솔루션으로 1 바이트를 얻었습니다.

n=[36e8,6e7,1e6,1e3];f=@(t)sprintf('%02d:%02d:%02d:%03d:%03d',fix([t mod(t,n)]./[n 1]))

숫자 입력 인수를 취하는 인라인 함수를 작성하십시오. t 하고 문자열을 반환 .

그것의 조합을 사용 벡터화 fixmod시간 요소를 분리하기 위해, 다음 디스플레이.

출력 문자열의 형식이 계산 자체보다 훨씬 많이 걸리는 것은 약간 실망 스럽습니다 ...

테스트:

for t=[0 12345678900 86400000000]
    f(t)
end

ans =
00:00:00:000:000
ans =
03:25:45:678:900
ans =
24:00:00:000:000

89 바이트 버전 :

f=@(t)sprintf('%s:%03d:%03d',datestr(fix(t/1e6)/86400,13),fix(mod(t,1e6)/1e3),mod(t,1e3))

숫자를 나누고 hh : mm : ss 부분에 내장 함수를 사용합니다. 마이크로 초를 처리 할 수 ​​없으므로 문자열이 조합 fixmod연산으로 완료 됩니다


1

자바 스크립트 (ES6) 128 118 116 111 바이트

이것에는 아마도 골프 잠재력이있을 것입니다.

f=t=>(t<864e8?new Date(t/1e3).toJSON().slice(11,-1):`24:00:00:000`).replace(`.`,`:`)+':'+('00'+t%1e3).slice(-3)

데모

ES6이므로 Firefox 만 가능합니다.

f=t=>(t<864e8?new Date(t/1e3).toJSON().slice(11,-1):`24:00:00:000`).replace(`.`,`:`)+':'+('00'+t%1e3).slice(-3)

// DEMO
document.body.innerHTML += '<br>' + f(0);
document.body.innerHTML += '<br>' + f(12345678020);
document.body.innerHTML += '<br>' + f(86400000000);


질문이 명백하기 때문에 첫 번째 점검은 필요하지 않습니다. 0 <= n <= 86400000000
edc65

@ edc65 첫 번째 확인이 없으면 8.64e10이 다음날 롤오버되므로 0 ≤ n <86400000000 범위 만 얻을 수 있습니다.
rink.attendant.6

아 맞다. toISOString () 대신 toJSON ()?
edc65

1

C, 113 103 105 바이트

편집 : 더 많은 바이트를 밀어 넣었습니다.

FIX : 일부 사용자 덕분에 긴 타입 제거

가장 짧은 C 답변은 아니지만 캐리지 리턴에 재미가있어서 누군가가 이것을 좋아할 것 같은 느낌이 들었습니다.

i,k,p=16;
#define f(n)for(;i<5;p-=i++<2?4:3)k=i<2?1000:60,printf("%0*d%c\r",p,n%k,i?58:13),n/=k;puts("");

다음과 같이 호출하십시오.

int main() {
    long long n = 12345678900;
    f(n);

    return 0;
}

플랫폼에 따라 "long"은 32 비트 일 수 있습니다. ( en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models 참조 ) 함수 대신 "f"를 매크로로 선언하여 문제를 피했습니다.
일부 사용자

난 그것을 알아 챘다. 나는 x64에서 GCC를 가정하여 내일 수정했습니다.
Andrea Biondo


0

파워 쉘, 153

$t=[timespan]::FromTicks(($a=$args[0]));"{0:D2}:{1:D2}:{2:D2}:{3:D3}:{4:000}"-f
[int]($t.TotalHours),$t.Minutes,$t.Seconds,$t.Milliseconds,(($a%1e4)/10)

용법

powershell -nologo .\modprintsec.ps1 123456789000    
03:25:45:678:900   
powershell -nologo .\modprintsec.ps1 864000000000   
24:00:00:000:000   
powershell -nologo .\modprintsec.ps1 0   
00:00:00:000:000 

0

F #, 111 92102 바이트

첫 번째 반복 : 기본 아이디어.

두 번째 반복 : 작은 상수

세 번째 반복 : 한 자릿수 부분의 올바른 형식입니다.

작동하려면이 함수에 int64가 제공되어야합니다.

let s,t=60L,1000L
let f n=sprintf"%02d:%02d:%02d:%03d:%03d"(n/s/s/t/t)(n/s/t/t%s)(n/t/t%s)(n/t%t)(n%t)

출력 예 :

f 0L           -> "00:00:00:000:000"
f 12345678900L -> "03:25:45:678:900"
f 86400000000L -> "24:00:00:000:000"

0

PHP- 115102 바이트

155 바이트의 솔루션 (가독성을 위해 3 줄로 줄 바꿈) :

$a=$argv[1];
$h=($a-($m=($a=($a-($s=($a=($a-($t=($a=($a-($u=$a%1000))/1000)%1000))/1000)%60))/60)%60))/60;
printf("%02d:%02d:%02d:%03d:%03d",$h,$m,$s,$t,$u);

두 번째 줄은 내부에서 외부로 마이크로 초로 시작하는 구성 요소의 정확한 값을 계산합니다.

더 짧은 버전 (115 바이트, 가독성을 위해 두 줄로 줄 바꿈) :

$u=$argv[1];$h=($m=($s=($t=$u/1000)/1000)/60)/60;
printf("%02d:%02d:%02d:%03d:%03d",$h,$m%60,$s%60,$t%1000,$u%1000);

또한 임베디드 대입을 사용하여 부동 소수점 숫자를 사용하여 밀리 초, 초, 분 및 시간 단위의 입력 마이크로 초 변환을 계산합니다. 그런 다음 모듈러스 연산자 ( %)와 10 진수 형식 ( %d) printf()을 사용하여 정수로 강제합니다 (소수 부분은 무시 됨).

날짜 함수 (102 바이트)를 사용하는 다른 솔루션

$u=$argv[1];
echo gmdate("H:i:s",strtotime("@".substr($u,0,-6))),":",substr($u,-6,3),":",substr($u,-3);

시간 : 분 : 초 부분은 PHP 일 함수에 의해 처리 gmdate()strtotime()상기 마이크로 밀리 초 입력 값의 문자열로 추출된다.

용법:

$ php -r '$u=$argv[1];echo gmdate("H:i:s",strtotime("@".substr($u,0,-6))),":",substr($u,-6,3),":",substr($u,-3);' 7198898787; echo
01:59:58:898:787

0

자바, 215 바이트

String f(long n){return p(n/3600000000l,2)+":"+p(n/60000000%60,2)+":"+p(n/1000000%60,2)+":"+p(n/1000%1000,3)+":"+p(n%1000,3);}String p(long n,int i){String s=String.valueOf(n);while(s.length()<i){s="0"+s;}return s;}

방법 fn시간, 분 등을 해결하기 위해 일부 계산 을 수행하고 메소드에 위임합니다.p 각 값을 올바르게 형식화 에 합니다.

형식화 :

String f(long n) {
    return p(n / 3600000000l, 2) + ":" + p(n / 60000000 % 60, 2) + ":" 
            + p(n / 1000000 % 60, 2) + ":" + p(n / 1000 % 1000, 3) + ":" + p(n % 1000, 3);
}

String p(long n, int i) {
    String s = String.valueOf(n);
    while (s.length() < i) {
        s = "0" + s;
    }
    return s;
}

용법:

public void demo() {
    long n = 12345678900l;
    System.out.println(f(n));
}

-1

루비-82 바이트

puts (t=Time.at(0,gets.to_i)).strftime("%2H:%2M:%2S:%3L:#{(t.usec%1000).to_s.rjust(3,?0)}")

2
그러나 나는 91 바이트를 세었다. 또한 UTC 시간대에서만 작동합니다.
jimmy23013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.