Показать цифровые часы


20

Показать цифровые часы

(Я вижу, что есть много проблем с часами, я пытался прочитать их все, я уверен, что это уникально)

Написать код , который постоянно обновляет цифровые часы отображаются в формате , h:m:sгде h, mи sможет занять 1 или 2 символов каждая. В простых терминах, как выразился @BlueEyedBeast, я хочу, чтобы он заменил показанное время.

  • Новые строки не допускаются
  • Трейлинг разрешены
  • Другие завершающие символы не допускаются
  • Нельзя пропускать секунд (57 -> 59 не допускается)
  • Допускаются числа, начинающиеся с «0», если они занимают не более 2 символов
  • Код не должен принимать ввод
  • Если ваш язык не может получить текущее время без ввода, вы можете использовать для ввода до 8 байтов стандартно разрешенным способом
  • Выход должен быть в стандартный вывод
  • Это Codegolf, поэтому выигрывает самый короткий ответ!

пример

Я работаю над языком с именем *> <> (морская звезда), потому что такие программы невозможны в> <> (просто подождите, пока не будет введен файл / ввод). Вот рабочая программа с цифровыми часами (без присмотра). Эта программа написана на *> <> :

s":"m":"hnonon"   "ooo88888888888ooooooooooo1S

Примечание. В этом случае все идентично> <>, за исключением: s = секунда, m = минута, h = час, S = сон (100 мс * x)

Это выводит:

14:44:31

Обновление каждые 100 мс, пока не прекращено.

Запрещенные примеры

Следующее не допускается:

1:

14:44:3114:44:32

2:

14:44:31 14:44:32

3:

14:44:31
14:44:32

Время должно оставаться в первой строке, в которой оно было выведено без видимых завершающих символов. Очистка терминала, тем не менее, будет разрешена, поскольку в ней по-прежнему не будет завершающих символов.


1
мы должны ждать 100 мс или мы можем просто постоянно обновляться?
Blue

1
вам не нужно ждать, ожидание - это то, что делает пример.
Redstarcoder

2
Требования вызова кажутся мне слишком строгими.
mbomb007

1
@ mbomb007 Я удалил «Программа должна быть в состоянии завершить работу при вводе пользователем, который не является сигналом / прерыванием», поскольку текущие ответы, похоже, все равно не следуют за ним.
Redstarcoder

1
Может ли программа полагаться на определенные локальные настройки ОС?
Разнагул

Ответы:


5

Пайк, 6 байт

Ctr\ J

Попробуй это здесь!

Я думаю, что это действительно. Замените символ пробела на возврат каретки для правильного вывода (не работает онлайн)


Извините, это не так. Никакие переводы строки не допускаются или завершающие символы после времени. Я приведу 2 примера, чтобы быть более явным.
Redstarcoder

Я не вижу этого в спецификации?
Blue

1
В первой строке написано, что переводы строк запрещены, в третьей - нет завершающих символов. Извините, если неясно, я был бы признателен за советы по его устранению.
Redstarcoder

То есть вы хотите заменить показанное старое время?
Синий

Да, точно! Ваш текущий код кажется идеальным.
Redstarcoder

10

HTML + JS (ES6), 8 + 60 = 68 байт

Проверено в Chrome.

setInterval`a.innerHTML=new Date().toLocaleTimeString('fr')`
<a id=a>

-1 байт (@ETHProductions): используйте формат французского времени вместо .toTimeString().slice(0,8)


HTML + JS (ES6), 8 + 62 = 70 байт

Это будет работать в FireFox.

setInterval('a.innerHTML=new Date().toLocaleTimeString`fr`',0)
<a id=a>

-3 байта (@ETHProductions): использовать французский формат времени вместо .toTimeString().slice(0,8)


2
Как это работает? Я никогда не видел синтаксис обратного удара раньше. Я не могу найти что-либо на нем также после некоторого быстрого поиска.
Carcigenicate


1
@Carcigenicate Это часть последней спецификации JavaScript, ECMAScript6. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
darrylyeo

