Afficher une horloge numérique

20

Afficher une horloge numérique

(Je vois qu'il y a beaucoup de défis d'horloge, j'ai essayé de tous les lire, je suis sûr que c'est unique)

Ecrire un code qui met à jour en permanence une horloge numérique affichée dans le format h:m:sh, met speut occuper 1 ou 2 caractères chacun. Les restrictions en termes simples comme le dit @BlueEyedBeast, je veux essentiellement qu'il remplace l'heure indiquée.

  • Les retours à la ligne ne sont pas autorisés
  • Les espaces de fin sont autorisés
  • Les autres caractères de fin ne sont pas autorisés
  • Aucune seconde ne doit être manquée (57 -> 59 n'est pas autorisé)
  • Les nombres commençant par "0" sont autorisés, tant qu'ils n'occupent pas plus de 2 caractères
  • Le code ne doit accepter aucune entrée
  • Si votre langue ne peut pas obtenir l'heure actuelle sans entrée, vous pouvez utiliser pour l'entrée jusqu'à 8 octets de manière standard autorisée
  • La sortie doit être vers stdout
  • Il s'agit de codegolf, donc la réponse la plus courte l'emporte!

Exemple

Je travaille sur un langage nommé *> <> (étoile de mer) parce que des programmes comme celui-ci ne sont pas possibles dans> <> (attendez simplement le fichier i / o). Voici un programme d'horloge numérique qui fonctionne (non golfé). Ce programme est écrit en *> <> :

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

Remarque: Tout est identique à> <> dans ce cas, sauf, s = seconde, m = minute, h = heure, S = sommeil (100 ms * x)

Cela produit:

14:44:31

Mise à jour toutes les 100 ms jusqu'à la fin.

Exemples non autorisés

Les éléments suivants ne sont pas autorisés:

1:

14:44:3114:44:32

2:

14:44:31 14:44:32

3:

14:44:31
14:44:32

Le temps doit rester sur la première ligne de sortie sans caractères de fin visibles. Cependant, effacer le terminal serait autorisé car il n'aurait toujours pas de caractères de fin.

redstarcoder
la source
1
devons-nous attendre 100 ms ou pouvons-nous simplement mettre à jour constamment pour toujours?
Blue
1
vous n'avez pas à attendre, l'attente est exactement ce que fait l'exemple.
redstarcoder
2
Les exigences du challenge me semblent trop strictes.
mbomb007
1
@ mbomb007 J'ai supprimé "Le programme doit pouvoir sortir sur une entrée utilisateur qui n'est pas un signal / interruption" car les réponses actuelles ne semblent pas le suivre de toute façon.
redstarcoder
1
Le programme peut-il s'appuyer sur un paramètre local spécifique du système d'exploitation?
raznagul

Réponses:

5

Pyke, 6 octets

Ctr\ J

Essayez-le ici!

Je pense que c'est valable. Remplacez le caractère espace par un retour chariot pour une sortie valide (ne fonctionne pas en ligne)

Bleu
la source
Désolé, ce n'est pas le cas. Aucune nouvelle ligne n'est autorisée ou aucun caractère de fin après le temps. Je vais mettre 2 exemples pour être plus explicite.
redstarcoder
Je ne vois pas ça dans la spécification?
Bleu
1
La première ligne indique que les sauts de ligne ne sont pas autorisés, la troisième indique aucun caractère de fin. Je suis désolé si ce n'est pas clair, j'apprécierais des conseils pour le réparer.
redstarcoder
Vous voulez donc qu'il remplace l'ancien temps affiché?
Blue
Oui, exactement! Votre code actuel semble parfait.
redstarcoder
10

HTML + JS (ES6), 8 + 60 = 68 octets

Testé dans Chrome.

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

-1 octet (@ETHProductions): utilisez le format d'heure français au lieu de .toTimeString().slice(0,8)


HTML + JS (ES6), 8 + 62 = 70 octets

Cela fonctionnera dans FireFox.

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

-3 octets (@ETHProductions): utilisez le format d'heure français au lieu de .toTimeString().slice(0,8)

darrylyeo
la source
2
Comment cela marche-t-il? Je n'ai jamais vu la syntaxe de backtick auparavant. Je n'y trouve rien non plus après quelques recherches rapides.
Carcigenicate
1
Travailler pour moi à Inox (Chrome)
redstarcoder
1
@Carcigenicate Il fait partie de la dernière spécification JavaScript, ECMAScript6. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
darrylyeo
@darrylyeo Merci. Je pouvais trouver des choses sur la syntaxe littérale, mais je ne pouvais pas voir comment elle était appliquée ici. Je dois relire la spécification. Je ne comprends toujours pas comment la fonction qui précède le backtick est utilisée.
Carcigenicate
2
Vous pouvez enregistrer 3 octets dans celui de Firefox avec new Date().toLocaleTimeString`fr` (1 octet dans celui de Chrome avec ...TimeString('fr'))
ETHproductions
6

Python 2, 50 octets

(Python 2.1+ pour ctimesans argument)

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

time.ctime()renvoie une chaîne formatée, à partir de laquelle le hh: mm: ss peut être découpé en utilisant [11:19](il reste au même emplacement quelles que soient la date et l'heure).

printle retour chariot '\r'avant le texte et faire du texte le premier élément d'un tuple ,supprime efficacement la fin implicite '\n'et écrase la sortie précédemment écrite.

while 1 boucles pour toujours.

Jonathan Allan
la source
3
Je pense que cela a besoin d'un ,à la fin pour supprimer la nouvelle ligne sinon dans Python 2.7.12 j'obtiens des nouvelles lignes.
redstarcoder
Oups, oui vous avez raison ... mis à jour
Jonathan Allan
5

Mathematica, 48 41 37 28 octets

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

La sortie sera un TimeObject, rafraîchissant en continu.

Ressemble à ça: enter image description here

Versions alternatives

48 octets:

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

53 octets:

Dynamic@Refresh[DateString@"Time",UpdateInterval->.1]
JungHwan Min
la source
1
Avec sa mise à jour toutes les secondes, vous êtes-vous assuré de ne jamais sauter de secondes? (Ex: 11:11:11 -> 11:11:13)
redstarcoder
Dynamic@{DateString@TimeObject[], Clock[]}[[1]]
DavidC
1
@redstarcoder il met à jour tous les ~ 1.002s, j'ai donc changé pour mettre à jour toutes les
100 ms
Welp, je viens de réaliser que je n'ai pas vraiment besoin Pause.
JungHwan Min
Dynamic@{Now,Clock[]}[[1]]est de 26 octets et montre un objet datetime. Dynamic@{DateString@"Time",Clock[]}[[1]]est de 40 octets et ne produit que hh: mm: ss
Kelly Lowder
5

Je constate que l'exigence d'une entrée d'interface utilisateur sans signal pour arrêter le programme a été supprimée. Alors maintenant, nous pouvons faire:

Bash + coreutils, 28

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

yes émet en continu la chaîne "maintenant", une fois par ligne, dans un tuyau.

date -f-reads interprète chaque "maintenant" comme l'heure actuelle, puis sort au format requis. La chaîne de format comprend la séquence d'échappement ANSI pour effacer l'écran. date fait sortir un saut de ligne après la date - je ne sais pas si ce disqualifie, puisque l'écran est effacé à chaque fois que de toute façon.

S'il est disqualifié, nous pouvons utiliser à la trplace:

Bash + coreutils, 31

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

Réponses précédentes:

Bash + X, 32

xclock -d -update 1 -strftime %T

Malheureusement, cela ne peut être mis à jour qu'à chaque seconde. Si cela disqualifie, alors nous pouvons le faire à la place:

Bash + coreutils, 43

until read -t0
do printf `date +%T`\\r
done
Traumatisme numérique
la source
La mise à jour chaque seconde est très bien, tant qu'elle ne saute jamais les secondes (IE: 12-> 14).
redstarcoder
Je vais autoriser votre nouvelle ligne! Je ne m'attendais pas à ce que ce cas se produise heh.
redstarcoder
Est-ce permis? date +$'\e[2J'%T;$0
Evan Chen
@EvanChen non, car chaque itération génère récursivement un nouveau processus et finira par utiliser la mémoire disponible ou l'espace PID, de la même manière qu'un débordement de pile. Cependant, vous pourriez le faire date +$'\e[2J'%T;exec $0pour 24 octets ...
Digital Trauma
4

QBIC , 6 octets

{_C?_d

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

Efface constamment l'écran et imprime l'heure système au format 22:03:41.

steenbergh
la source
3

Clojure, 150 136 141 octets

V3: 141 octets :(

+5 octets pour corriger un bug. Étant donné que les heures ne sont pas remplies de zéro, l'horloge peut "rétrécir" et s'étendre lorsque l'heure change. Il "maculait" quand il rétrécissait parce que le dernier chiffre n'était plus effacé. Corrigé en ajoutant des espaces à la fin pour s'assurer que tout était écrasé.

#(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 octets

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

-14 octets en passant à l'aide de SimpleDateFormatpour formater la date. Toujours énorme.

V1: 150 octets

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

J'ai réalisé que j'utilisais probablement le pire moyen possible pour obtenir la date. Certainement matière à amélioration ici.

Non golfé:

(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
la source
3

Montre Bash +, 19 octets

watch ne fait pas partie de coreutils , mais est disponible immédiatement sur pratiquement toutes les distributions Linux.

Golfé

watch -tn1 date +%T

Essayez-le en ligne!

Zeppelin
la source
2

WinDbg, 73 octets

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

Il met continuellement à jour une ligne avec l'heure actuelle jusqu'à ce que l'utilisateur appuie sur Ctrl + Break.

Comment ça fonctionne:

.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

Exemple de sortie (enfin, vous avez l'idée):

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

PHP, 28 octets

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

La datefonction imprime tout ce qu’elle ne reconnaît pas.

\r est le retour chariot, positionne le curseur sur la première colonne.

Courez avec -r.

Titus
la source
2

MATL , 11 octets

`XxZ'13XODT

Boucle infinie qui efface l'écran et imprime l'heure au format spécifié.

Vous pouvez l'essayer sur MATL Online! . Ce compilateur est expérimental; si cela ne fonctionne pas, actualisez la page et appuyez à nouveau sur "Exécuter".

Luis Mendo
la source
2

C #, 82 octets

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

Méthode anonyme qui écrase constamment 8 caractères avec une nouvelle sortie. Peut être raccourci d'un octet en cas de modification pour accepter un paramètre fictif ( z=>...).

Programme complet:

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
la source
1
Est-il permis de ne pas importer System? Certaines personnes le font, et d'autres non: /
Yytsi
Il ne l'a pas fait dans sa solution actuelle, juste dans le programme de démonstration, alors oui, ça va
Stefan
2

C #, 65 octets

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

Fonctionne en écrasant la même ligne dans une boucle sans fin

Stefan
la source
2

SmileBASIC 3.3.2, 38 octets

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

L'UTF-16 craint :(

Quoi qu'il en soit, cela imprime à plusieurs reprises l'heure locale en HH: MM: SS avec un espace après, pas de nouvelle ligne par la suite. Cependant, il ne se met pas à jour à chaque seconde, il s'imprime à plusieurs reprises pour toujours.

escargot_
la source
Désolé, ce n'est pas valide, il doit remplacer la sortie, ce n'est pas le cas. Définir la première ligne @L?TIME$et ajouter une ligne après (pour un total de 3 lignes) qui lit LOCATE 0, 0fait l'affaire (SmileBASIC prend-il en charge le retour chariot?).
redstarcoder
Vous avez également oublié de marquer la nouvelle ligne, ce qui en fait 40 octets (UTF-16 est brutal pour le golf de code). Vous pouvez obtenir la longueur des caractères très facilement via Python REPL len(""" YOUR CODE HERE """), puis faites simplement * 2 pour UTF-16.
redstarcoder
Aucun SB ne fait pas de CR en fait, je devrais y déposer une instruction LOCATE qui détruirait absolument mon score: P Ou un CLS: VSYNC qui est tout aussi mauvais.
snail_
Oui, malheureusement, cette solution n'est pas valide sans elle. Bonne nouvelle cependant! SmileBASIC est classé UTF-8 .
redstarcoder
2

C, 134 116 89 80 76 75 73 octets

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);}}
Stefan
la source
Il semble (pour moi) que vous pouvez également supprimer time.h. Cela supprime le type time_t, vous devez donc faire n un int à la place. Cela peut être fait en le déclarant en dehors de main (like n;main...), ce qui supprime le besoin de int. Vous pouvez également vous débarrasser de charla même astuce: b[9];main.... Ils sont tous les deux de type int maintenant, mais c'est assez flexible.
nmjcman101
Wow, merci beaucoup, je ne savais pas que cela fonctionnerait. Merci
Stefan
S'il vous plaît, arrêtez-moi si vous souhaitez jouer au golf vous-même, mais j'ai également retiré le strftime...et le b[9]et je viens d'en faire une impression: printf("\r%d:%d:%d",(n/3600)%60-29,(n/60)%60,n%60); je ne sais pas si les parens sont nécessaires ou non. Vous pouvez également supprimer un ensemble de {}en mettant des virgules entre vos déclarations afin qu'il soitfor(;;)a,b,c;
nmjcman101
1
Ces parenthèses sont ennuyeuses. (n/60)%60, sérieusement?
anatolyg
1
Vous pouvez enregistrer 1 octet en déclarant ncomme paramètre de main, disons main(n)au lieu den;main()
Karl Napf
2

Powershell, 39 octets

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

Parce que je n'aime pas utiliser cls dans Powershell. De la publication du briantist @ /codegolf//a/102450/63383

Daniel Cheng
la source
2

Pascal, 61 octets

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

Pascal gratuit a de belles routines de temps dans l'unité SysUtils. Non golfé:

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

C 65 (64 précédents) octets

Garanti pour fonctionner sur une machine Linux. :)

@Marco Merci!

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

Vim, 26 octets

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

Cela crée une macro récursive (par exemple une boucle éternelle) qui supprime tout le texte sur la ligne actuelle et le remplace par l'heure actuelle.

DJMcMayhem
la source
1

Pyth - 28 octets

Un peu long, car pyth n'a pas de strftime.

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

Groovy, 45 caractères

for(;;)print(new Date().format("\rHH:mm:ss"))
homme au travail
la source
1

Gelée , 8 octets

13Ọ7ŒTȮß

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

Essayez-le en ligne!

Le retour chariot ne fonctionne pas en ligne, et je ne peux pas faire fonctionner l'interpréteur, donc il n'a pas été testé, mais il fonctionne comme prévu lorsque j'utilise des caractères imprimables à la place du CR.

JayDepp
la source
1

ForceLang, 123 octets

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.toTimeStringest soutenu dans l'implémentation de référence par Java DateFormat.getTimeInstance(), qui dépend des paramètres régionaux, de sorte que vous pouvez définir les paramètres régionaux par défaut de votre système sur ceux qui utilisent 24 heures.

SuperJedi224
la source
1

PowerShell, 30 28 24 20 octets

Changé la région de mon ordinateur en Allemagne sur la base du commentaire de raznagul pour économiser 4 octets. :)

for(){date -F T;cls}

Version précédente qui fonctionne dans tous les environnements locaux.

for(){date -F h:m:s;cls}
briantiste
la source
1

tcl, 69 octets

while 1 {puts -nonewline \r[clock format [clock seconds] -format %T]}

Essayez-le ici!

sergiol
la source
0

Lot, 36 octets

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

représente le caractère ASCII BS (code 8).

Neil
la source
0

Raquette, 71 octets

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

Où le est en fait un CR (hex 0d). Vidage hexadécimal du programme pour plus de précision (octet de notification à la position hex 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

Utilise SRFI / 19 inclus avec la distribution Racket. (current-date)obtient la date et l'heure locales actuelles. Le date->stringformat ~3est le format ISO-8601 heure-minute-seconde. (let l () ... (l))dans une boucle infinie idiomatique. (require srfi/19)charge le srfi/19module.

Winny
la source
0

C, 156 octets

#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);}}
Entraîneur Walt
la source
0

TI-Basic, 40 octets

(Dans TI-BASIC, de nombreux caractères sont des jetons de 2 octets et les deux-points au début d'une ligne sont de 0 octet supplémentaire)

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

R, 41 octets

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

A un espace de fin (car catle séparateur par défaut est un espace).
En raison du taux de rafraîchissement de l'interface graphique R, son exécution dans l'interface graphique sautera parfois quelques secondes, mais si vous l'enregistrez dans un fichier et l'exécutez sur la ligne de commande, il s'affichera correctement toutes les secondes.
S'exécutera indéfiniment jusqu'à interruption de l'utilisateur.

plannapus
la source