Il est temps de relever un défi d'horloge!


25

J'aimerais que vous me construisiez une horloge qui affiche l'heure dans ce format:

18 ----------
19 --------------------------------------------------

Cela affiche '18: 10 '. L'heure actuelle et l'heure suivante sont affichées au début de la ligne, suivies d'un espace et d'un certain nombre de tirets: sur la première ligne, le nombre de minutes qui se sont écoulées pendant cette heure, et la deuxième ligne indique combien de minutes de plus aller dans cette heure.

Clarifier

  • L'horloge doit afficher l'heure du système. Si récupérer l'heure d'une autre source est plus pratique, c'est bien aussi. Il peut ne pas être fourni en entrée.
  • À 18:00, la ligne du haut est juste 18(espaces de fin autorisés mais non requis)
  • À 18:59, la ligne de fond est19 -
  • Les heures <10 sont pré-remplies avec un 0( 01 -----) ou alignées à droite ( 1 -----). Un chiffre unique aligné à gauche n'est pas autorisé, même si les tirets commencent au bon endroit ( 1 -----n'est pas valide).
  • L'horloge doit afficher les heures au format 24h.
  • Bien que cela s'appelle le format 24h, il n'y en a pas réellement 24. Pendant la 23e heure, la deuxième ligne commence par 00ou 0.
  • L'affichage doit être mis à jour au moins une fois par minute, mais cela ne doit pas se produire à exactement 00secondes. Vous pouvez mettre à jour plus fréquemment / en continu si cela est plus pratique, mais le résultat doit bien sûr toujours être lisible - pas une tache sur l'écran.

Contribution

Aucun.

Sortie

  • Comme décrit ci-dessus. Les espaces de fin pour placer l'horloge à 60 positions sont autorisés sur les deux lignes, une nouvelle ligne de fin est également autorisée.
  • L'écran doit être effacé lors de l'affichage de la minute suivante: soit avec une commande d'effacement d'écran soit en ajoutant pas moins de 30 nouvelles lignes.

Règles supplémentaires


pouvons-nous avoir deux espaces entre le nombre et les tirets?
Adám

6
"mis à jour une fois par minute" - Peut-il être mis à jour plus souvent?
smls

1
@smls Oui, vous pouvez mettre à jour aussi souvent que vous le souhaitez. Je changerai les spécifications en «au moins une fois par minute».
steenbergh

1
@KritixiLithos Cela romprait l'alignement avec les heures à deux chiffres (9, 10 ou 23, 00), donc non, pas autorisé.
steenbergh

1
Après 23 heures, l'heure suivante est-elle 24 ou 0?
Kritixi Lithos du

Réponses:


2

MATL , 41 octets

Merci à @Kundor d'avoir remarqué une erreur, maintenant corrigée

`XxFT"4&Z'@+24\OH&YAO'-'60@*5&Z'-|Y"hhD]T

Essayez-le sur MATL en ligne! Mais notez que le programme est tué au bout de 30 secondes, il est donc difficile de détecter tout changement dans la sortie.

Comment ça marche

`           % Do...while
  Xx        %   Clear screen
  FT        %   Push [0 1]
  "         %   For each k in [0 1]
    4&Z'    %     Push current hour
    @+      %     Add k
    24\     %     Modulo 24. This transforms 24 into 0
    OH&YA   %     Convert to base-10 string with 2 digits
    O       %     Push 0. Concatenating with chars will convert this to char,
            %     and char(0) will be displayed as a space
    '-'     %     Push '-'
    60@*    %     Push 60*k
    5&Z'    %     Push current minute
    -|      %     Absolute difference. This gives current minute for k==0,
            %     or 60 minus that for k==1
    Y"      %     Repeat '-' that many times
    hh      %     Concatenate the top three elements into a string
    D      %      Display
  ]         %   End
  T         %   Push true
            % End (implicit). Since the top of the stack contains true, this
            % gives an infinite loop

Cela pourrait être moi, mais à la deuxième itération, seule la ligne supérieure est imprimée ...
steenbergh

@steenbergh Cela fonctionne pour moi avec des minutes et des secondes au lieu des heures et des minutes, donc les changements sont facilement visibles: matl.suever.net/…
Luis Mendo

1
Oui, ça marche. - en fait, ça pourrait être cool d'avoir ceci comme lignes 3 et 4 de ma propre horloge.
steenbergh

@steenbergh: vous avez accepté cette réponse, mais elle n'est pas valide - elle indique l'heure après 23 comme 24. Je crois que la réponse correcte la plus courte est celle de Ruby par Value Ink.
Nick Matteo

@kundor Merci de l'avoir remarqué. Corrigé au prix de 3 octets
Luis Mendo

11

TI-Basic, 94 octets

