Форматуйте мікросекунди у вигляді годин: хвилин: секунд тощо


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
З цікавості, якою була посада ТА?
Цифрова травма

@DigitalTrauma stackoverflow.com/questions/31251377 порівняно новим користувачем. Правильна відповідь вже була обрана, я просто розігрувався в IDLE і придумав гротескний погляд словника, який не був особливо хорошою відповіддю на питання. Хтось це побачив і вказав цей сайт у коментарі. Я прийшов сюди, написав запитання (дещо інше до посади ЗО), а також написав значно вдосконалену версію своєї відповіді (яку я ще не опублікував і яка тепер є зайвою для всіх набагато більш компактних і образних відповідей нижче) .
Сем

Чи існує обмеження кількості годин на введенні?
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:]

Побудує рядок, повторюючи ряд рядків. Єдиний фантазійний біт - це те %7/2, що карти 1000 -> 3і 60 -> 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
Відповіді на С повинні бути повноцінною, програмою; не фрагмент.
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
будь-які онлайн-компілятори? іншими словами - Як я можу це запустити, як лінива людина?
Оптимізатор

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"

Хороший. Ви отримаєте мій голос, тому що ви надихнули мою відповідь
Матлаба

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 байт коду, +1 для -nпрапора. Виконати з:

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

Завдяки Томасу Ква і хілемагіку за скорочення розміру коду майже вдвічі.


Я думаю, що 3600000000може бути 36e8.
lirtosiast

Замість цього chomp($n=<STDIN>);можна запустити його як однолінійку з -nпрапором (який вважається одним символом). Ви також не потребуєте 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

Матлаб - 88 89 байт

Отримав один байт з розчином, не використовуючи вбудовану функцію:

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 частини, яка не може працювати з мікросекундами, тому рядок завершується комбінацією fixта 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 Без першої перевірки я можу отримати лише діапазон 0 ≤ n <86400000000, оскільки 8.64e10 перекинеться на наступний день.
rink.attendant.6

О так, я пропустив це. toJSON () замість toISOString ()?
edc65

1

C, 113 103 105 байт

EDIT: відштовхнув ще кілька байтів

Виправлення: видалено довгий тип, завдяки деякому користувачеві

Не найкоротша відповідь на С, але я повеселився з поверненням перевезення, тому відчув, що комусь це може сподобатися.

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;
}

Залежно від платформи, "довге" може бути всього 32-бітним. (див. en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models ). Я уникнув проблеми, оголосивши "f" як макрос замість функції.
якийсь користувач

Я помітив що. Я припускав GCC на x64, виправляючи це завтра.
Андреа Біондо


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 байт

Перша ітерація: Базова ідея.

Друга ітерація: Менші константи

Третя ітерація: правильне форматування для однозначних ділянок.

Зверніть увагу, що цій функції потрібно надати 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 - 115 102 байти

Рішення в 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);

Він також використовує вбудовані завдання для обчислення конвертованого вхідного числа мікросекунд у мілісекунди, секунди, хвилини та години, використовуючи числа з плаваючою комою. Оператор модуля ( %) та формат десяткових чисел ( %d) of printf()потім використовуються для примушення їх до цілих чисел (дробова частина ігнорується).

Ще одне рішення, яке використовує функції дати (102 байти)

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

Години: хвилини: секунди частина обробляється з допомогою функцій дати РНР 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;}

Метод fробить деякі розрахунки щодо nвідпрацювання годин, хвилин тощо та делегує методу, 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.