@ darrylyeo Спасибо. Я мог найти вещи по буквальному синтаксису, но я не мог видеть, как это было применено здесь. Мне нужно прочитать спецификацию снова. Я до сих пор не понимаю, как используется функция, предшествующая обратному тэгу.
Carcigenicate

2
Вы можете сохранить 3 байта в Firefox с одним new Date().toLocaleTimeString`fr` (1 байт в Chrome с одним ...TimeString('fr'))
ETHproductions

6

Python 2, 50 байт

(Python 2.1+ для ctimeбез аргументов)

import time
while 1:print'\r'+time.ctime()[11:19],

time.ctime()возвращает отформатированную строку, из которой можно нарезать чч: мм: сс [11:19](она остается в том же месте независимо от даты и времени).

printВозврат каретки '\r'перед текстом и превращение текста в первый элемент кортежа с ,эффективным подавлением неявного завершения '\n'и перезаписывают ранее записанный вывод.

while 1 петли навсегда.


3
Я думаю, что это нужно ,в конце, чтобы подавить перевод строки, иначе в Python 2.7.12 я получаю переводы строки.
redstarcoder

Ой, да, вы правы ... обновлено
Джонатан Аллан

5

Mathematica, 48 41 37 28 байт

Do[s=Now[[2]],∞]~Monitor~s

Выход будет TimeObjectобновляться непрерывно.

Выглядит так: введите описание изображения здесь

Альтернативные версии

48 байтов:

Dynamic@Refresh[TimeObject[],UpdateInterval->.1]

53 байта:

Dynamic@Refresh[DateString@"Time",UpdateInterval->.1]

1
Когда он обновлялся каждую секунду, вы гарантировали, что он никогда не пропускает секунды? (Пример: 11:11:11 -> 11:11:13)
redstarcoder

Dynamic@{DateString@TimeObject[], Clock[]}[[1]]
DavidC

1
@redstarcoder обновляется каждые ~ 1.002 с, поэтому я перешел на обновление каждые 100
мсек

Welp, я только что понял, что на самом деле мне не нужно Pause.
JungHwan Мин

Dynamic@{Now,Clock[]}[[1]]имеет размер 26 байт и показывает объект datetime. Dynamic@{DateString@"Time",Clock[]}[[1]]составляет 40 байтов и выводит только чч: мм: сс
Келли Лоудер

5

Я вижу, что требование для входа без пользовательского интерфейса для остановки программы было удалено. Итак, теперь мы можем сделать:

Bash + coreutils, 28

yes now|date -f- +$'\e[2J'%T

yes непрерывно выводит строку "сейчас", один раз за строку, в канал.

date -f-reads интерпретирует каждое «сейчас» как текущее время, а затем выводит в требуемом формате. Строка формата включает управляющую последовательность ANSI для очистки экрана. date делает выход новой строки после даты - я не уверен , если это дисквалифицирует, так как экран очищается каждый раз , когда в любом случае.

Если это дисквалифицирует, тогда мы можем использовать trвместо:

Bash + coreutils, 31

yes now|date -f- +%T|tr \\n \\r

Предыдущие ответы:

Баш + Х, 32

xclock -d -update 1 -strftime %T

К сожалению, это может обновляться только каждую секунду. Если это дисквалифицирует, то мы можем сделать это вместо этого:

Баш + coreutils, 43

until read -t0
do printf `date +%T`\\r
done

Обновление каждую секунду - это хорошо, если только оно не пропускает секунды (IE: 12-> 14).
Redstarcoder

Я позволю твой перевод строки! Я никогда не ожидал, что этот случай случится хе.
Redstarcoder

Это разрешено? date +$'\e[2J'%T;$0
Эван Чен

@EvanChen нет, потому что каждая итерация рекурсивно порождает новый процесс и в конечном итоге будет использовать доступную память или пространство PID, аналогично переполнению стека. Тем не менее, вы могли бы сделать date +$'\e[2J'%T;exec $0для 24 байтов ...
Цифровая травма

4

QBIC , 6 байтов

