Вызов
Ваша задача - написать программу, которая раз в секунду (в том числе сразу после запуска вашей программы) печатает время, прошедшее с момента запуска вашей программы.
правила
- Время должно быть напечатано в
hh:mm:ss
формате. (начальные нули для однозначных значений) - Метки времени должны быть разделены CR, LF или CRLF. (без пробелов)
- Новое время должно появляться каждую секунду. (стандартный вывод не может быть буферизован на секунду)
- Поведение программы, если она запускается после 23:59:59, не определено.
- Вы можете использовать,
sleep(1)
даже если определенная секунда может быть пропущена всякий раз, когда накладные расходы на печать, вычисление, зацикливание и т. Д. Накапливаются до секунды.
Пример вывода:
00:00:00
00:00:01
00:00:02
00:00:04
00:00:05
⋮
Обратите внимание, что 00:00:03
здесь отсутствует из-за накладных расходов на обработку. Фактические пропущенные значения (если таковые имеются), конечно, зависят от реализации и / или системы.
Эталонная реализация в C: (только POSIX-совместимые системы)
#include <unistd.h> // sleep()
#include <tgmath.h>
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#ifndef __STDC_IEC_559__
#error "unsupported double"
#endif
static_assert(sizeof(double) == 8, "double must have double precision");
#define MAX_PRECISE_DOUBLE ((double)(1ULL << 52))
int main(void) {
time_t start = time(NULL);
if (start == (time_t)-1) return EXIT_FAILURE;
while (1) {
time_t now = time(NULL);
if (now == (time_t)-1) return EXIT_FAILURE;
double diff = difftime(now, start);
if (isnan(diff) || diff < 0) return EXIT_FAILURE;
if (diff > MAX_PRECISE_DOUBLE) return EXIT_FAILURE;
unsigned long long seconds = diff;
unsigned long long h = seconds / 3600;
seconds %= 3600;
unsigned long long m = seconds / 60;
seconds %= 60;
unsigned long long s = seconds;
(void)printf("\r%02llu:%02llu:%02llu", h, m, s);
(void)fflush(stdout);
(void)sleep(1);
}
}
Критерии победы
Это код-гольф , самый короткий код в байтах выигрывает!
Ответы:
MATL ,
1716 байтПопробуйте это в MATL Online!
Как это работает
источник
Язык сценариев работы Flashpoint ,
174171 байтВ бою:
158 байт, если предыдущий раз перезаписан на следующий раз:
Технически возврат каретки не используется, поэтому я не уверен, ограничивается ли эта версия правилами.
источник
CR
не будет перезаписывать строку. В самом деле,CRLF
,LFCR
иLF
все семантически эквивалентны.Bash + coreutils,
2826 байтНепечатаемый символ между
+
и%
является байтом ESC .Это устанавливает системное время на 00:00:00 и, следовательно, требует привилегий root. Это также предполагает, что часовой пояс - UTC и что никакие другие процессы не будут мешать системным часам.
Каждое новое время сбрасывает терминал, перезаписывая, таким образом, предыдущий.
Bash + coreutils,
3829 байтПрименяются те же ограничения, что и раньше. Каждое новое время отображается в новой строке.
источник
date
от остальных с помощью небольшого перевода строки. Но это может быть слишком приятно для кого-то, способного придумать что-то вроде вашего второго решения> :-(date -s0
печатает новое время в STDOUT; Я использую трубу, чтобы заставить замолчать этот вывод.APL (Dyalog Unicode) , 51 байт
Полное тело программы.
Попробуйте онлайн! (Нажмите Ctrl + Enter, чтобы начать, и снова, чтобы остановить.)
⎕AI
Ccount Я нформация (идентификатор пользователя, вычислить время, время соединения, время манипуляция)s←
назначитьs
(для с терпким времени)⎕AI-s
вычитаютs
из⎕AI
3⊃
выберите третий элемент (время соединения в миллисекундах),0 60 60 1E3⊤
преобразуйте в этот смешанный радикс,3↑
возьмите первые 3 (отбрасывает миллисекунды)100+
сотню, добавленную к каждому (для':'@1∘⍕¨
дополнения нулями) поправки с двоеточием в первом символе строкового представления каждого∊
ϵ nlist (flatten)1↓
отбрасывает первое двоеточие (и неявно печатает в stdout)⎕DL 1
Д е л ау один второй→2
перейти к строке номер дваисточник
R ,
5944 байтаF
в R по умолчанию используетсяFALSE
, но это обычная переменная, которую можно переопределить. Когда используется в арифметике,FALSE
приводится к0
. ЗапрашиваемаяF+1
поэтому возвращается1
. ЗададимF
бытьF+1
, формат это красиво, печать, и ждать в течение одной секунды. Продолжается до бесконечности.Не работает на TIO (из-за отсутствия
hms
пакета), но вот пример вывода с моей машины:источник
Баш + сон + дата,
также 504947464541 байтЧтобы пройти круг, быстро нажмите ^ C, запустите это и затем запустите снова:
Для сброса:
Синтаксис $ [s ++], кажется, все еще работает, но больше не (AFAICS) документирован на
bash
странице руководства . И это все еще на байт короче, чем использование цикла for ((...)), как только я удалил кавычки вокруг него.источник
$[]
является устаревшей / недокументированной, но все еще поддерживаемой формой$(())
. Я не уверен, широко ли он используется в ответах по коду-гольфу, но общее правило заключается в том, что ваш код должен работать как минимум с одной версией интерпретатора для вашего языка. ИМО это нормально.s=0
не требуется, так как арифметическая подстановка будет рассматривать неустановленную переменную как 0 .-u
также не требуется, если вы просто предполагаете часовой пояс по умолчанию (UTC).Swift , 144 байта
объяснение
источник
JavaScript (ES6), 99 байт
источник
Matlab (R2016b), 50 байтов
Объяснение:
Альтернативная версия (50 байтов тоже: P):
источник
:)
t
? Кроме того, входные данныеdatestr
86400
Юлия 0,6 ,
7568 байтПопробуйте онлайн!
При разрешенном sleep (1) простые вложенные циклы for короче, чем при использовании встроенных методов обработки времени Julias.
Старое решение без сна (1) с использованием DateTime
t
количество времени, прошедшее с «дня 0» до момента запуска программы.now()-t
это момент времени , который затем форматируется с помощьюDates.format()
.t0=now(); ...; now()-t0
даст разницу во времени , которая не может быть использована сDates.format()
.Время само по себе тривиально со встроенным
Timer
.источник
Python 2 , 85 байт
кредиты
источник
"%02d:%02d:%02d"
на(":%02d"*3)[1:]
%24
, поведение не определено после23:59:59
.JavaScript (ES6), 88 байт
По сути тот же подход, что и в ответе @ darrylyeo , но он работает для всех часовых поясов и использует немного другой способ добраться до 0.
[Править] Ответ Дэррила был исправлен. Это все еще короче, хотя.
источник
> <> , 82 + 7 = 89 байт
Попробуйте онлайн!
+7 байт за использование флага,
-t.0125
чтобы каждая инструкция занимала 1/80 секунды. Каждый цикл имеет 80 инструкций, каждый цикл занимает одну секунду. Из-за времени вычислений, это на самом деле дольше на практике.Я на самом деле был в буфер это все, вплоть до 100 , пока я не увидел @Not дерево в ответ , который имел 7 байт лучше, чем мой , чтобы генерировать часы и минуты, подрезки ниже 80. Кроме того, они вдохновлены, использование
\/
которых выполняются два раза за цикл.Как это работает
Бонус:
Однострочная версия того же размера, 80 + 9 байт:
Это использует
-a
флаг, чтобы добавить галочки для пропущенных инструкций.источник
PHP 4+,
7064 байтаPHP 5.3+,
6963 байтаисточник
Python 3 , 112 байт
Допустим, что использовать задержку в 1 секунду можно, даже если (редко) она может пропустить секунду.
источник
VBA, 90
запуск в непосредственном окне: ожидаемая точка отказа где-то около 23 миллионов лет (разрешение с плавающей точкой не удается ~ 8.5e9 дней)
источник
Желе , 23 байта
Попробуйте онлайн!
источник
AWK ,
1108786 байтовНе работает в TIO.
источник
00:00:00
в момент запуска.APL (Dyalog) , 37 байт
Попробуйте онлайн!
Полная программа.
Очень похоже на ответ Адама, однако написано независимо и использует
⎕AI
неосновной подход.источник
Bash + coreutils + GNU date, 50 байтов
Вдохновленный @Dennis, это решение не требует изменения времени. Он хранит начальное смещение с настоящего времени до эпохи UNIX (1 января 1970 г. 00:00:00 UTC) в «o», а затем отображает [-ud опции] (текущее время - смещение) в дате UTC, но только [+% X опция] ЧЧ: ММ: СС. Это должно работать в странах, где текущий часовой пояс не является UTC.
источник
Чисто ,
173172168 байтЭтот работает только в пакетах Windows Clean.
Добавьте 3 байта, если вы хотите, чтобы он работал под Linux, как Clean для
CLK_PER_TICK :== 1000000
* nix. Если вы хотите, чтобы он был кроссплатформенным, вместо этого добавьте 8 байтов, так как вам нужно использоватьCLK_PER_TICK
вместо значения, которое он установлен. ( Ссылка TIO больше из-за выше )Попробуйте онлайн!
источник
Python 2 , 69 + 3 (
TZ=
) = 72 байтаЭто выполняется в непрерывном цикле без ожидания, обновляя время в той же строке, а не печатая новую строку каждую секунду. (Надеюсь, все еще разрешено правилами)
Эта немного более длинная версия (72 + 3 = 75 байт) вместо этого печатает на новой строке каждую секунду:
Оба из них требуют, чтобы вы были в часовом поясе UTC. В Linux вы можете добиться этого, установив
TZ
переменную окружения. НапримерTZ= python
.источник
> <> ,
106 байт82 + 9 = 91 байтСпасибо Джо Кинг за предложение
-a
флага! Проверьте их ответ тоже.Попробуйте онлайн! (но вам придется подождать 60 секундный тайм-аут).
Мне пришлось использовать функцию> <>, которая мне никогда не была нужна раньше: для этого кода требуется флаг
-t.0125
, который устанавливает скорость выполнения 0,0125 секунды на такт или 80 тактов в секунду. Также есть-a
флаг, который заставляет пробельные символы считаться галочкой (в некоторых случаях - интерпретатор немного странный по этому поводу).По сути, код сохраняет счетчик, который увеличивается каждый раз, когда рыба проходит цикл, а остальная часть цикла преобразует счетчик в
hh:mm:ss
формат и печатает его. Цикл занимает ровно 80 тиков.Это должно работать теоретически, но на практике каждый тик немного длиннее 0,0125 секунд из-за времени вычислений. Изменение
\\
на второй строке<<
дает более точные тайминги на TIO.Вы также можете посмотреть код в действии на рыбной площадке , за исключением того, что этот интерпретатор немного отличается от официального переводчика. Кроме того, вы можете убрать флаги на TIO, чтобы код работал с максимальной скоростью, чтобы проверить поведение раз в течение одной минуты.
источник
\!
и удалив два лишних<
. Еще пара байтов, если вы используете-a
флаг, который считает пробелы и пропущенные инструкции как-a
флаг позволил мне играть в гольф немного больше, спасибо! Я думаю, что вы можете использовать\!
хитрость и в своем коде: попробуйте онлайн!Java 8, полная программа, 150 байт
Попробуйте это здесь (время ожидания истекло через 60 секунд, поэтому я установил для режима сна значение 1, чтобы увидеть больше выходных данных).
Объяснение:
Java 8, функция, 94 байта
Попробуйте это здесь (время ожидания истекло через 60 секунд, поэтому я установил для режима сна значение 1, чтобы увидеть больше выходных данных).
Объяснение:
Вот небольшой рисунок, чтобы увидеть, что он работает, как предполагалось, при использовании 1000 мс:
источник
PHP,
5948 байтВдохновленный ответ Даррен Эйч .
Старая версия :
источник
-3600
, что сэкономило бы 5 байт.Оболочка , 177 байт
Обратите внимание, что это не полностью соответствует POSIX, потому что он использует
date +%s
, что является распространеннымdate
расширением.источник
Рубин,
192117 байт (Кредит Дада)Как это работает?
Собираемся использовать расширенную версию (преобразование во время дается как отдельная функция и использует другой формат вывода):
источник
printf
вместо этогоputs
можно сэкономить еще несколько байтов: попробуйте онлайн! , Удачного игры в гольф на PPCG!APL NARS,
109 6357 символов3 + 3 + 48 + 3 = 57 (видел другие решения Apl тоже)
преобразуйте INT ⍵ в строку цифр таким образом, если длина этой строки равна 1, а затем добавьте один «0» перед ним
объединить массив в ⍵ с массивом '::'
источник
машинный код x86-64 (системный вызов Linux): 78 байт
RDTSC спин-цикл синхронизации,
sys_write
системный вызов Linux .x86-64 не предоставляет удобный способ запроса частоты опорных часов RDTSC во время выполнения. Вы можете прочитать MSR (и сделать расчет на основе этого) , но для этого требуется режим ядра или root + открытие
/dev/cpu/%d/msr
, поэтому я решил сделать частоту постоянной времени сборки. (ОтрегулируйтеFREQ_RDTSC
при необходимости: любая 32-битная константа не изменит размер машинного кода)Обратите внимание, что процессоры x86 в течение нескольких лет имели фиксированную частоту RDTSC, поэтому ее можно использовать как источник времени, а не как счетчик производительности тактового цикла ядра, если вы не предпримете шаги, чтобы отключить изменения частоты. (Существуют фактические счетчики производительности для подсчета реальных циклов ЦП.) Обычно он работает с номинальной частотой наклейки, например, 4,0 ГГц для моего i7-6700k, независимо от турбо или энергосбережения. В любом случае, это время ожидания занятости не зависит от средней нагрузки (как откалиброванная петля задержки), а также не чувствительно к энергосбережению процессора.
Этот код будет работать для любого x86 с эталонной частотой ниже 2 ^ 32 Гц, то есть до ~ 4,29 ГГц. Кроме того, младшие 32 метки времени будут полностью перенесены за 1 секунду, поэтому мне также придется взглянуть на
edx
старшие 32 бита результата.Резюме :
нажмите
00:00:00\n
на стек. Тогда в цикле:sys_write
системный вызовcmp
/cmov
, с результатом CF обеспечивает перенос следующей цифры.rdtsc
и сохранить время начала.rdtsc
до тех пор, пока дельта не станет равной тикам в секунду частоты RDTSC.NASM листинг:
Раскомментируйте
pause
инструкцию, чтобы сэкономить значительную мощность: это нагревает одно ядро на ~ 15 градусов C безpause
, но только на ~ 9 сpause
. (На Skylake, гдеpause
спит ~ 100 циклов вместо ~ 5. Я думаю, что это сэкономило бы больше, если быrdtsc
не медленная скорость, поэтому процессор не занимал много времени).32-разрядная версия была бы на несколько байтов короче, например, при использовании 32-разрядной версии для вставки начальной строки 00: 00: 00 \ n.
А также используя 1 байт
dec edx
.int 0x80
Системный вызов ABI не будет использовать еси / ЭОД, поэтому установка регистра для системных вызовов против LODSB / STOSB может быть проще.источник
nanosleep
системный вызов, но это было более интересно. С помощью root в Linux можно прочитать правильную MSR и программно получить частоту RDTSC.q / kdb + , 40 байтов
Решение:
Пример:
Объяснение:
Здесь выполняются три команды:
.z.ts:{-1($)18h$a+:1}; / override timer function
a:-1; / initialise variable a to -1
(.)"\\t 1000" / start the timer with 1000ms precision
Разбивка функции таймера:
Бонус:
Вариант 1 для 41 байта :
Альтернатива 2 для 26 + 7 байтов = 33 байта
и добавление в
-t 1000
качестве аргументов в двоичный файл q.источник