Внедрить секундомер

23

Реализуйте простой цифровой секундомер , который будет отображать время, прошедшее в секундах и минутах, как описано ниже.

Важный

Пожалуйста, прочтите разделы « Дисплей» и « Управление» !

дисплей

Время, прошедшее, должно отображаться в 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

Base64

N:D

Квартально-мнимая база

10101:3

Римские цифры

XIII:III

Помните, что если вы используете недесятичную систему счисления / основание, она должна быть закодирована с использованием печатных символов ASCII (или Unicode), например, использование двух двоичных (непечатных) байтов для минут и секунд недопустимо.

Вы также должны дополнить свой вывод нулями, если это необходимо, если ваша система счисления допускает это.

Замена символа разделителя :любым другим печатным символом (включая цифры) также допустима.

управления

Секундомер должен начинаться с паузы и оставаться в этом состоянии до тех пор, пока пользователь явно не запустит его, нажав клавишу «управление» (см. Ниже).

Если во время подсчета секундомер пользователь снова нажимает клавишу «Control» , секундомер должен остановиться (с сохранением текущего времени), пока кнопка «Control» не будет нажата еще раз.

«Контроль» ключ может быть одним нажатием клавиши, например s, или любую комбинацию клавиш, например Ctrl+Shift+X, но это должно быть «атомное», нажав несколько клавиш в последовательности, например , sтогда Enter, это не допускается .

Одна и та же клавиша управления (или комбинация) должна использоваться для приостановки и возобновления работы секундомера.

Вы должны использовать определенный «управляющий» ключ, то есть «любой ключ» не допускается.

В качестве альтернативы, вы можете использовать один или два щелчка мышью вместо нажатия клавиши «контроль».


правила

  • Это , выигрывает самый короткий ответ в байтах;
  • Применяются стандартные лазейки для игры в гольф;
  • Ваша программа должна (теоретически) быть способной работать вечно.
дирижабль
источник
Можно ли ввести управляющий ключ?
Loovjo
@Loovjo Да, подойдет любая отдельная клавиша или комбинация клавиш, включая Enter (если она может быть приостановлена, а затем возобновлена ​​с использованием той же клавиши).
Цеппелин
связанные
Джонатан Аллан
1
Нужна ли нам дополнительная секунда детализации? Т.е., если пользователь делает паузу приблизительно через 7000 миллисекунд после 00:05печати, а затем в какой-то момент возобновляется снова, должно ли 00:06отображаться 3000 миллисекунд после нажатия кнопки возобновления, или можно распечатать его целую секунду после нажатия кнопки возобновления?
Smls
@smls Можно нормально подождать целую секунду после возобновления.
Цеппелин

Ответы:

8

SmileBASIC, 86 77 71 байт

@L
N=N!=DIALOG(FORMAT$("%02D:%02D",F/60MOD 60,F MOD 60),,,N)F=F+1GOTO@L

DIALOGотображает текстовое поле на сенсорном экране. Nколичество секунд, в течение которых текстовое поле будет оставаться на экране до его исчезновения. Если Nэто так 0, он остается до тех пор, пока пользователь не нажмет кнопку на сенсорном экране.

DIALOGВозвращает, 1если пользователь нажал кнопку, и 0закрылась ли она автоматически. Поэтому, когда пользователь нажимает кнопку паузы, он возвращается 1, и время отображения устанавливается на 0, останавливая секундомер. После того, как пользователь снова нажмет кнопку, мы снова установим время отображения 1, возобновив таймер. По сути, каждый раз, когда DIALOGвозвращается 1, время отображения переключается между 1и 0с использованием !=, что эквивалентно логическому XOR, если оба входа 1 или 0.

12Me21
источник
Это выглядит потрясающе! Если бы вы также могли предоставить анимированную «заставку» о том, как это работает, это было бы очень признательно!
Цеппелин
Хорошо, я сделаю это в ближайшее время
12Me21
Его также можно протестировать на этом эмуляторе: citra-emu.org/game/smilebasic
roblogic
9