{_C?_d

{      Starts a DO-loop
 _C    CLS
   ?   PRINT
    _d TIME$

Постоянно очищает экран и печатает системное время в формате 22:03:41.


3

Clojure, 150 136 141 байт

V3: 141 байт :(

+5 байт, чтобы исправить ошибку. Поскольку время не заполнено нулями, часы могут «уменьшаться» и расширяться при изменении времени. Когда он сжался, он «размазался», потому что последняя цифра больше не очищалась. Исправлено, добавив несколько пробелов в конце, чтобы гарантировать, что все будет перезаписано.

#(while true(flush)(print(str(apply str(repeat 9"\b"))(.format(java.text.SimpleDateFormat."H:m:s")(java.util.Date.))"   "))(Thread/sleep 99))

V2: 136 байт

#(while true(flush)(print(str(apply str(repeat 9"\b"))(.format(java.text.SimpleDateFormat."H:m:s")(java.util.Date.))))(Thread/sleep 99))

-14 байт, переключившись на использование SimpleDateFormatдля форматирования даты. Все еще огромный.

V1: 150 байт

#(while true(let[d(java.util.Date.)](flush)(print(str(apply str(repeat 9 "\b"))(.getHours d)":"(.getMinutes d)":"(.getSeconds d)))(Thread/sleep 100)))

Я понял, что, вероятно, использую худший из возможных способов получить дату. Определенно, здесь есть место для улучшения.

Ungolfed:

(defn -main []
  (while true
    (let [d (java.util.Date.)]
      (flush)
      (print
        (str
          (apply str (repeat 9 "\b"))
          (.getHours d)":"(.getMinutes d)":"(.getSeconds d)))
      (Thread/sleep 100))))


2

WinDbg, 73 байта

.do{r$t0=0;.foreach(p {.echotime}){r$t0=@$t0+1;j8==@$t0'.printf"p \r"'}}1

Он постоянно обновляет строку с текущим временем, пока пользователь не нажмет Ctrl + Break.

Как это устроено:

.do                          * Start do-while loop
{
    r$t0 = 0;                * Set $t0 = 0
    .foreach(p {.echotime})  * Foreach space-delimited word in a sentence like "Debugger (not 
    {                        * debuggee) time: Mon Dec  5 14:08:10.138 2016 (UTC - 8:00)"
        r$t0 = @$t0+1;       * Increment $t0
        j 8==@$t0            * If $t0 is 8 (ie- p is the current time)
        '
            .printf"p \r"    * Print p (current time) and \r so the next print overwrites
        '
    }
} 1                          * Do-while condition: 1, loop forever

Пример вывода (ну, вы поняли):

0:000> .do{r$t0=0;.foreach(p {.echotime}){r$t0=@$t0+1;j8==@$t0'.printf"p \r"'}}1
14:10:12.329

2

PHP, 28 байт

for(;;)echo date("\rH:i:s");

dateФункция печатает все в буквальном смысле , что это не распространяется признать.

\r возврат каретки, устанавливает курсор на первый столбец.

Беги с -r.


2

MATL , 11 байт

`XxZ'13XODT

Бесконечный цикл, который очищает экран и печатает время в указанном формате.

Вы можете попробовать это в MATL Online! , Этот компилятор является экспериментальным; если это не работает, обновите страницу и снова нажмите «Выполнить».


2

C #, 82 байта

()=>{for(;;)Console.Write(new string('\b',8)+DateTime.Now.ToString("HH:mm:ss"));};

Анонимный метод, который постоянно перезаписывает 8 символов новым выводом. Может быть уменьшен на 1 байт при изменении, чтобы принять фиктивный параметр ( z=>...).

Полная программа:

using System;

public class Program
{
    public static void Main()
    {
        Action a =
        () =>
        {
            for (;;)
                Console.Write(new string('\b', 8) + DateTime.Now.ToString("HH:mm:ss"));
        };

        a();
    }
}

1
Разрешено не импортировать System? Некоторые люди делают это, а некоторые нет: /
Yytsi

Он не в своем реальном решении, просто в демонстрационной программе, так что да, все в порядке
Stefan

2

C #, 65 байт

()=>{for(;;)Console.Write("\r"+DateTime.Now.ToLongTimeString());};

Работает путем перезаписи одной и той же строки в бесконечном цикле


2

SmileBASIC 3.3.2, 38 байт

@L?TIME$;" ";
GOTO@L

UTF-16 отстой :(

В любом случае, это многократно печатает местное время в формате ЧЧ: ММ: СС с пробелом после него, без новой строки после. Хотя он не обновляется каждую секунду, он просто многократно печатает вечно.


Извините, это неверно, нужно заменить вывод, это не так. Установка первой строки @L?TIME$и добавление строки после (всего 3 строки), которая гласит, LOCATE 0, 0помогает ли это (SmileBASIC поддерживает возврат каретки?).
redstarcoder

Также вы забыли набрать символ новой строки, сделав это 40 байтов (UTF-16 жесток для кода гольф). Вы можете легко получить длину символа через Python REPL len(""" YOUR CODE HERE """), а затем просто сделать * 2 для UTF-16.
Redstarcoder

Ни один SB не делает CR на самом деле, я должен был бы добавить туда оператор LOCATE, который бы абсолютно уничтожил мой счет: P Или CLS: VSYNC, что так же плохо.
улитка

Да, к сожалению, это решение недействительно без него. Хорошие новости, хотя! SmileBASIC оценивается как UTF-8 .
redstarcoder

2

C 134 116 89 80 76 75 73 байта

main(n){for(;time(&n);)printf("\r%02d:%02d:%02d",n/3600%24,n/60%60,n%60);}

---- Old versions:
main(n){for(;;)n=time(0),printf("\r%02d:%02d:%02d",n/3600%24,n/60%60,n%60);}

n;main(){for(;;)n=time(0),printf("\r%02d:%02d:%02d",n/3600%24,n/60%60,n%60);}

---- 

n;main(){for(;;)n=time(0),printf("\r%02d:%02d:%02d",n/3600%24,n/60%60,n%60);}

----

Saved 9 more bytes thanks to @nmjcman101 again:
n;main(){for(;;)n=time(0),printf("\r%02d:%02d:%02d",(n/3600)%24,(n/60)%60,n%60);}

----

Saved 27 bytes thanks to @nmjcman101
n,b[9];main(){for(;;){n=time(0);strftime(b,9,"%H:%M:%S",localtime(&n));printf("\r%s",b);}}

----

I figured out I don't need to put `#include<stdio.h>` into the file :)
#include<time.h>
main(){for(;;){time_t n=time(0);char b[9];strftime(b,9,"%H:%M:%S",localtime(&n));printf("\r%s",b);}}

----

#include<time.h>
#include<stdio.h>
main(){for(;;){time_t n=time(0);char b[9];strftime(b,9,"%H:%M:%S",localtime(&n));printf("\r%s",b);}}

Похоже, (для меня) вы также можете удалить time.h. Это удаляет тип time_t, поэтому вам нужно вместо этого сделать n int. Это можно сделать, объявив его вне main (например n;main...), что устраняет необходимость в int. Вы также можете избавиться от charс таким же трюком: b[9];main.... Теперь они оба типа int, но они достаточно гибкие.
nmjcman101

Вау, спасибо большое, я не знала, что это сработает. Спасибо
Стефан

Пожалуйста, остановите меня, если вы хотите сыграть в гольф сами, но я также достал strftime...и ... b[9]и просто напечатал это: printf("\r%d:%d:%d",(n/3600)%60-29,(n/60)%60,n%60); я не уверен, нужны ли эти парены или нет. Также вы можете убрать набор {}, поставив запятые между вашими утверждениями, так что этоfor(;;)a,b,c;
nmjcman101

1
Эти скобки раздражают. (n/60)%60, шутки в сторону?
Анатолий

1
Вы можете сохранить 1 байт, объявив его nпараметром main, скажем, main(n)вместоn;main()
Карл Напф


2

Паскаль, 61 байт

uses sysutils;begin while 1=1do write(#13,timetostr(now))end.

В бесплатном паскале есть приятные временные процедуры в модуле SysUtils. Ungolfed:

uses
  sysutils;
begin
  while 1=1 do
    write(#13, timetostr(now));
end.

2

C 65 (пред 64) байтов

Гарантированно работать на Linux-машине. :)

@ Марко Спасибо!

f(){while(1){system("date +%T");usleep(100000);system("clear");}}

1

Vim, 26 байт

qqS<C-r>=strftime("%T")<CR><esc>@qq@q

Это создает рекурсивный макрос (например, вечный цикл), который удаляет весь текст в текущей строке и заменяет его текущим временем.


1

Pyth - 28 байт

Вроде долго, потому что у пита нет времени.

#p+"\r"j\:m.[`02`dP>4.d2.d.1


1

Желе , 8 байт

13Ọ7ŒTȮß

13Ọ        chr(13), carriage return
   7ŒT     time string, which extends the previous character
      Ȯ    print
       ß   call the whole link again

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

Возврат каретки не работает в Интернете, и я не могу заставить переводчика работать, так что он вроде не проверен, но он работает, как и ожидалось, когда я использую печатные символы вместо CR.


1

ForceLang, 123 байта

def s set
s d datetime
s z string.char 8
s z z.repeat 16
label 1
io.write z
io.write d.toTimeString d.now()
d.wait 9
goto 1

datetime.toTimeStringподдерживается в эталонной реализации Java DateFormat.getTimeInstance(), которая зависит от локали, так что вы можете установить системную локаль по умолчанию на ту, которая использует 24-часовое время.


1

PowerShell, 30 28 24 20 байт

Изменив регион моего компьютера на Германию, основываясь на комментариях разнагула , я сэкономил 4 байта. :)

for(){date -F T;cls}

Предыдущая версия, которая работает во всех регионах.

for(){date -F h:m:s;cls}


0

Пакетный, 36 байт

@set/p.=␈␈␈␈␈␈␈␈%time:~0,8%<nul
@%0

Где представляет символ ASCII BS (код 8).


0

Ракетка, 71 байт

(require srfi/19)(let l()(display(date->string(current-date)"↵~3"))(l))

Где это на самом деле CR (гекс 0d). Шестнадцатеричный дамп программы для дальнейшего уточнения (байт уведомления в шестнадцатеричной позиции 4d):

00000000  28 72 65 71 75 69 72 65  20 73 72 66 69 2f 31 39  |(require srfi/19|
00000010  29 28 6c 65 74 20 6c 28  29 28 64 69 73 70 6c 61  |)(let l()(displa|
00000020  79 28 64 61 74 65 2d 3e  73 74 72 69 6e 67 28 63  |y(date->string(c|
00000030  75 72 72 65 6e 74 2d 64  61 74 65 29 22 0d 7e 33  |urrent-date)".~3|
00000040  22 29 29 28 6c 29 29                              |"))(l))|
00000047

Использует SRFI / 19, включенный в дистрибутив Racket. (current-date)получает текущую местную дату и время. date->stringФормат ~3является ISO-8601 часы-минуты-второй формат. (let l () ... (l))в идиоматическом бесконечном цикле. (require srfi/19)загружает srfi/19модуль.


0

C 156 байт

#include<stdio.h>
#include<time.h>
int main(){time_t a;struct tm *b;char c[9];for(;;){time(&a);b=localtime(&a);strftime(c,9,"%H:%M:%S",b);printf("%s\r",c);}}

0

TI-Basic, 40 байт

(В TI-BASIC многие символы - это 2-байтовые токены, а двоеточия в начале строки - 0 дополнительных байтов).

:ClrHome
:Output(1,6,":
:setTmFmt(24
:While 1
:Output(1,1,getTmSrr(0
:getTime
:Output(1,7,Ans(3
:End

0

R, 41 байт

repeat{cat(format(Sys.time(),"%T"),"\r")}

Имеет один завершающий пробел (поскольку catразделитель по умолчанию является пробелом).
Из-за частоты обновления графического интерфейса R запуск этого в графическом интерфейсе иногда пропускает несколько секунд, но если вы сохраните его в файл и запустите в командной строке, он будет отображаться правильно каждую секунду.
Будет работать вечно, пока пользователь не прервет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.