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

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

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

redstarcoder
источник
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)

darrylyeo
источник
2
Как это работает? Я никогда не видел синтаксис обратного удара раньше. Я не могу найти что-либо на нем также после некоторого быстрого поиска.
Carcigenicate
1
Работаю
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.

steenbergh
источник
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))))
Carcigenicate
источник
3

Баш + часы, 19 байт

watch не является частью coreutils , но доступен практически из любого дистрибутива Linux.

Golfed

watch -tn1 date +%T

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

дирижабль
источник
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.

Titus
источник
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();
    }
}
adrianmp
источник
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 отстой :(

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

snail_
источник
Извините, это неверно, нужно заменить вывод, это не так. Установка первой строки @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

Powershell, 39 байт

for(){write-host -n(date -F h:m:s`0`r)}

Потому что я не люблю использовать cls в Powershell. Из поста briantist @ /codegolf//a/102450/63383

Дэниел Ченг
источник
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.
hdrz
источник
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

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

DJMcMayhem
источник
1

Pyth - 28 байт

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

#p+"\r"j\:m.[`02`dP>4.d2.d.1
Maltysen
источник
1

Groovy, 45 символов

for(;;)print(new Date().format("\rHH:mm:ss"))
manatwork
источник
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.

JayDepp
источник
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-часовое время.

SuperJedi224
источник
1

PowerShell, 30 28 24 20 байт

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

for(){date -F T;cls}

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

for(){date -F h:m:s;cls}
briantist
источник
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модуль.

Winny
источник
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 запуск этого в графическом интерфейсе иногда пропускает несколько секунд, но если вы сохраните его в файл и запустите в командной строке, он будет отображаться правильно каждую секунду.
Будет работать вечно, пока пользователь не прервет.

plannapus
источник