Python 2, 167 129 байт

-36 байт в основном * от идеи Малтисена по отлову ctrl-cс использованием исключения - иди кредит!
-4 байта благодаря DLosc (init nи b0 вместо f())
-1 байт благодаря FlipTack (используйте, p^=1а не p=1-p)
-2 байта благодаря Felipe Nardi Batista (удалите спецификаторы точности)

import time
f=time.time
n=b=p=0
while 1:
 try:n=[n,f()][p];t=n-b;print'\r%02d:%02d'%(t/60%60,t%60),
 except:b=[b-n+f(),b][p];p^=1

Работает так же, как мой оригинал, ниже, но с последовательностью управляющих клавиш ctrl+c.
(Проверено мной с Python 2.7.8 на Windows 7, 64-битная;
Протестировано Брайаном Минтоном с Python 2.7.13 на 64-битной Linux)

* также свернул ifоператор для поиска в списке, чтобы получитьtry как одну строку.

Мой оригинал:

import time,msvcrt as m
f=time.time
n=b=p=0
while 1:
 if m.kbhit()and m.getch()==b'p':b=[b-n+f(),b][p];p^=1
 if p:n=f()
 t=n-b;print'\r%0.2d:%0.2d'%(t/60%60,t%60),

(Протестировано мной с 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), приводит к перезаписи ранее напечатанного текста.

Джонатан Аллан
источник
Ах, да, хороший улов, я первоначально сделал, ^=но переключился в некоторый момент во время формулировки.
Джонатан Аллан
@DLosc действительно, спасибо ...
Джонатан Аллан
Это не специфично для Windows. Я только что проверил это на 64-битной Linux с Python 2.7.13, и это сработало. (с управляющей клавишей Ctrl-C)
Брайан Минтон
@BrianMinton спасибо, что дали мне знать!
Джонатан Аллан
что нужно для .в %0.2d? это работает так же хорошо, как%02d
Фелипе Нарди Батиста
6

Python - 160 159 143 байта

Спасибо @JonathanAllan за спасение мне 18 байт!

Используются только встроенные библиотеки, поэтому управляющий ключ ctrl-c, перехватывая его с помощью except keyboardInterrupt.

import time
Z=0
print'00:00'
while 1:exec"try:\n while 1:\n  %s\nexcept:1\n"*2%(1,"print'\033c%02d:%02d'%divmod(Z%3600,60);Z+=1;time.sleep(1)")
Maltysen
источник
О, классно. Я думаю, может быть, это может быть короче с просто except:? У меня есть рабочая версия моей работы ...
Джонатан Аллан
@JonathanAllan, круто, не знал, что ты сможешь это сделать.
Maltysen
5

утилиты bash + Unix, 90 или 93 байта

90-байтовая версия:

trap d=\$[!d] 2;for((n=0;;)){((d|!n))&&dc<<<DP60dod*d$n\r%+n|colrm 1 4&&: $[n++];sleep 1;}

93-байтовая версия:

trap d=\$[!d] 2;for((n=0;;)){((d|!n))&&dc<<<DP60dod*$n+n|colrm 1 4&&n=$[(n+1)%3600];sleep 1;}

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» в первый раз. Извините, если я не смог сформулировать это достаточно ясно!
Цеппелин
Хорошо, это имеет смысл - я изменю это.
Митчелл Спектор
1
Выглядит все хорошо сейчас!
Цеппелин
5

QBasic, 213 211 байт

Клавиша управления - вкладка. Выход из этого режима может привести к возгоранию ноутбука. Вы были предупреждены.

DO
WHILE k$<>CHR$(9)
k$=INKEY$
LOCATE 1
?CHR$(48+m\10);CHR$(48+(m MOD 10));":";CHR$(48+(d MOD 60)\10);CHR$(48+(d MOD 10))
IF r THEN
n=TIMER
d=v+n-b+86400
m=d\60MOD 60
END IF
WEND
k$=""
v=v+n-b
r=1-r
b=TIMER
LOOP

Вот оно в действии, пауза в 10, 15 и 20 секунд:

Секундомер работает

Разоблаченный и прокомментированный

' Outer loop runs forever
DO
  ' The WHILE-WEND loop runs until tab is pressed
  WHILE key$ <> CHR$(9)
    key$ = INKEY$
    ' Output the stopwatch value at top left of screen
    LOCATE 1
    ' Unfortunately, QBasic's PRINT USING doesn't have a format for printing
    ' with leading zeros, so we have to do it manually by printing the
    ' 10s digit and the 1s digit
    PRINT CHR$(48 + minute \ 10); CHR$(48 + (minute MOD 10));
    PRINT ":";
    PRINT CHR$(48 + second \ 10); CHR$(48 + (second MOD 10))
    ' Update the current time if the running flag is set
    IF running THEN now = TIMER
    ' Take the difference between now and the last time we started the
    ' stopwatch, plus the amount of saved time from previous runs,
    ' plus 86400 to account for the possibility of running over midnight
    ' (since TIMER is the number of seconds since midnight, and QBasic's
    ' MOD doesn't handle negative values like we would need it to)
    diff = saved + now - lastStarted + 86400
    second = diff MOD 60
    minute = diff \ 60 MOD 60
  WEND
  ' If we're outside the WHILE loop, the user pressed tab
  key$ = ""
  ' Add the previous run's time to the saved amount
  saved = saved + now - lastStarted
  ' Toggle running between 0 and 1
  running = 1 - running
  ' If we're starting, we want to put the current time in lastStarted;
  ' if we're stopping, it doesn't matter
  lastStarted = TIMER
LOOP

Обратите внимание, что значения с TIMERплавающей точкой. Это не влияет на вывод, так как MODи \обрезать до целых чисел. Но это добавляет точности к количеству сэкономленного времени: если вы сделаете паузу таймера непосредственно перед тиком, при повторном запуске вы увидите, что число меняется менее чем за секунду.

DLosc
источник
4

Пакет, 132 байта

set/ar=0,m=s=100
:l
cls
@choice/t 1 /d y /m %m:~1%:%s:~1% /n
set/as+=r,m+=c=s/160,s-=c*60,m-=m/160*60,r^^=%errorlevel%-1
goto l

Нажатие nбудет (un) приостановить таймер. Выходное мерцание может быть уменьшено за счет трех (или четырех) байтов.

Нил
источник
4

Чистый bash, 141 байт

set -m
while ! read -t 1;do printf '\r%02i:%02i' $[s=s>3598?0:s+1,s/60] $[s%60];done&trap 'fg>/dev/null' TSTP
printf '00:00'
kill -STOP $!
read

Это использует только встроенные функции Bash (без внешних инструментов). Управляющий символ таков Ctrl-Z, что стандартная SIGTSTPобработка останавливает секундомер.

Если Ctrl-Zнажата, когда подоболочка предопределена, она приостановит выполнение и вернет внешний скрипт на передний план, где будет молча ждать. Если внешний сценарий предопределен, обработчик прерываний возобновит выполнение подоболочки и снова начнет отсчет.

Майкл Гомер
источник
3

Javascript в консоли Chrome, 143 байта

f=document,m=s=g=i=0;setInterval(()=>{if(g%2){m=(i/60|0)%60;s=i++%60}f.write((m>9?m:'0'+m)+':'+(s>9?s:'0'+s));f.close();f.onclick=()=>g++},1e3)

При вводе в консоли он устанавливает счетчик на 00:00, а затем включает элемент управления, который является нажатием клавиши на документе.

Не так много магии, особенно (i/60)|0количество этажей

Сделано и протестировано в консоли Chrome

gzbz
источник
Хороший ответ. Вы можете удалить несколько байтов, используя фиктивный аргумент для функций, которые не принимают аргумент, и вы можете заменить первый аргумент в setInterval строкой, содержащей код.
Люк
1
132 B: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)
Люк
О, здорово :) Узнала пару вещей здесь. Строка в интервале и _ => g ++. Спасибо :)
gzbz
3

