Показати цифровий годинник


20

Показати цифровий годинник

(Я бачу, що існує багато проблем із годинником, я спробував їх прочитати всі, я впевнений, що це унікально)

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

  • Нові рядки заборонені
  • Додаткові місця доступні
  • Інші символи, що відкладаються, не допускаються
  • Не потрібно пропускати жодної секунди (57 -> 59 не дозволено)
  • Числа, що починаються з "0", дозволені, якщо вони не містять більше 2 символів
  • Код не повинен приймати жодного введення
  • Якщо ваша мова не може отримати поточний час без введення, ви можете використовувати для введення до 8 байт стандартно дозволеним способом
  • Вихід повинен бути stdout
  • Це кодогольф, тому найкоротша відповідь виграє!

Приклад

Я працюю над мовою на ім’я *> <> (морська зірка), оскільки такі програми неможливі в <<> (просто зачекайте введення / виведення файлів). Ось робоча програма цифрового годинника в ній (без вогків). Ця програма написана *> <> :

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

Примітка: у цьому все ідентично> <>, окрім s = секунда, m = хвилина, год = година, S = сон (100 мс * х)

Цей результат:

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 мс чи можемо просто постійно оновлюватись назавжди?
Блакитний

1
вам не доведеться чекати, чекати - це саме те, що робить приклад.
redstarcoder

2
Вимоги до виклику здаються мені занадто суворими.
mbomb007

1
@ mbomb007 Я видалив "Програма повинна бути спроможна вийти на вхід користувача, який не є сигналом / перериванням", оскільки поточні відповіді, схоже, не відповідають цьому.
redstarcoder

1
Чи може програма покладатися на конкретну локальну установку ОС?
raznagul

Відповіді:


5

Пайк, 6 байт

Ctr\ J

Спробуйте тут!

Я думаю, що це справедливо. Замініть пробільний символ поверненням каретки для дійсного виводу (не працює в Інтернеті)


Вибачте, це не так. Заборонено використання нових рядків або знаків після закінчення часу. Я наведу 2 приклади, щоб бути більш чіткими.
redstarcoder

Я цього не бачу в специфікації?
Блакитний

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
Як це працює? Я ніколи раніше не бачив синтаксису backtick. Я нічого не можу знайти на ній після швидкого пошуку.
Carcigenicate

1
Працює для мене в Inox (Chromium)
redstarcoder

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

@darrylyeo Дякую Я міг знайти речі в прямому синтаксисі, але я не бачив, як це було застосовано тут. Мені потрібно ще раз прочитати специфікацію. Я досі не розумію, як використовується функція, яка передує "backtick".
Carcigenicate

2
У Firefox можна зберегти 3 байти 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()виходить відформатована рядок, з якої hh: mm: ss може бути нарізаний за допомогою [11:19](він залишається в тому самому місці, незалежно від дати та часу).

printЯкщо повернення каретки '\r'перед текстом і перетворення тексту першим елементом кортежу, ,ефективно пригнічує неявне затримка '\n'та перезаписує раніше записаний вихід.

while 1 петлі назавжди.


3
Я думаю, що це потрібно в ,кінці, щоб придушити новий рядок інакше в Python 2.7.12 я отримую нові рядки.
redstarcoder

На жаль, ви маєте рацію ... оновлено
Джонатан Аллан

5

Математика, 48 41 37 28 байт

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

Вихід буде a TimeObject, постійно оновлюючись.

Виглядає так: enter image description here

Альтернативні версії

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 мс
JungHwan Min

Welp, я щойно зрозумів, що насправді мені не потрібно Pause.
JungHwan Min

Dynamic@{Now,Clock[]}[[1]]становить 26 байт і показує об'єкт дати. 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

Попередні відповіді:

Bash + X, 32

xclock -d -update 1 -strftime %T

На жаль, це може оновлюватися лише щосекунди. Якщо це дискваліфікує, ми можемо зробити це замість цього:

Bash + 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)))

Я зрозумів, що, мабуть, використовую найгірший спосіб отримати дату. Тут безумовно, є можливість вдосконалення.

Безголівки:

(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 + Перерва.

Як це працює:

.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

Він не підходив до свого фактичного рішення, просто в демонстраційній програмі, так що так, це нормально
Стефан

2

C #, 65 байт

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

Працює, замінивши ту саму лінію в нескінченному циклі


2

SmileBASIC 3.3.2, 38 байт

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

UTF-16 смокче :(

У всякому разі, це неодноразово друкує місцевий час у HH: MM: SS з пробілом після нього, після цього немає нового рядка. Однак він не оновлюється щосекунди, він просто багаторазово друкує назавжди.


Вибачте, це не вірно, його потрібно замінити на виході, це не так. Встановлення першого рядка @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

С, 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 an int. Це можна зробити, оголосивши його поза основним (як 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, серйозно?
anatolyg

1
Ви можете зберегти 1 байт, оголосивши його nяк параметр main, скажімо, main(n)замістьn;main()
Karl Napf


2

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

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

Безкоштовний паскаль приємно проводить час у підрозділі SysUtils. Безголівки:

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

2

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

Гарантована робота на машині Linux. :)

@Marco Спасибі!

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 байт

На підставі коментаря raznagul я змінив регіон мого комп'ютера на Німеччину, щоб зберегти 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 (hex 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 GUI, якщо запустити це в GUI, періодично пропускатиметься кілька секунд, але якщо зберегти його у файлі та запустити його в командному рядку, він відображатиметься правильно кожні секунди.
Запускається назавжди, поки користувач не перерве.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.