Реализуйте простой цифровой секундомер , который будет отображать время, прошедшее в секундах и минутах, как описано ниже.
Важный
Пожалуйста, прочтите разделы « Дисплей» и « Управление» !
дисплей
Время, прошедшее, должно отображаться в MM:SS
формате, заменяя ранее отображенную строку времени «на месте» (также допускается очистка всего экрана или его части).
Секундомер должен обновляться как минимум каждую секунду.
Примеры:
0 минут, 0 секунд
00:00
0 минут, 33 секунды
00:33
1 минута, 50 секунд
01:50
Первоначально вы можете начать с «00: 00» или с любого другого значения в диапазоне [00: 00-59: 59].
Как только ваш секундомер достигнет 59:59
, он должен сброситься 00:00
и продолжить заново.
Вы можете использовать другую базу (вместо десятичной) или даже другую систему счисления, если хотите, если вы следуете общей схеме.
Например 13:03
может отображаться как:
13:03
0D:03
N:D
10101:3
XIII:III
Помните, что если вы используете недесятичную систему счисления / основание, она должна быть закодирована с использованием печатных символов ASCII (или Unicode), например, использование двух двоичных (непечатных) байтов для минут и секунд недопустимо.
Вы также должны дополнить свой вывод нулями, если это необходимо, если ваша система счисления допускает это.
Замена символа разделителя :
любым другим печатным символом (включая цифры) также допустима.
управления
Секундомер должен начинаться с паузы и оставаться в этом состоянии до тех пор, пока пользователь явно не запустит его, нажав клавишу «управление» (см. Ниже).
Если во время подсчета секундомер пользователь снова нажимает клавишу «Control» , секундомер должен остановиться (с сохранением текущего времени), пока кнопка «Control» не будет нажата еще раз.
«Контроль» ключ может быть одним нажатием клавиши, например s
, или любую комбинацию клавиш, например Ctrl+Shift+X
, но это должно быть «атомное», нажав несколько клавиш в последовательности, например , s
тогда Enter
, это не допускается .
Одна и та же клавиша управления (или комбинация) должна использоваться для приостановки и возобновления работы секундомера.
Вы должны использовать определенный «управляющий» ключ, то есть «любой ключ» не допускается.
В качестве альтернативы, вы можете использовать один или два щелчка мышью вместо нажатия клавиши «контроль».
правила
- Это код-гольф , выигрывает самый короткий ответ в байтах;
- Применяются стандартные лазейки для игры в гольф;
- Ваша программа должна (теоретически) быть способной работать вечно.
источник
00:05
печати, а затем в какой-то момент возобновляется снова, должно ли00:06
отображаться 3000 миллисекунд после нажатия кнопки возобновления, или можно распечатать его целую секунду после нажатия кнопки возобновления?Ответы:
SmileBASIC,
867771 байтDIALOG
отображает текстовое поле на сенсорном экране.N
количество секунд, в течение которых текстовое поле будет оставаться на экране до его исчезновения. ЕслиN
это так0
, он остается до тех пор, пока пользователь не нажмет кнопку на сенсорном экране.DIALOG
Возвращает,1
если пользователь нажал кнопку, и0
закрылась ли она автоматически. Поэтому, когда пользователь нажимает кнопку паузы, он возвращается1
, и время отображения устанавливается на0
, останавливая секундомер. После того, как пользователь снова нажмет кнопку, мы снова установим время отображения1
, возобновив таймер. По сути, каждый раз, когдаDIALOG
возвращается1
, время отображения переключается между1
и0
с использованием!=
, что эквивалентно логическому XOR, если оба входа 1 или 0.источник
Python 2,
167129 байт-36 байт в основном * от идеи Малтисена по отлову
ctrl-c
с использованием исключения - иди кредит!-4 байта благодаря DLosc (init
n
иb
0 вместоf()
)-1 байт благодаря FlipTack (используйте,
p^=1
а неp=1-p
)-2 байта благодаря Felipe Nardi Batista (удалите спецификаторы точности)
Работает так же, как мой оригинал, ниже, но с последовательностью управляющих клавиш
ctrl+c
.(Проверено мной с Python 2.7.8 на Windows 7, 64-битная;
Протестировано Брайаном Минтоном с Python 2.7.13 на 64-битной Linux)
* также свернул
if
оператор для поиска в списке, чтобы получитьtry
как одну строку.Мой оригинал:
(Протестировано мной с Python 2.7.8 на Windows 7, 64-битная - однако этот код специфичен для Windows из-за использования
msvcrt
библиотеки)Клавиша управления - «р».
n
иb
инициализируются одинаковым значением при запуске, давая «смещение» 0;p
инициализируется в 0, указывая на приостановленное состояние.При каждом нажатии кнопки управления значение
p
переключается. При переключении из приостановленного состояния в активное состояниеb
обновляется до нового значения, сохраняя любое текущее смещение от предыдущих активных состояний с помощьюb-n
.Во время активного состояния
n
неоднократно обновляется до текущего времени по телефонуtime.time()
.Разница между
n
иb
,t
и составляет общее количество секунд (включая дробную часть), прошедших во время активного состояния (состояний).Затем истекают минуты,
t/60
и каждая из минут и секунд отображается в режиме 60 с(t/60%60,t%60)
. Ведущие нули добавляются к каждому с использованием форматирования строки целой части с помощью'...%0.2d...'
. Печать кортежа (завершающего,
), в котором первый элемент имеет возврат каретки (the\r
), приводит к перезаписи ранее напечатанного текста.источник
^=
но переключился в некоторый момент во время формулировки..
в%0.2d
? это работает так же хорошо, как%02d
Python -
160159143 байтаСпасибо @JonathanAllan за спасение мне 18 байт!
Используются только встроенные библиотеки, поэтому управляющий ключ
ctrl-c
, перехватывая его с помощьюexcept keyboardInterrupt
.источник
except:
? У меня есть рабочая версия моей работы ...утилиты bash + Unix, 90 или 93 байта
90-байтовая версия:
93-байтовая версия:
Ctrl-C - это символ возобновления / паузы. Пробел - это разделитель между минутами и секундами.
Разница между этими двумя версиями заключается в том, что 90-байтовая программа будет работать в течение 2 ^ 63 секунд (после этого bash даст мне целочисленное переполнение).
93-байтовая версия действительно будет работать вечно.
Первоначальная проблема включала требование: «Ваша программа должна (теоретически) быть способной работать вечно».
Если для выполнения этого требования достаточно выполнения 2 ^ 63 секунд, тогда 90-байтовое решение работает. Эта продолжительность более чем в 20 раз превышает возраст вселенной!
Если программа должна работать дольше, мне придется использовать 93-байтовое решение.
Я должен, вероятно, указать, что это решение, а также, по крайней мере, некоторые другие опубликованные, будут очень медленно отставать от истекшего истекшего времени. Это проскальзывание вызвано тем, что программа неактивна в течение одной секунды между каждым выполнением тела цикла, но тело цикла действительно занимает некоторое время. Это будет несущественным на практике.
источник
Initially, you can start with '00:00' or with any other value in range [00:00-59:59]
, которое будет отображаться на экране, пока вы не нажмете «control» в первый раз. Извините, если я не смог сформулировать это достаточно ясно!QBasic,
213211 байтКлавиша управления - вкладка. Выход из этого режима может привести к возгоранию ноутбука. Вы были предупреждены.
Вот оно в действии, пауза в 10, 15 и 20 секунд:
Разоблаченный и прокомментированный
Обратите внимание, что значения с
TIMER
плавающей точкой. Это не влияет на вывод, так какMOD
и\
обрезать до целых чисел. Но это добавляет точности к количеству сэкономленного времени: если вы сделаете паузу таймера непосредственно перед тиком, при повторном запуске вы увидите, что число меняется менее чем за секунду.источник
Пакет, 132 байта
Нажатие
n
будет (un) приостановить таймер. Выходное мерцание может быть уменьшено за счет трех (или четырех) байтов.источник
Чистый bash, 141 байт
Это использует только встроенные функции Bash (без внешних инструментов). Управляющий символ таков Ctrl-Z, что стандартная
SIGTSTP
обработка останавливает секундомер.set -m
включает управление заданиями , которое обычно отключено в сценарии.&
) .read -t 1
ждет одну секунду ввода от пользователя , затем завершается ошибкой.until
Цикл продолжается до тех пор , покаread
продолжает неудачу.printf
выводит правильно заполненное и отформатированное время$[s=s>3598?0:s+1,s/60]
арифметическое расширение сначала вычисляет обновленное время, проверяя, следует ли обернуть и иным образом увеличивая счетчик секундs
, а затем возвращает разделенное по этажам делениеs/60
.$[s%60]
дает остаток секунд.trap
обработчик, для которого генерируетсяTSTP
сигнал Ctrl-Z. Если Ctrl-Zнажать во время работы внешнего скрипта, он запуститсяfg>/dev/null
и вернет подоболочку обратно на передний план .>/dev/null
необходимо прекратитьfg
выводить команду subshell каждый раз.00:00
и посылаетSTOP
сигнал в дочерний процесс$!
, который будет приостановить процесс.read
ждет ввода навсегда, поддерживая скрипт.Если Ctrl-Zнажата, когда подоболочка предопределена, она приостановит выполнение и вернет внешний скрипт на передний план, где будет молча ждать. Если внешний сценарий предопределен, обработчик прерываний возобновит выполнение подоболочки и снова начнет отсчет.
источник
Javascript в консоли Chrome, 143 байта
При вводе в консоли он устанавливает счетчик на 00:00, а затем включает элемент управления, который является нажатием клавиши на документе.
Не так много магии, особенно
(i/60)|0
количество этажейСделано и протестировано в консоли Chrome
источник
m=s=g=i=0;(f=document).onclick=_=>g++;setInterval("g%2&&f.close(f.write(`${(m=i/60%60|0)>9?m:'0'+m}:`+((s=i++%60)>9?s:'0'+s)))",1e3)
HTML + JavaScript (ES6),
191 192 187 183174 байтаобъяснение
Нажмите на таймер, чтобы запустить или приостановить секундомер. Таким образом, один клик является клавишей управления . Разделителем между двумя значениями является двоеточие.
Всякий раз, когда пользователь нажимает кнопку,
b
проверяется значение. Инициализируется, для0
которого выполняется оценкаfalse
, поэтому строка кода оценивается каждые 1000 миллисекунд. Это устанавливает переменную в id интервала, поэтому ее можно остановить позже. Еслиb
содержит число, оно оцениваетсяtrue
, поэтому интервал останавливается. Это возвращает значениеundefined
, поэтому цикл продолжается.Строка кода изменяет html элемента с id
a
(секундомер). Сначала минуты анализируются путем взятия предыдущего значения секундомера, разделения его на двоеточие и получения значения минут, которое увеличивается на 0, если значение секунд не равно 59 (больше 58), и 1 в противном случае, по модулю 60 Затем это значение дополняется. Затем идет двоеточие и, наконец, секунды. Код просто получает старое значение, увеличивает его на 1, принимает по модулю 60 и, необязательно, дополняет.источник
C
309179 байтБезголовая версия:
Использование: Нажмите, Enterчтобы приостановить и возобновить секундомер.
Объяснение:
break
первогоwhile
цикла и дождитесь следующего Enter.goto
первыйwhile
цикл и возобновите подсчет.Теперь я знаю,
goto
что это плохая практика кодирования на C, но я не мог придумать другого пути.источник
getchar()
блокирует, пока какой-то символ не будет нажат.m=0,s=0;
него ничего не получается, потому что вы нигде не объявляли эти переменные.Javascript, 124 байта
«Управляющий ключ» - это щелчок по документу. Чтобы проверить это, вставьте код в консоль или в HTML-файл внутри
<script>
тега.Объяснение:
Проверено в Chrome
источник
PHP,
9491 байтЯ предполагаю, что 32 является ключевым кодом для пробела (что, вероятно, не так);
В настоящее время у меня нет возможности проверить ncurses. Но остальная часть кода работает нормально.
начинается с
00:00
, но увеличивается сразу после окончания паузыЕсли у Вас (как и у меня) нет ncurses, Вы можете проверить, заменив второй
date
параметр на$t+=$r^=!rand(sleep(1),19);
или$t+=$r^=++$x%20<1+sleep(1);
. (sleep
всегда возвращается0
.)сломать
источник
C # 220 байт
Golfed
Использование
s
ключа для запуска / остановки. Вся программа работает, вспоминая TimeDelta с помощьюDateTime.Now
Большинство C # -Magic здесь происходит от C # 7.0
using static
.источник
Баш, 65 байт
trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}
Обратите внимание, что для правильной работы он должен быть записан в файловый скрипт, иначе попытайтесь:
bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'
Расширенная версия, чтобы объяснить это:
%(...)T
Формат Printf действителен в Баш 5+.источник
00:00
и увеличивает счетчик при нажатииCtrl-C
. Там нет анимации таймера. (Проверено на bash 5.0.7)bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'
. @roblogicbash -c
:)C (gcc) ,
121115 байтПопробуйте онлайн!
Устанавливает обработчик сигнала для SIGINT, который запускается нажатием control-C. Мы сохраняем смещение времени в
b
и отображаем время настенных часов минус смещение времени. Если мы приостановлены, увеличивайте временную базу каждый раз, когда настенные часы тикают, чтобы зафиксировать отображаемое время.Спасибо @ceilingcat за 6 байт!
источник
Дата Zsh + Gnu, 242 байта
Показывая 1/100 секунды! Для этого требуется интерактивный терминал, но в любом случае вот ссылка TIO.
ХитEnter чтобы запустить / остановить таймер; Ctrl-Cвыходить.
Комментарии (немного устаревшие):
источник
Commodore BASIC (C64 / TheC64 Mini, VIC-20, PET, C16 / + 4) - 147 токенизированных и бейсиковых байтов
{clear}
в листингеSHIFT+CLR/HOME
выводится как один символ PETSCII при открытии кавычки, тогда как{home}
этоCLR/HOME
ключ без сдвига на том же условии соблюдения знак открывающейся кавычки.Используйте пробел в качестве клавиши управления.
Чтобы работать с Commodore 128 в BASIC 7, измените список в следующих строках:
Добавляет к счету дополнительные семь токенов (так как все числа хранятся в бейсике как 7 байтов, то
goto10
есть 8 токенизированных байтов, тогда какgoto
равен только 1).источник