マイクロ秒を時間:分:秒などの形式にします


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'

Pythonで209バイトのソリューションがありますが、それより低くすることはできますか?


1
私は今、これが実際に時間を書くための標準形式ではなく、hh:mm:ss.000000おそらくより良い(そしてより簡単だった)ことを理解しています。それでも、今では変更できません。
サム

1
好奇心から、SOポストは何でしたか?
デジタル外傷

比較的新しいユーザーによる@DigitalTrauma stackoverflow.com/questions/31251377。正解はすでに選択されていて、IDLEで遊んでいるだけで、グロテスクに見える辞書の理解ができましたが、これは質問に対する特に良い答えではありませんでした。誰かがそれを見て、このサイトをコメントで指摘しました。私はここに来て、質問を書きました(SOの投稿とは少し異なります)。また、私の回答の大幅に改善されたバージョンを投稿しました(これは投稿していません。 。
サム

入力の時間数に制限はありますか?
FUZxxl

はい、任意に86400000000マイクロ秒以下にしたので、24時間以内になりました。
サム

回答:


15

Python 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

Bash + coreutils、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の答えを見ているとは思いません...
ジェリーエレミヤ

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
オンラインコンパイラー 言い換えれば、怠zyな人としてどのように実行するのですか?
オプティマイザー

32ビットバージョンはkx.com
skeevey

良いスポット。残念ながら、修正によりいくつかの文字が追加されます
-skeevey

1
あなたはここに多くのバイトをカットすることができます":"sv 0 8 11__[;8]15$2_($)"n"$1e3*
WooiKentリー

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->...ます。

Ungolfed +説明:

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の答え:-)インスピレーションを得たので、あなたは私の票を取得
ホキ

3

C#、179 175バイト

ビルトインを自由に使用できる場合、それらを使用してみませんか?

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

Excel、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

Perl、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
リトシアスト

代わりにchomp($n=<STDIN>);-nフラグ(1文字としてカウントされます)を使用してワンライナーとして実行できます。また、int(..)それぞれの周りを必要としません$_。トーマスのヒントも当てはめることができますしecho 12345678900 | perl -ne'printf"%02d:%02d:%02d:%03d:%03d\n",$_/36e8,$_/6e7%60,$_/1e6%60,$_/1e3%1e3,$_%1e3'、もっと短い方法もあるかもしれません!
hmatt1

\n出力文字列にもを必要としません。文字列を次のように置き換えることもできます"%02d:"x3 ."%03d:%03d"
hmatt1

@chilemagic「エコー」の使用はバイトの増加としてカウントされますか?
ASCIIThenANSI

@ASCIIThenANSIそれはあなたのプログラムの一部ではないからです。カウントする文字は、単一引用符の間の文字です。つまりprintf"%02d:%02d:%02d:%03d:%03d\n",$_/36e8,$_/6e7%60,$_/1e6%60,$_/1e3%1e3,$_‌​%1e3-nフラグに追加のバイトを追加します。-nleたとえば、使用した場合、追加の2としてカウントされます(nおよびl)。あなたは、取得-および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、文字列を返すします。

それはのベクトル化の組み合わせを使用していますfixし、mod表示し、その後、時間要素を分離します。

出力文字列の書式設定には、計算自体よりも多くの時間がかかるのが少しイライラします...

テスト:

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部分に組み込み関数を使用します。これはマイクロ秒を処理できないため、文字列はfixandの組み合わせで完了しmodます


1

JavaScriptの(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バイト

編集:さらにいくつかのバイトを追い払った

修正:一部のユーザーのおかげでlong型が削除された

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を想定し、明日修正しました。
アンドレアビオンド


0

Powershell、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 92 102バイト

最初の反復:基本的なアイデア。

2回目の反復:より小さな定数

3回目の反復:1桁の部分の正しい書式設定。

この関数を機能させるには、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);

2行目は、マイクロ秒から始まるコンポーネントの正確な値を(内部から外部へ)計算します。

短いバージョン(115バイト、読みやすいように2行にラップ):

$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

Java、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.