HTML + JavaScript (ES6), 191 192 187 183 174 байта

<b onclick='b=b?clearInterval(b):setInterval("a.innerHTML=`${(d=(((c=a.innerHTML.split`:`)[1]>58)+c[0])%60)>9?d:`0`+d}:${(e=++c[1]%60)>9?e:`0`+e}",1e3)'onload='b=0'id=a>00:00

объяснение

Нажмите на таймер, чтобы запустить или приостановить секундомер. Таким образом, один клик является клавишей управления . Разделителем между двумя значениями является двоеточие.

Всякий раз, когда пользователь нажимает кнопку, bпроверяется значение. Инициализируется, для 0которого выполняется оценка false, поэтому строка кода оценивается каждые 1000 миллисекунд. Это устанавливает переменную в id интервала, поэтому ее можно остановить позже. Если bсодержит число, оно оценивается true, поэтому интервал останавливается. Это возвращает значение undefined, поэтому цикл продолжается.

Строка кода изменяет html элемента с id a(секундомер). Сначала минуты анализируются путем взятия предыдущего значения секундомера, разделения его на двоеточие и получения значения минут, которое увеличивается на 0, если значение секунд не равно 59 (больше 58), и 1 в противном случае, по модулю 60 Затем это значение дополняется. Затем идет двоеточие и, наконец, секунды. Код просто получает старое значение, увеличивает его на 1, принимает по модулю 60 и, необязательно, дополняет.

Люк
источник
Это, похоже, не работает вообще. Я просто получаю ReferenceError: d не определено
Алексис Тайлер
Вероятно, вы также можете сохранить несколько байтов, удалив href = #, поскольку это на самом деле не нужно, так как вы используете onclick.
Алексис Тайлер
Я только что исправил это. Я тоже убрал href, потому что ты был прав. Благодарность!
Лука
Разве вы не можете поместить метку b на клик и указать это в ответе?
Я полагаю, это работает. Это спасло 9B. Большое спасибо!
Люк
3

C 309 179 байт

f(){m=0,s=0;A: while(getchar()^'\n'){if(s++==59){if(m++==59)m=0;s=0;}printf("\r%02d:%02d",m,s);sleep(1);system("clear");if(getchar()=='\n'){break;}}while(getchar()^'\n'){}goto A;}

Безголовая версия:

void f()
{
   int m=0,s=0;

   A: while(getchar()^'\n')
      {           
       if(s++==59)
       {
         if(m++==59)
           m=0;

         s=0;
       }
       printf("\r%02d:%02d",m,s);
       sleep(1);  
       system("clear");

        if(getchar()=='\n')
        {
          break;
        }
      }

       while(getchar()^'\n')
       {}
       goto A ;
}

Использование: Нажмите, Enterчтобы приостановить и возобновить секундомер.

Объяснение:

  • Дождитесь Enterнажатия клавиши, breakпервого whileцикла и дождитесь следующего Enter.
  • При следующем Enterнажатии клавиши выполните gotoпервый whileцикл и возобновите подсчет.

Теперь я знаю, gotoчто это плохая практика кодирования на C, но я не мог придумать другого пути.

Абель Том
источник
Код не компилируется. Кроме того, getchar()блокирует, пока какой-то символ не будет нажат.
Г. Слипен
компилирует и запускает на Linux-машине
Авель Том
Возможно, версия без гольфа, а версия с гольфом - нет. Уже у m=0,s=0;него ничего не получается, потому что вы нигде не объявляли эти переменные.
Г. Слипен
3

Javascript, 124 байта

s=i=1,setInterval("s&&(d=document).close(d.write(`0${i/60%60|0}:`.slice(-3)+`0${i++%60}`.slice(-2))),d.onclick=_=>s=!s",1e3)

«Управляющий ключ» - это щелчок по документу. Чтобы проверить это, вставьте код в консоль или в HTML-файл внутри <script>тега.

Объяснение:

let s = 1
let i = 1
setInterval(() => {
    //If s = true then check after the "&&" operator else false
    s && (d = document).close( //put the document variable inside the d variable, so now i don't need to use anymore the long word 'document, then i close the document
            d.write( //Write into the document the next string
                `0${i/60%60|0}:`.slice(-3) + `0${i++%60}`.slice(-2) //Here is the magic, here I update the 'i' variable and convert the 'i' value to minutes and seconds
            ) 
        ),
        d.onclick = _ => s = !s //Add onclick event to the document, if s = true then s = false, if s = false then s = true
}, 1e3) //1e3 = 1000

Проверено в Chrome

TheCopyright
источник
1
Добро пожаловать на сайт! Можно ли отредактировать ссылку на сайт онлайн-тестирования, например, попробуйте онлайн! , чтобы другие пользователи могли проверить ваш ответ?
Кэрд coinheringaahing
Спасибо @cairdcoinheringaahing, это с jsfiddle: jsfiddle.net/xjw7o0ps
TheCopyright
2

PHP, 94 91 байт

Я предполагаю, что 32 является ключевым кодом для пробела (что, вероятно, не так);
В настоящее время у меня нет возможности проверить ncurses. Но остальная часть кода работает нормально.

for($s=[STDIN];;)echo date("\ri:s",$t+=$r^=stream_select($s,$n,$n,1)&&32==ncurses_getch());

начинается с 00:00, но увеличивается сразу после окончания паузы

Если у Вас (как и у меня) нет ncurses, Вы можете проверить, заменив второй dateпараметр на $t+=$r^=!rand(sleep(1),19);или $t+=$r^=++$x%20<1+sleep(1);. ( sleepвсегда возвращается 0.)

сломать

for($s=[STDIN];                     // set pointer for stream_select
    ;                               // infinite loop:
)
    echo date("\ri:s",                  // 5. print CR + time
        $t+=                            // 4. increment $t if watch is running
        $r^=                            // 3. then toggle pause
            stream_select($s,$n,$n,1)   // 1. wait 1 second for a keystroke
            &&32==ncurses_getch()       // 2. if keystroke, and key==space bar
    ;
Titus
источник
2

C # 220 байт

using static System.Console;
using static System.DateTime;
class P
{
    static void Main()
    {
        var l = Now;
        var d = l-l;
        for( var r = 1<0;;Write($"\r{d:mm\\:ss}"))
        {
            if (KeyAvailable&&ReadKey(1<2).KeyChar == 's')
            {
                l = Now;
                r = !r;
            }
            if (r)
                d -= l - (l = Now);
        }

    }
}

Golfed

using static System.Console;using static System.DateTime;class P{static void Main(){var l=Now;var d=l-l;for(var r=1<0;;Write($"\r{d:mm\\:ss}")){(KeyAvailable&&ReadKey(1<2).KeyChar=='s'){l=Now;r=!r;}if(r)d-=l-(l=Now);}}}

Использование sключа для запуска / остановки. Вся программа работает, вспоминая TimeDelta с помощьюDateTime.Now

Большинство C # -Magic здесь происходит от C # 7.0 using static.

CSharpie
источник
2

Баш, 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;}'

Расширенная версия, чтобы объяснить это:

trap d=\$[!d] 2                     # flip d for each INT (ctrl-c) signal.
for((n=0;;)){                       # repeat forever the code inside the {...}
                                    # The n=0 is not strictly needed.
    printf "\r%(%M:%S)T" "$[n+=d]"  # Print Minute:Second string calculated from 
                                    # the n value, increment by the value of d.
                                    # If IFS is not numeric (0-9), then, the
                                    # quotes around "$[n+=d]" could be removed.
    sleep 1                         # wait for 1 second.
}

%(...)TФормат Printf действителен в Баш 5+.

Исаак
источник
Не работает Просто печатает 00:00и увеличивает счетчик при нажатии Ctrl-C. Там нет анимации таймера. (Проверено на bash 5.0.7)
roblogic
1
Вы написали код для скрипта? Или еще , пожалуйста , попробуйте: bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'. @roblogic
Исаак
Ааа, это сработало! Сценарий должен быть запущен с bash -c:)
roblogic
1