" 
Repeat 99<length(Ans
Ans+"-
End
Ans→Str1
Repeat 0
getTime
ClrDraw
Ans{Ans(1)≠24,1,1
Text(0,0,Ans(1),sub(Str1,1,1+Ans(2
Text(6,0,Ans(1)+1,sub(Str1,1,61-Ans(2
End

Relativement simple. C'est une chaîne avec un espace au début. Les heures sont alignées à droite. Cela ne fonctionne que sur les calculatrices TI-84 + car la TI-83 n'a pas d'horloge interne.

Edit: Merci @kundor d'avoir remarqué que je n'ai pas fermé la dernière boucle. Corrigé maintenant (+2 octets).

Edit # 2: La première heure doit être zéro, pas vingt-quatre. Corrigé au coût de +14 octets.


Chaque commande compte comme un octet?
Sygmei

@Sygmei La plupart des jetons ont un octet, oui. Cependant, jetons tels que Str1, getTimeet sub(sont deux octets chacun. Vous pouvez en savoir plus sur tibasicdev.wikidot.com/tokens
Timtech

Il ne vous arriverait pas d'avoir un lien vers un émulateur, n'est-ce pas?
steenbergh

Je recommanderais cemetech.net/projects/jstified mais rappelez-vous qu'il est moralement mauvais d'utiliser une ROM depuis Internet avec cet émulateur à moins que vous ne possédiez vous-même ce type de calculatrice.
Timtech

1
N'ayez pas peur de cliquer sur le lien, car l'émulateur est légitime et vous demande de télécharger votre propre ROM avant qu'elle ne fonctionne. TI les avait disponibles gratuitement mais ils ne le sont plus. Si vous pouvez trouver une TI-84 chez un ami, ce serait la meilleure option.
Timtech

9

Lot, 197 octets

@echo off
set/ah=100+%time:~0,2%,m=1%time:~3,2%
cls
call:l
set/ah=(h-3)%%24+100,m=260-m
call:l
timeout/t>nul 60
%0
:l
set s=%h:~1% 
for /l %%i in (101,1,%m%)do call set s=%%s%%-
echo %s%

Remarque: la 10e ligne a un espace de fin. Pour moi, %time%formate les heures avec un espace de début mais les minutes avec un zéro de début. J'ai décidé qu'un zéro de tête était un format de sortie plus facile, car tout ce que je dois faire pour cela est d'ajouter 100 heures et de supprimer le premier chiffre. Minutes sont plus délicat que 08ou 09causeront erreurs d'analyse octal, donc je préfixe un 1ajout de 100 minutes efficacement, le réglage de cette compensation par la boucle appropriée, ce qui est un octet plus courte que la soustraction de la 100.


7

Python 3.6, 110 114 112 octets

from time import*
while[sleep(9)]:h,m=localtime()[3:5];print('\n'*50+'%2d '%h+'-'*m+f'\n{-~h%24:2} '+'-'*(60-m))

Cela utilise le nouveau formatage de chaîne f pour enregistrer un octet ( f'\n{h+1:2} 'vs. '\n%2d '%(h+1)) Vous pouvez modifier[sleep(9)] pour 1sauver 8 octets, mais il juste l'écran envoie des pourriels.

Changement d'un octet enregistré while 1:...;sleep 60 en while[sleep(60)]:..., grâce à TuukkaX.

J'ai dû utiliser 5 octets de plus pour afficher l'heure suivante après 23 à 0, au lieu de 24, comme OP vient de le commenter. :-(

Récupéré un octet en dormant seulement 9 secondes au lieu de 60.

Enregistré deux octets en utilisant un bit-fiddling pour raccourcir (h+1)%24, emprunté à la réponse Ruby de Value Ink .


Pourriez-vous expliquer pourquoi vous avez mis des crochets autour de la condition if? Est-ce que l'espace entre le sommeil et le sommeil ne serait pas seulement de 1 octet, par opposition au 2 de chaque côté? EDIT: Peu importe, c'est pour le rendre véridique. C'est suffisant.
Shadow

1
@shadow: sleeprenvoie None, ce qui est faux.
Nick Matteo

@ ToivoSäwén: sleepest également dans le timemodule, il est donc préférable d'importer *.
Nick Matteo

5

Rubis, 98 95 91 octets

Mises à jour toutes les 5 secondes. Fonctionne uniquement sur les terminaux de type Unix.

loop{t=Time.now;puts`clear`+"%02d %s
%02d "%[h=t.hour,?-*m=t.min,-~h%24]+?-*(60-m);sleep 5}

Version d'invite de commande Windows, 95 92 octets:

loop{t=Time.now;puts"\e[H\e[2J%02d %s
%02d "%[h=t.hour,?-*m=t.min,-~h%24]+?-*(60-m);sleep 5}

Pouvez-vous utiliser des backticks au lieu du système? `cls`vssystem'cls'
IMP1

Il semble que non, mais vous pouvez utiliser h=t.hourpuis utiliser à la hplace du second t.hour, ce qui économise 3 octets.
IMP1

@ IMP1 en effet, les backticks ne fonctionnent pas cls. Merci pour votre autre suggestion!
Value Ink

@ IMP1 s'avère puts`clear`être la voie à suivre si vous utilisez des terminaux Unix. Cela ne fonctionne tout simplement pas avec l'invite de commande Windows cls.
Value Ink

Pour les fenêtres, vous pouvez puts"\e[H\e[2J"effacer la console, qui je pense rase quatre octets. Cela ferait lire votre première ligneloop{t=Time.now;puts"\e[H\e[2J%02d %s
IMP1

4

Perl 6 , 113 octets

loop {$_=DateTime.now;.put for |('' xx 30),|([\+](.hour,1)».fmt('%2s')Z('-' Xx[\-](.minute,60)».abs));sleep 60}

Essayez-le une fois avec un délai d'une seconde.

Ou essayez une version modifiée qui génère le résultat d'une exécution pendant plusieurs heures.

Étendu:

loop {                  # keep repeating forever

  $_ = DateTime.now;    # assign an object representing the current time

    .put                # print with trailing newline
                        # ( adds a space between numbers and dashes )

  for                   # for each of the following

    |(                  # make it a slip so that it is all part of one list

      '' xx 30          # 30 empty strings (30 empty lines)
    ),

    |(

        [\+](           # triangle produce
          .hour,        # the hour
          1             # the hour plus one

        )».fmt( '%2s' ) # both formatted to two element string ( space padded )

      Z                 # zipped with

        (
            '-'         # a dash

          Xx            # cross (X) using string repeat (x) operator

            [\-](       # triangle produce
              .minute,  # the minute
              60        # the minute minus 60

            )».abs      # absolute value of both
        )
    );

  sleep 60              # wait until the next minute
}

Quels opérateurs le «triangle produit» prend-il en charge? Il [\+]y ajoute et [\-]il semble soustraire. Est-ce que cela fonctionne avec la multiplication et autres?
Yytsi

@TuukkaX Il devrait fonctionner avec presque tous les opérateurs d'infixe. C'est essentiellement le même que celui [+] LISTqui est réduit, sauf qu'il vous donne les valeurs intermédiaires. Voir la page des documents pour les produits
Brad Gilbert b2gills

4

QBasic, 120 127 121 octets

Ne l'exécutez pas très longtemps ou votre ordinateur portable prendra feu. Maintenant 99.several9s% ​​plus économe en CPU.

CLS
m=TIMER\60
h=m\60
m=m MOD 60
FOR i=1TO 2
?USING"## ";h MOD 24;
FOR j=1TO m
?"-";
NEXT
?
h=h+1
m=60-m
NEXT
SLEEP 1
RUN

Non golfé et explication

DO
    CLS
    totalMinutes = TIMER \ 60
    hour = totalMinutes \ 60
    minute = totalMinutes MOD 60

    FOR row = 1 TO 2
        PRINT USING "## "; hour MOD 24;
        FOR j = 1 TO minute
            PRINT "-";
        NEXT j
        PRINT

        hour = hour + 1
        minute = 60 - minute
    NEXT row

    SLEEP 1
LOOP

Nous commençons par effacer l'écran, puis obtenons les heures et les minutes TIMER , ce qui renvoie le nombre de secondes depuis minuit.

C'est la première fois que j'essaie PRINT USING, donc j'ai été ravi de découvrir qu'il ne souffre pas de la bizarrerie QBasic habituelle que les nombres positifs sont imprimés avec un espace de tête.##car le spécificateur de format garantit que les nombres à un chiffre sont alignés à droite et remplis d'un espace, selon les besoins. Nous devons utiliser une boucle pour les tirets, malheureusement, car QBasic n'a pas de fonction de répétition de chaîne. (Si je me trompe, faites-le moi savoir!)

Toutes les PRINTinstructions se terminent par ;pour supprimer la nouvelle ligne; mais après les tirets, nous avons besoin d'une nouvelle ligne; ainsi, le solitaire ?après la FORboucle intérieure .

Le SLEEP 1est maintenant nécessaire. Sans cela, l'écran est effacé si rapidement après l'impression que ce n'est qu'un gâchis vacillant. (J'ai utilisé LOCATE 1au lieu de CLSd'abord pour cette raison, jusqu'à ce que je réalise CLSqu'avecSLEEP est plus court de toute façon.) RUNRedémarre le programme par le haut - le moyen le plus court pour obtenir une boucle infinie.


Comment cela gère-t-il la dernière heure de la journée? La ligne du haut indique 23, mais quelle est l'heure sur la ligne du bas?
steenbergh

J'utilise le Note7 et pense à exécuter ce programme dans un avenir prévisible à la place de mon horloge de barre d'état. est-ce une bonne idée?
owlswipe

@steenbergh Whoops, fixe. Il serait utile que vous mentionniez ce cas de bord dans la question.
DLosc

@DLosc Nah, je plaisante :)). Mais oui, intelligent !!
owlswipe

1
@steenbergh Il imprime h MOD 24, si initialement h = 23 puis la boucle suivante son cycle de 24 et devient modded à 0. Mais je suis curieux de savoir si cela fonctionne aussi bien. Le CLS efface la première ligne afin qu'il n'y ait jamais les deux lignes imprimées sur l'écran, non?
Jens

4

Java 8, 313 300 299 octets

import java.time.*;()->{for(int c=0,h=LocalDateTime.now().getHour(),m=LocalDateTime.now().getMinute(),i;;)if(c>30){c=0;String l="",u,d;for(i=0;i++<60;)l+="-";u=l.substring(0,m);d=l.substring(m);System.out.println((h<10?"0":"")+h+" "+u+"\n"+(h<9?"0":"")+(h+1)+" "+d);}else{c++;System.out.println();}}

Cela ne met à jour que toutes les 30 itérations de la boucle while. Les 29 autres itérations impriment simplement de nouvelles lignes.

Mis à jour

Enregistré 13 14 octets grâce à l'aide de Kevin Cruijssen! Merci!


Salut, bienvenue chez PPCG! Tout d'abord, seuls les programmes / fonctions sont autorisés et votre code actuel est un extrait. Vous devrez l'entourer d'une méthode (c'est-à void f(){...}- dire et vous devrez ajouter les importations nécessaires (dans votre cas import java.time.*;). Cela étant dit, votre code peut être joué à plusieurs endroits pour le réduire à 311 octets (même avec la méthode ajoutée) -déclaration et importation.) (Comme il est trop long pour ce commentaire, je l'ai placé dans le commentaire suivant .. xD)
Kevin Cruijssen

import java.time.*;void f(){for(int c=0,h=LocalDateTime.now().getHour(),m=LocalDateTime.now().getMinute(),i;;)if(c>99){c=0;String l="",u,d;for(i=0;i++<61;)l+="-";u=l.substring(0,m);d=l.substring(m);System.out.println((h<10?"0":"")+h+" "+u+"\n"+(h<9?"0":"")+(h+1)+" "+d);}else{c++;System.out.println();}}( 303 octets ) Je recommande la lecture de Tips for Golfing in Java et de Tips for golfing in <all languages> . Profitez de votre séjour.
Kevin Cruijssen

@KevinCruijssen J'ai mis à jour ma réponse et j'ai pu économiser 3 octets supplémentaires en utilisant la notation lambda. J'ai également changé quelques morceaux pour le code que vous avez fourni, pour répondre aux spécifications (par exemple for(i=0;i++<60au lieu de 61 et (h<10?au lieu de 9. Merci de m'avoir informé de la déclaration de méthode et de quelques conseils de golf!
CraigR8806

Ah, le 61 au lieu de 60 était en effet mon erreur. Je pensais l'avoir écrit comme for(i=0;++i<61au lieu de for(i=0;i++<61(dans ce deuxième cas, il devrait en effet être 60, et même si c'est la même quantité d'octets, c'est probablement plus évident / lisible). Le h<9dans mon code est correct, cependant. Vous l'aviez h+1<10avant et j'ai simplement changé cela h<9en supprimant 1 des deux côtés. :)
Kevin Cruijssen

1
@KevinCruijssen Ha Je n'ai pas compris ça! h<9. Je vais le modifier pour enregistrer 1 octet de plus. Merci encore!
CraigR8806

4

C, 176 162 161 160 160 156 octets

Il s'agit d'un abus flagrant de pointeurs mais compile et s'exécute comme spécifié. Assurez-vous de compiler sans optimisation, sinon vous risquez de rencontrer un défaut de segmentation.

main(){int*localtime(),b[9],*t;memset(b,45,60);for(;;)time(&t),t=localtime(&t),usleep(printf("\e[2J%.2d %.*s\n%.2d %.*s\n",t[2],t[1],b,t[2]+1,60-t[1],b));}

Non golfé:

#import<time.h>
main()
{
 int *t,b[60];
 memset(b,45,60);
 for(;;) {
  time(&t);
  t=localtime(&t);
  usleep(printf("\e[2J%.2d %.*s\n%.2d %.*s\n",t[2],t[1],b,t[2]+1,60-t[1],b));
 }
}

3

JavaScript (ES6), 162 octets

Mises à jour une fois par seconde

setInterval(c=>{c.clear(d=new Date,m=d.getMinutes(),h=d.getHours(),H=_=>`0${h++}`.slice(-2)),c.log(H()+` ${'-'.repeat(m)}
${H()} `+'-'.repeat(60-m))},1e3,console)


Vous pouvez économiser quelques octets en restructurant le code afin qu'il ne soit qu'une seule instruction (il est possible d'appeler console.clear()à l'intérieur de l' console.logargument) et en affectant autant que possible entre parenthèses inutilisées. Version pour 154B: setInterval(c=>c.log(H(h,c.clear(d=new Date))+` ${'-'.repeat(m)} ${H(h+1)} `+'-'.repeat(60-m)),1e3,console,m=d.getMinutes(h=d.getHours(H=$=>$<9?'0'+$:$))).
Luke

Vous pouvez enregistrer un tas d'octets en mettant les heures et les minutes dans une seule fonction m=>`0${h++} \.slice(-3)+'-'.repeat(m).
Neil

3

Python 2, 131 129 127 127 octets

from time import*
while[sleep(9)]:exec(strftime("a='%H';b=int('%M')"));print "\n"*30+a+" "+"-"*b+"\n"+`int(a)+1`+" "+"-"*(60-b)

enregistré un octet grâce à @TuukkaX


2
Vous n'avez pas besoin de la nouvelle ligne et de l'espace après lewhile 1:
Wheat Wizard

J'ai commencé votre code @ 19: 55. A 20h01, je vois 19 - \n 20 -----------------------------------------------------------. Les heures ne sont pas mises à jour ...
steenbergh

@steenbergh Je l'ai essayé moi-même en réglant l'horloge manuellement et cela fonctionne pour moi.
ovs

@ovs ne sont pas des défis d'horloge amusants :-). Quoi qu'il en soit, probablement quelque chose avec repl.it alors ...
steenbergh

head-desk Le serveur Repl.it a une heure de retard sur mon heure locale ... Et il le dit même tout en haut de la console. Je vais me voir, merci ...
steenbergh

3

C 251 267 251 octets

 #include<time.h>f(){time_t t;struct tm *t1;h,m,i;while(1){time(&t);t1=localtime(&t);h=t1->tm_hour;m=t1->tm_min;printf("%d ",h);for(i=1;i<=m;i++)printf("-");puts("");printf("%d ",h+1);for(i=0;i<=59-m;i++)printf("-");puts("");sleep(1);system("clear");}}

Version non golfée

#include<time.h>
void f()
{
 time_t t;
 struct tm *t1;
 int h,m,i;

 while(1)
 {
  time(&t);     
  t1=localtime(&t);
  h=t1->tm_hour;
  m=t1->tm_min;

  printf("%d ",h);
  for(i=1;i<=m;i++)
   printf("-");

  puts("");
  printf("%d ",h+1);

  for(i=0;i<=59-m;i++)
   printf("-");

  puts("");    

  sleep(1);
  system("clear");    
 }
}

Obtient le travail! Peut certainement être raccourci d'une manière ou d'une autre. Supposons que le unistd.hfichier soit inclus.

@Neil Merci pour l'info.

@Seth Merci d'avoir économisé 8 octets.


IIRC vous devez inclure tout le nécessaire pour obtenir le code à compiler (dans ce cas, les définitions de time_tet struct tm) dans votre nombre d'octets.
Neil

Au lieu de printf("\n");vous pouvez utiliserputs("");
Seth

3

Golf pour la première fois ...

Powershell, 116 octets (au lieu de 122)

while($d=date){$f="{0:D2}";$h=$d.Hour;$m=$d.Minute;cls;"$($f-f$h)$("-"*$m)`n$($f-f(++$h%24))$("-"*(60-$m))";Sleep 9}

Modifier: à partir des conseils de @ AdmBorkBork, changé Get-Date à ce jour et Clear à cls, pour une économie de 6 octets.


Bienvenue chez PPCG, bonne réponse
George

Bienvenue chez PPCG! Quelques golfs faciles - vous pouvez utiliser à la clsplace de clearet (tant que vous êtes sur Windows) à la dateplace de get-date. Je suis également sûr qu'il existe un moyen plus simple de produire le formatage - je joue avec et je vous ferai savoir si je trouve quelque chose.
AdmBorkBork

Agréable. Essayez ceci: 108 octets while($d=date){cls;"{0,2} {2}``n{1,2} {3}"-f($h=$d.Hour),(++$h%24),('-'*($m=$d.Minute)),('-'*(60-$m));Sleep 9}. Utilisez LF saut de ligne dans votre éditeur au lieu de `` n`
mazzy

3

PHP, 104 105 octets

<? for(;;sleep(6))printf("%'
99s%2d %'-".($m=date(i))."s
%2d %'-".(60-$m).s,"",$h=date(H),"",++$h%24,"");

vitrine pour printfses personnages de remplissage personnalisé:
"%'-Ns"= chaîne de gauche de la tablette avec -pour Npersonnages.

imprimera 99 sauts de ligne (toutes les 6 secondes) au lieu d'effacer l'écran.

La première nouvelle ligne doit être un seul caractère. Donc, sous Windows, il doit être remplacé par \n.


2

Langue GameMaker, 134 octets

s=" "while 1{s+="-"a=current_hour b=current_minute draw_text(0,0,string(a)+string_copy(s,1,b+1)+"#"+string(a+1)+string_copy(s,0,61-b)}

Dans les paramètres, vous devez ignorer les erreurs non fatales pour que cela fonctionne. En outre, en GML, #est équivalent à \ndans la plupart des langues.


2

Perl 6 , 104 octets

DateTime.now.&{"\ec{.hour.fmt: '%2s'} {'-'x.minute}\n{(.hour+1).fmt: '%2s'} {'-'x 60-.minute}"}.say xx*

Doit être exécuté sur un terminal compatible ANSI pour que la séquence de contrôle de réinitialisation du terminal fonctionne.

Assez basique (car les approches les plus obscures que j'ai essayées se sont avérées plus longues):

  • DateTime.now.&{" "}.say xx*: Transformez l'heure actuelle en une chaîne (voir ci-dessous) et dites-la, et répétez tout cela un nombre infini de fois. La chaîne est construite comme ceci:
    • \ec: Code de contrôle ANSI <ESC>c pour réinitialiser le terminal, ce qui efface l'écran.
    • {.hour.fmt: '%2s'}: heure, aligné à droite sur 2 colonnes
    • : espace
    • {'-'x.minute}: tiret répété fois la minute
    • \n: nouvelle ligne
    • {(.hour+1).fmt: '%2s'}: heure suivante, aligné à droite sur 2 colonnes
    • : espace
    • {'-'x 60-.minute}: tiret répété fois 60 moins la minute

2

AWK, 190 octets

#!/bin/awk -f
func p(x,y,c){printf("%2s ",x)
for(j=0;j<y;j++)printf(c)
print}BEGIN{for(;;){split(strftime("%H %M"),t)
m=t[2]
if(o!=m){p(a,30,"\n")
p(t[1],m,"-")
p((t[1]+1)%24,60-m,"-")}o=m}}

Puisqu'il AWKn'a pas de sleepfonction intégrée, je le fais simplement vérifier continuellement l'horloge pour voir si la minute a encore changé. L'essentiel est que cela fonctionne ... non? :)


2

Python 3.5, 127 120 117 octets

from time import*
while[sleep(9)]:h,m=localtime()[3:5];print('\n'*88,*['%2d '%x+'-'*y+'\n'for x,y in[(h,m),(h+1,60-m)]])

1
Ne pouvez-vous pas simplement print('\n'*50)au lieu de le os.system('cls')faire fonctionner à la fois sur * nix et Windows? Économiserait quelques octets car vous pouvez perdre l' osimportation et OP dit que cela est autorisé.
ElPedro

Oh, je ne l'ai pas lu correctement alors. Merci beaucoup mec.
Gurupad Mamadapur

Juste pour info, la plupart des gens ont tendance à utiliser <s> </s> autour de leur ancien nombre d'octets, puis à mettre le nouveau nombre d'octets après, car il est intéressant de voir la progression car une réponse est améliorée :-) Doit essayer 3,5 certains temps. Je travaille toujours avec Python 2.
ElPedro

1
@ElPedro Oui, j'ai oublié de le faire. Je vais éditer maintenant.
Gurupad Mamadapur

2

Python, 115 113 octets

économisé quelques octets grâce à @kundor et @Phlarx

import time
while 1:h,m=time.localtime()[3:5];print("\x1b[0;H{:02} {}\n{:02} {} ".format(h,"-"*m,h+1,"-"*(60-m)))

Au moins sur mon système, cela n'efface pas les caractères sous-jacents, de sorte que le nombre de tirets sur la deuxième ligne ne diminue pas au fil du temps. Aussi: vous pouvez enregistrer trois octets en mettant votre boucle while sur une seule ligne et deux octets en changeant :02simplement les formats :2.
Nick Matteo

2
Vous pouvez résoudre le problème décrit par @kundor en 1 octet en ajoutant un espace après le {} correspondant.
Phlarx

@kundor fixé! Merci. J'ai conservé le :02format pour saisir à droite un chiffre d'une heure avec des zéros.
dfernan

@kundor * pad gauche un chiffre d'une heure avec des zéros.
dfernan

@dfernan: Eh bien, :2des pads gauche avec des espaces, ce que le défi dit est OK.
Nick Matteo

2

C # interactif (138 octets)

while(true){var d=DateTime.Now;Console.WriteLine($"{d.Hour:00} {new string('-',d.Minute)}\n{d.Hour+1:00} {new string('-',60-d.Minute)}");}

1
Pouvez-vous jouer au golf 1) en nommant la date var dau lieu de dt? et 2) utiliser sleep(1e3)ou 999au lieu de 1000?
steenbergh

@steenbergh voir la mise à jour
series0ne

Quelques choses ... Ce n'est qu'un extrait, pas une méthode ou un programme (je ne sais pas si c'est valide dans C # Interactive cependant), c'est essentiellement une version golfée de mon code, et s'il a dû être commenté comme une amélioration, pas un solution distincte (bien que ce soit de la spéculation) et il y a beaucoup de petites améliorations que vous pouvez apporter ici, et avez-vous même besoin de sommeil?
TheLethalCoder

@TheLethalCoder J'ai spécifiquement mis C # Interactive parce que cela fonctionne UNIQUEMENT dans la console interactive. Cela ne fonctionnerait pas comme un programme C # standard.
series0ne

Notez également que cela ne fonctionnera pas lorsque l'heure est 23 et lorsque la minute est 0
TheLethalCoder

2

PHP, 112 120 octets

for(;;sleep(9))echo($s=str_pad)($h=date(H),99,"\n",0).$s(" ",1+$m=date(i),"-")."\n".$s(++$h%24,2,0,0).$s(" ",61-$m,"-");

Comme il n'y a aucun moyen d'effacer l'écran (que je peux trouver), j'ai dû y aller avec une pile de nouvelles lignes. De plus, la question mise à jour à "au moins" une fois par minute enregistre un octet avec 9au lieu de 60.

edit: @Titus a remarqué un bug dans le rembourrage de la deuxième heure. Le réparer coûte 8 octets.


Ce texte affiche d' avertissement sur la sortie standard ainsi que la sortie correcte: Notice: Use of undefined constant str_pad - assumed 'str_pad' in C:\wamp64\www\my-site\a.php on line 2 - Notice: Use of undefined constant H - assumed 'H' in C:\wamp64\www\my-site\a.php on line 2 - Notice: Use of undefined constant i - assumed 'i' in C:\wamp64\www\my-site\a.php on line 2. Quelque chose sur Meta à ce sujet?
steenbergh

@steenbergh C'est un avis; il ne s'affichera pas si vous utilisez des valeurs par défaut (paramètre de ligne de commande -nouerror_reporting(22519);
Titus

les heures doivent être complétées à la longueur 2
Titus

Bon point, le Hréglage de la date va de 00 à 23, mais je l'ai oublié pour la deuxième heure.
user59178

Économisez deux octets avec des sauts de ligne physiques.
Titus

2

Bash (3 et 4): 90 octets

d=(`sed s/./-/g<$0`);let `date +h=%H,m=%M`;echo $h ${d:0:m}'
'$[++h%24] ${d:m}
sleep 5
$0

En raison de l'utilisation de $0, ce script doit être placé dans un fichier, et non collé dans un shell bash interactif.

La première commande définit $d60 traits d'union; il s'appuie sur le fait que la première ligne de ce script comporte 60 caractères. C'est trois caractères de moins que la meilleure chose que je pourrais trouver:

d=`printf %060d|tr 0 -`

Si vous ne voulez pas que cela finisse par exécuter votre boîte à partir de PID ou de mémoire, vous pouvez ajouter evalau début de la dernière ligne, ce qui ferait ces 95 octets.


Me donne l'erreur let: h=09: value too great for base (error token is "09"). Le problème est que les zéros non significatifs sont interprétés comme des constantes octales, donc 09 n'est pas valide.
Nick Matteo

Hrm, cela signifie que mon script est cassé de plusieurs façons. Merci.
Evan Krall

2

BASH, 165 141 155 155 octets

while :
do
clear
m=`date +%-M`
a=`printf %${m}s`
b=`printf %$((60-m))s`
h=`date +%H`
echo $h ${a// /-}
printf "%02d %s" $((10#$h+1)) ${b// /-}
sleep 9
done

1
Je pourrais économiser encore 8 octets en supprimant le sommeil, mais je ne suis pas à l'aise avec une boucle indéfinie en cours d'exécution sur mon ordinateur sans sommeil ;-)
pLumo

Quelques optimisations: passer sleep 9à l'état de la boucle while; supprimez le -devant de M dans la chaîne de format à la ligne 4. Vous n'avez pas non plus besoin d'utiliser $ devant les noms de variables dans les expressions arithmétiques, cela $((60-$m))peut donc être$((60-m))
Evan Krall

Je ne sais pas si vos calculs à la ligne 9 sont exacts: h=23; echo $((10#$h+1))imprime 24 pour moi.
Evan Krall

Quel est le problème avec 24?
pLumo

J'ai besoin du -M car $ ((60-08)) donne une erreur.
pLumo

1

Gura , 138 octets

k(a,b)={if(a<10){a="0"+a;}println(a," ","-"*b)};repeat{t=datetime.now();k(t.hour,t.min);k(t.hour+1,60-t.min);os.sleep(60);print("\n"*30);}

Assez court et simple :)


Wow ... C'est rapide. Des conseils pour faire fonctionner Gura? Je viens de télécharger les binaires, mais exécuter Gura.exeet coller dans ce code me donne une erreur de syntaxe symbol k is not defined.
steenbergh

J'ai oublié un point-virgule! Vous pouvez essayer de l'exécuter à nouveau :)
Sygmei

1
Est-ce que cela se met à jour toutes les minutes? La console semble exécuter ce code une seule fois ...
steenbergh

Woops, qui n'a pas vu cette partie, devrait travailler maintenant!
Sygmei

Lorsqu'il se met à jour, il doit soit effacer l'écran, soit ajouter 30 sauts de ligne. Mec, je suis sur ton cas ...
steenbergh

1

Ok, je n'ai pas fait de golf de code depuis un moment, alors voici ma triste tentative :)

Unix Korn Shell: 177 171 170 octets

while :
do
clear
h=`date +%H`
m=`date +%M`
d=-----
d=$d$d$d$d
d=$d$d$d
a=`echo $d|cut -b-$m`
let m=60-$m
b=`echo $d|cut -b-$m`
let i=h+1
echo "$h $a\n$i $b"
sleep 9
done

épissé les 2 échos en 1, économisé quelques octets ... (dormir 9 au lieu de dormir 10 enregistre 1 octet: P) lol
Idem

1

Mathematica, 235 octets

d=UpdateInterval;e=Dynamic;f=Refresh;g=AbsoluteTime;Grid[Partition[Riffle[e[f[Floor@Mod[g[]/3600+#,24],d->1]]&/@{0,1},With[{t=#},e[f[""<>Array["-"&,If[t==60,60-#,#]]&@Setting@Floor@Mod[g[]/60+#,60],d->1]]]&/@{0,60}],2],Alignment->Left]

1

Traitement, 204 200 198 197 octets

5 octets enregistrés grâce à @L. Serné en utilisant des ternaires plus intelligents

void draw(){int i;String s=((i=hour())>9?i:" "+i)+" ";for(i=0;i<minute();i++)s+="-";s+="\n"+((i=hour()+1)>9?i>23?" 0":i:" "+i)+" ";for(i=0;i<60-minute();i++)s+="-";print(s);for(;i++<99;)println();}

Cela génère plus de 30 nouvelles lignes pour chaque mise à jour (qui a lieu lorsque le cadre est mis à jour)

Non golfé

void draw(){
  int i;
  String s=((i=hour())>9?i:" "+i)+" ";
  for(i=0;i<minute();i++)
    s+="-";
  s+="\n"+((i=hour()+1)>9?i>23?" 0":i:" "+i)+" ";
  for(i=0;i<60-minute();i++)
    s+="-";print(s);
  for(;i++<99;)
    println();
}

Changer ((i=hour())<10?" ":"")+ien ((i=hour())>9?i:" "+i)économiserait 2B deux fois ... Bonne chance pour le golf!
Luke

@ L.Serne merci pour l'astuce :)
Kritixi Lithos

Une autre amélioration qui pourrait fonctionner: ((i=hour()+1)>24?i=0:i)>9devient (i=hour()+1)>9, depuishour génère un nombre compris entre 0 et 23, et même avec 1 ajouté, il ne sera jamais supérieur à 24. De plus, vous devez déplacer l'incrément de l' iintérieur de la condition dans la forboucle comme vous l'avez fait dans la toute dernière boucle. Devrait économiser 13B au total.
Luke

@ L.Serné Pour le premier point, je dois encore inclure le ternaire car 23 + 1 dans une horloge de 24 heures devient 0 (ou du moins je pense). Ensuite, si je déplace l'incrément de l' iintérieur de la condition de la boucle for, idémarrera comme 1au lieu de 0et je dois ajouter un octet de plus i++<=minute()et le nombre d'octets sera toujours le même. Mais néanmoins, merci de m'avoir aidé à
jouer au

1

C, 239 octets

#include<time.h>
#include<unistd.h>
#define F printf(
void d(n,p){for(;n--;F"%c",p));}int main(){time_t*t;for(;;){d(30,10);time(t);int*m=localtime(t);F"%2d ",m[2]);d(m[1],45);F"\n%2d ",(m[2]+1)%24);d(60-m[1],45);F"\n");sleep(1);}return 0;}

Inspiré par les entrées de Seth et Abel, cela affichera 0 au lieu de 24 pour l'heure suivante, comme requis, et utilisera 30 lignes pour effacer l'écran.


1

SmileBASIC, 55 octets

TMREAD OUT H,M,
CLS?H,"-"*M?(H+1)MOD 24,"-"*(60-M)EXEC.

Explication:

TMREAD OUT HOUR,MINUTE,
CLS
PRINT HOUR,"-"*MINUTE
PRINT (HOUR+1) MOD 24,"-"*(60-MINUTE)
EXEC 0 'runs the code stored in slot 0 (the default)

Remarque: SmileBASIC ne dispose que de 50 colonnes de texte, donc il n'aura pas l'air bien ...


1

C # 181 176

for(;;){Console.Clear();var t=DateTime.Now;var h=t.Hour;var m=t.Minute;Console.Write("{0,2} {1}\n{2,2} {3}",h,"".PadLeft(m,'-'),++h%24,"".PadLeft(60-m,'-'));Thread.Sleep(100);}

Ce code suppose que le using System.Threading; ligne est incluse.

Classe complète:

class Program
{
    static void Main(string[] args)
    {
        Console.Title = string.Format("Started the app at: {0}", DateTime.Now.TimeOfDay);
        //new Timer((o) => { Console.Clear(); var t = DateTime.Now; var h = t.Hour; var m = t.Minute; Console.Write("{0,2} {1}\n{2,2} {3}", h, "".PadLeft(m, '-'), ++h % 24, "".PadLeft(60 - m, '-')); }, null, 0, 60000);

        for (; ; ) { Console.Clear(); var t = DateTime.Now; var h = t.Hour; var m = t.Minute; Console.Write("{0,2} {1}\n{2,2} {3}", h, "".PadLeft(m, '-'), ++h % 24, "".PadLeft(60 - m, '-')); Thread.Sleep(100); }

        Console.ReadKey(true);
    }
}

Cette solution n'a aucun moyen de quitter la boucle (l'original, commenté, exécute le code sur un thread séparé), donc l' Console.ReadKeyinstruction est redondante. La seule façon de sortir est de fermer la fenêtre de la console ou Ctrl+Break...
nurchi

Il ne s'agit que d'un extrait de code et non d'une méthode ou d'un programme, mais il using System.Threading;doit également être inclus dans le nombre d'octets si vous l'utilisez. Même chose avec Using System;.
TheLethalCoder
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.