PHP - 115 102 bytes
Uma solução em 155 bytes (agrupada aqui em 3 linhas para facilitar a leitura):
$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);
A segunda linha calcula (de dentro para fora) os valores exatos dos componentes começando com os microssegundos.
A versão mais curta (115 bytes, agrupada em duas linhas para facilitar a leitura):
$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);
Ele também usa atribuições incorporadas para calcular a conversão do número de microssegundos de entrada em milissegundos, segundos, minutos e horas usando números de ponto flutuante. O operador de módulo ( %
) e o formato do número decimal ( %d
) de printf()
são usados para forçá-los a números inteiros (a parte fracionária é ignorada).
Outra solução que usa as funções de data (102 bytes)
$u=$argv[1];
echo gmdate("H:i:s",strtotime("@".substr($u,0,-6))),":",substr($u,-6,3),":",substr($u,-3);
A parte hours: minutes: seconds é tratada pelas funções de data do PHP gmdate()
e strtotime()
, os mil e microssegundos são extraídos como seqüências de caracteres do valor de entrada.
Uso:
$ 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
hh:mm:ss.000000
provavelmente teria sido melhor (e mais fácil). Ainda assim, não posso mudar isso agora.