C (gcc) , 121 115 байт

p,r;g(){r^=1;}main(t,b){for(b=time(signal(2,g));;r?p=t:(b+=t!=p))t=time(0)-b,printf("\r%02d:%02d  ",t/60%60,t%60);}

Попробуйте онлайн!

Устанавливает обработчик сигнала для SIGINT, который запускается нажатием control-C. Мы сохраняем смещение времени вb и отображаем время настенных часов минус смещение времени. Если мы приостановлены, увеличивайте временную базу каждый раз, когда настенные часы тикают, чтобы зафиксировать отображаемое время.

Спасибо @ceilingcat за 6 байт!

Г. Слипен
источник
0

Дата Zsh + Gnu, 242 байта

Показывая 1/100 секунды! Для этого требуется интерактивный терминал, но в любом случае вот ссылка TIO.
ХитEnter чтобы запустить / остановить таймер; Ctrl-Cвыходить.

u(){p=`gdate +%s`;q=`gdate +%N`;}
f(){read -t0.01&&{read;break};unset REPLY}
g(){while :;{u;t=$[p-a];s=$[t%60];m=$[(t%3600-s)/60]
echo "\r`printf %02d:%02d $m $s`.$q[1,2]\c";f;}}
<<<ready;read;u;a=$p
while :;{f;echo "\r\e[2A\c";u;a=$[p-t];g;}

Комментарии (немного устаревшие):

u()echo $[`gdate +%s%N`/1000]       # fn:unix timestamp extended to µs
v()gdate +%s                        # fn:unix time, in s
f(){read -t0.01 -r&&{read -r;break;} # fn:listens for "Enter"
                      ;unset REPLY;}

g(){while :;                        # fn:rolling stopwatch
    {q=`u`;t=$[`v`-a]               #    t=time diff from baseline (s)
    ;echo "\r`printf %02d:%02d      #    format output
    $[(t%3600-s)/60] $s`            #    minutes:seconds
    .${q:10:2}\c";                  #    .xx = partial seconds
    f;}}                            #    listen for "Enter"

                                    # Execution starts here!
<<<ready;read;u;a=$p                # Wait for "Enter"; get baseline $a

while :;{                           # Main program loop
         f;                         # listen for an "Enter"
           echo "\r\e[2A\c"         # go up 1 line of the console
a=$[`v`-t]                          # reset the baseline
                ;g;}                # begin the stopwatch
roblogic
источник
@ Исаак, я бы ни за что не смог побить твой ответ за краткость и элегантность, поэтому я решил вместо этого добавить
новые
1
Это отличная цель @roblogic :-) .... .... все еще понимая твой код ....
Исаак
0

Commodore BASIC (C64 / TheC64 Mini, VIC-20, PET, C16 / + 4) - 147 токенизированных и бейсиковых байтов

 0?"{clear}":geta$:ifa$<>" "thengoto
 1ti$="000000"
 2fori=.to1:?"{home}"mid$(ti$,3,2)":"mid$(ti$,5,2):geta$:b$=ti$:i=-(a$=" "):nE:pO198,.
 3geta$:ifa$<>" "then3
 4ti$=b$:goto2

{clear}в листинге SHIFT+CLR/HOMEвыводится как один символ PETSCII при открытии кавычки, тогда как{home} это CLR/HOMEключ без сдвига на том же условии соблюдения знак открывающейся кавычки.

Используйте пробел в качестве клавиши управления.

Чтобы работать с Commodore 128 в BASIC 7, измените список в следующих строках:

 0?"{clear}":geta$:ifa$<>" "thengoto0
 2fori=.to1:?"{home}"mid$(ti$,3,2)":"mid$(ti$,5,2):geta$:b$=ti$:i=-(a$=" "):nE:poK198,.

Добавляет к счету дополнительные семь токенов (так как все числа хранятся в бейсике как 7 байтов, то goto10есть 8 токенизированных байтов, тогда как gotoравен только 1).

Шон Бебберс
источник