È tempo di sfidare l'orologio!


25

Vorrei che mi costruissi un orologio che visualizzi l'ora in questo formato:

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

Viene visualizzato '18: 10 '. L'ora corrente e l'ora successiva sono visualizzate nella parte anteriore della linea, seguite da uno spazio e un numero di trattini: sulla prima riga il numero di minuti che sono trascorsi in questa ora e la seconda riga mostra quanti altri minuti per andare in quest'ora.

Chiarire

  • L'orologio dovrebbe visualizzare l'ora del sistema. Se recuperare l'ora da un'altra fonte è più conveniente, va bene lo stesso. Esso non può essere fornito come input.
  • A 18:00, la riga superiore è solo 18(spazi di trascinamento consentiti ma non richiesti)
  • A 18:59, la linea di fondo è19 -
  • Le ore <10 sono pre-riempite con a 0( 01 -----) o allineate a destra ( 1 -----). Non è consentita una singola cifra allineata a sinistra, nemmeno se i trattini iniziano nel punto giusto ( 1 -----non è valido).
  • L'orologio dovrebbe visualizzare le ore in un formato 24 ore.
  • Anche se è chiamato il formato 24h, in realtà non 24è presente. Durante la 23a ora, la seconda riga inizia con 00o 0.
  • Il display deve essere aggiornato almeno una volta al minuto, ma ciò non deve avvenire esattamente in 00secondi. È possibile aggiornare più frequentemente / continuamente se ciò è più conveniente, ma il risultato deve ovviamente essere ancora leggibile - non una macchia su tutto lo schermo.

Ingresso

Nessuna.

Produzione

  • Come descritto sopra. Gli spazi finali per riportare l'orologio in posizioni di 60 ish sono consentiti su entrambe le linee, è consentita anche una nuova riga finale.
  • Lo schermo deve essere cancellato quando si visualizza il minuto successivo: con un comando a schermo chiaro o aggiungendo non meno di 30 nuove righe.

Regole aggiuntive


possiamo avere due spazi tra il numero e i trattini?
Adám,

6
"aggiornato una volta al minuto" - Può essere aggiornato più spesso?
smls

1
@smls Sì, puoi aggiornare tutte le volte che vuoi. Cambierò le specifiche in "almeno una volta al minuto".
Steenbergh,

1
@KritixiLithos Ciò interromperebbe l'allineamento con le ore a due cifre (9, 10 o 23, 00), quindi no, non consentito.
Steenbergh,

1
Dopo le 23, l'ora successiva è 24 o 0?
Kritixi Lithos,

Risposte:


2

MATL , 41 byte

Grazie a @Kundor per aver notato un errore, ora corretto

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

Provalo su MATL online! Tuttavia, il programma viene interrotto dopo 30 secondi, quindi è difficile rilevare eventuali cambiamenti nell'output.

Come funziona

`           % 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

Potrei essere io, ma alla seconda
ripetizione

@steenbergh Funziona per me con minuti e secondi anziché ore e minuti, quindi le modifiche sono facilmente visibili: matl.suever.net/…
Luis Mendo,

1
Sì, funziona. - in effetti, potrebbe essere bello avere questo come linee 3 e 4 del mio orologio.
Steenbergh,

@steenbergh: hai accettato questa risposta, ma non è valida: mostra l'ora dopo le 23 come 24. Credo che la risposta corretta più breve sia quella di Ruby di Value Ink.
Nick Matteo,

@kundor Grazie per avermelo notato. Corretto al costo di 3 byte
Luis Mendo il

11

TI-Basic, 94 byte

" 
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

Relativamente semplice. Questa è una stringa con uno spazio all'inizio. Le ore sono allineate a destra. Funziona solo su calcolatori TI-84 + poiché la TI-83 non ha un clock interno.

Modifica: Grazie @kundor per aver notato che non ho chiuso l'ultimo ciclo. Risolto ora (+2 byte).

Modifica n. 2: la prima ora dovrebbe essere zero, non ventiquattro. Corretto al costo di +14 byte.


Ogni comando conta come un byte?
Sygmei,

@Sygmei La maggior parte dei token ha un byte, sì. Tuttavia, come gettoni Str1, getTimee sub(sono due byte. Puoi saperne di più su tibasicdev.wikidot.com/tokens
Timtech

Non ti capita di avere un collegamento a un emulatore, vero?
Steenbergh,

Consiglierei cemetech.net/projects/jstified ma ricorda che è moralmente sbagliato usare una ROM da Internet con questo emulatore a meno che tu non possieda quel tipo di calcolatrice da solo.
Timtech,

1
Non aver paura di fare clic sul collegamento, perché l'emulatore è legittimo e ti chiede di caricare la tua ROM prima che funzioni. Li avevo disponibili gratuitamente ma non lo sono più. Se riesci a trovare una TI-84 da un amico, sarebbe l'opzione migliore.
Timtech,

9

Lotto, 197 byte

@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%

Nota: la decima riga ha uno spazio finale. Per me, %time%formatta le ore con uno spazio iniziale ma i minuti con uno zero iniziale. Ho deciso che uno zero iniziale era un formato di output più semplice, poiché tutto ciò che devo fare è aggiungere 100 ore e rimuovere la prima cifra. I minuti sono più complicati in quanto 08o 09causeranno errori di analisi ottale, quindi ho il prefisso di 1aggiungere efficacemente 100 minuti, regolando per questo compensando il loop in modo appropriato, che è un byte più breve rispetto alla sottrazione del 100.


7

Python 3.6, 110 114 112 byte

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

Questo utilizza la nuova formattazione della stringa f per salvare un byte ( f'\n{h+1:2} 'vs. '\n%2d '%(h+1)) È possibile passare [sleep(9)]a 1per salvare 8 byte, ma poi si blocca semplicemente sullo schermo.

Salvato un byte cambiando while 1:...;sleep 60in while[sleep(60)]:..., grazie a TuukkaX.

Ho dovuto usare altri 5 byte per visualizzare l'ora successiva dopo 23 per essere 0, anziché 24, come ha appena commentato OP. :-(

Recuperato un byte dormendo solo 9 secondi anziché 60.

Ho salvato due byte usando un bit-fiddling per accorciarlo (h+1)%24, preso in prestito dalla risposta Ruby di Value Ink .


Potresti spiegare perché hai messo parentesi quadre attorno alla condizione if? Lo spazio tra while e sleep non sarebbe solo 1 byte, a differenza del 2 su entrambi i lati? EDIT: Non importa, è per renderlo vero. Giusto.
Shadow

1
@shadow: sleeprestituisce None, il che è falso.
Nick Matteo

@ ToivoSäwén: sleepè anche nel timemodulo, quindi importare * è meglio.
Nick Matteo,

5

Ruby, 98 95 91 byte

Aggiornamenti ogni 5 secondi. Funziona solo con terminali in stile Unix.

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

Versione del prompt dei comandi di Windows, 95 92 byte:

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

Puoi usare i backtick invece del sistema? `cls`vssystem'cls'
IMP1

Sembra di no, ma è possibile utilizzare h=t.houre quindi utilizzare al hposto del secondo t.hour, che consente di risparmiare 3 byte.
IMP1

@ IMP1, in effetti, i backtick non funzionano cls. Grazie per l'altro tuo suggerimento, però!
Value Ink

@ IMP1 a quanto pare, puts`clear`è la strada da percorrere se si utilizzano terminali Unix. Semplicemente non funziona con il prompt dei comandi di Windows cls.
Value Ink

Per Windows, è possibile puts"\e[H\e[2J"cancellare la console, che a mio avviso rade quattro byte. loop{t=Time.now;puts"\e[H\e[2J%02d %s
Farebbe

4

Perl 6 , 113 byte

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

Provalo una volta con un timeout di un secondo.

Oppure prova una versione modificata che genera il risultato dell'esecuzione per diverse ore.

Allargato:

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
}

Quali operatori supporta il "triangolo prodotto"? In [\+]esso aggiunge e in [\-]esso sembra sottrarre. Funziona con la moltiplicazione e simili?
Yytsi il

@TuukkaX Dovrebbe funzionare con quasi tutti gli operatori infix. È sostanzialmente lo stesso di [+] LISTcui si riduce, tranne che ti dà i valori intermedi. Consulta la pagina dei documenti per produrre
Brad Gilbert b2gills

4

QBasic, 120 127 121 byte

Non farlo funzionare per molto tempo o il tuo laptop prenderà fuoco. Ora 99% di efficienza CPU in più.

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

Ungolfed e spiegazione

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

Iniziamo cancellando lo schermo, quindi otteniamo le ore e i minuti correnti TIMER, che restituiscono il numero di secondi dalla mezzanotte.

Questa è la prima volta che ci provo PRINT USING, quindi sono stato felice di scoprire che non soffre della solita stranezza di QBasic che i numeri positivi sono stampati con uno spazio iniziale.##poiché l'identificatore di formato garantisce che i numeri a una cifra siano allineati a destra e riempiti con uno spazio, come richiesto. Dobbiamo usare un loop per i trattini, sfortunatamente, poiché QBasic non ha una funzione di ripetizione delle stringhe. (Se sbaglio, per favore fatemi sapere!)

Tutti i PRINT affermazioni finiscono ;per sopprimere la nuova riga; ma dopo i trattini, abbiamo bisogno di una nuova riga; quindi, il solitario ?dopo il FORciclo interno .

L' SLEEP 1ora è necessario. Senza di essa, lo schermo viene cancellato così rapidamente dopo la stampa che è solo un casino tremolante. (Ho usato LOCATE 1invece CLSinizialmente per quel motivo, fino a quando ho capito che CLScon SLEEPè comunque più breve.) RUNRiavvia il programma dall'alto - il modo più breve per ottenere un ciclo infinito.


In che modo gestisce l'ultima ora del giorno? La riga superiore indica 23, ma che cosa è l'ora nella riga inferiore?
Steenbergh,

Sto usando Note7 e sto pensando di eseguire questo programma per il prossimo futuro al posto del mio orologio sulla barra di stato. È una buona idea?
Gufo

@steenbergh Whoops, risolto. Sarebbe utile per te menzionare quel caso limite nella domanda.
DLosc,

@DLosc Nah, sto solo scherzando :)). Ma sì, intelligente !!
Gufo

1
@steenbergh Stampa h MOD 24, se inizialmente h = 23 quindi il ciclo successivo è 24 e viene modificato a 0. Ma sono curioso di sapere se funziona anche. Il CLS cancella la prima riga in modo che non ci siano mai entrambe le linee stampate sullo schermo, giusto?
Jens,

4

Java 8, 313 300 299 byte

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();}}

Questo aggiorna solo ogni 30 iterazioni del ciclo while. Le altre 29 iterazioni stampano solo nuove righe.

aggiornato

Risparmiato 13 14 byte grazie all'aiuto di Kevin Cruijssen! Grazie!


Ciao, benvenuto in PPCG! Innanzitutto, sono consentiti solo programmi / funzioni e il tuo codice corrente è un frammento. Dovrai circondarlo con un metodo (cioè void f(){...}e devi aggiungere le importazioni richieste (nel tuo caso import java.time.*;). Detto questo, il tuo codice può essere golfato in più punti per abbassarlo a 311 byte (anche con il metodo aggiunto -dichiarazione e importazione). (Dato che è troppo lungo per questo commento, l'ho inserito nel prossimo commento .. 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 byte ) Consiglio di leggere Suggerimenti per giocare a golf in Java e Suggerimenti per giocare a golf in <tutte le lingue> . Goditi la permanenza.
Kevin Cruijssen il

@KevinCruijssen Ho aggiornato la mia risposta e sono stato in grado di salvare altri 3 byte utilizzando la notazione lambda. Inoltre ho modificato alcuni pezzi con il codice fornito, anche per soddisfare le specifiche (ad es. for(i=0;i++<60Invece di 61 e (h<10?invece di 9. Grazie per avermi informato sulla dichiarazione del metodo e alcuni consigli sul golf!
CraigR8806,

Ah, il 61 invece del 60 è stato davvero il mio errore. Pensavo di averlo scritto come for(i=0;++i<61invece di for(i=0;i++<61(in questo secondo caso dovrebbe essere effettivamente 60, e anche se è la stessa quantità di byte, è probabilmente più ovvio / leggibile). Il h<9nel mio codice è corretto, però. Avevi già fatto h+1<10e ho semplicemente cambiato questo h<9rimuovendo 1 su entrambi i lati. :)
Kevin Cruijssen il

1
@KevinCruijssen Ha Non ho capito! h<9. Lo modificherò per salvare un altro byte. Grazie ancora!
CraigR8806,

4

C, 176 162 161 160 156 byte

Questo è un grave abuso di puntatori ma viene compilato ed eseguito come specificato. Assicurati di compilare senza ottimizzazione altrimenti rischia di colpire un segfault.

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));}

Ungolfed:

#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 byte

Aggiornamenti una volta al secondo

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)


Puoi salvare un bel po 'di byte ristrutturando il codice in modo che sia una sola istruzione (è possibile chiamare console.clear()all'interno console.logdell'argomento) e assegnare il più possibile tra parentesi non utilizzate. Versione per 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'+$:$))).
Luca

È possibile salvare un mucchio di byte inserendo le ore e i minuti in un'unica funzione m=>`0${h++} \.slice(-3)+'-'.repeat(m).
Neil,

3

Python 2, 131 129 127 bytes

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

saved a byte thanks to @TuukkaX


2
You don't need the newline and space after the while 1:
Wheat Wizard

I started your code @19:55. At 20:01, I see 19 - \n 20 -----------------------------------------------------------. The hours aren't updating...
steenbergh

@steenbergh I tried it myself by setting the clock manually and it works for me.
ovs

@ovs aren't clock challenges fun :-). Anyway, probably something with repl.it then...
steenbergh

head-desk The Repl.it server is one hour behind to my local time... And it even says so at the very top of the console. I'll see myself out, thanks...
steenbergh

3

C 251 267 251 bytes

 #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");}}

Ungolfed version

#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");    
 }
}

Gets the work done! Can definitely be shortened in some way. Assume unistd.h file is included.

@Neil Thanks for the info.

@Seth Thanks, for saving 8 bytes.


IIRC you have to include everything necessary to get the code to compile (in this case, the definitions of time_t and struct tm) in your byte count.
Neil

Instead of printf("\n"); you can use puts("");
Seth

3

First time golfing...

Powershell, 116 bytes (was 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}

Edit: From @AdmBorkBork's advice, changed Get-Date to date, and Clear to cls, for a saving of 6 bytes.


Welcome to PPCG, good answer
george

Welcome to PPCG! A couple easy golfs -- you can use cls instead of clear and (so long as you're on Windows) date instead of get-date. I'm also sure there's some easier way to output the formatting -- I'm playing with it and I'll let you know if I come up with anything.
AdmBorkBork

Nice. Try this: 108 bytes while($d=date){cls;"{0,2} {2}``n{1,2} {3}"-f($h=$d.Hour),(++$h%24),('-'*($m=$d.Minute)),('-'*(60-$m));Sleep 9}. Use LF line break in your editor instead ``n`
mazzy

3

PHP, 104 105 bytes

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

showcase for printf´s custom padding characters:
"%'-Ns"=left pad string with - to N characters.

will print 99 newlines (every 6 seconds) instead of clearing the screen.

First newline must be a single character. So, on Windows, it must be replaced with \n.


2

GameMaker Language, 134 bytes

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)}

In the settings, you must be ignoring non-fatal errors in order for this to work. Also, in GML, # is equivalent to \n in most languages.


2

Perl 6, 104 bytes

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

Needs to be run on a ANSI compatible terminal so that the control sequence for resetting the terminal works.

Pretty basic (because the more obfuscated approaches I tried turned out longer):

  • DateTime.now.&{" "}.say xx*: Transform the current time into a string (see below) and say it, and repeat all of that an infinite number of times. The string is built like this:
    • \ec: ANSI control code <ESC>c for resetting the terminal, which clears the screen.
    • {.hour.fmt: '%2s'}: hour, right-aligned to 2 columns
    • : space
    • {'-'x.minute}: dash repeated times the minute
    • \n: newline
    • {(.hour+1).fmt: '%2s'}: next hour, right-aligned to 2 columns
    • : space
    • {'-'x 60-.minute}: dash repeated times 60 minus the minute

2

AWK, 190 bytes

#!/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}}

Since AWK doesn't have a built-in sleep function, I simply have it continually check the clock to see if the minute has changed yet. The key thing is that it works... right? :)


2

Python 3.5, 127 120 117 bytes

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
Can you not just print('\n'*50) instead of os.system('cls') so it works on both *nix and Windows? Would save a couple of bytes as you can lose the os import and OP says that this is allowed.
ElPedro

Oh, I didn't read it properly then. Thanks a lot man.
Gurupad Mamadapur

Just for info, most people tend to use <s></s> around their old byte count and then put the new byte count after it because it is interesting to see the progress as an answer is improved :-) Must try 3.5 some time. I'm still working with Python 2.
ElPedro

1
@ElPedro Yea I forgot to do it. I'll edit now.
Gurupad Mamadapur

2

Python, 115 113 bytes

saved a couple of bytes thanks to @kundor and @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)))

At least on my system, this doesn't erase underlying characters, so that the number of dashes on the second line doesn't go down as time passes. Also: you can save three bytes by putting your while loop on one line, and two bytes by changing the :02 formats to just :2.
Nick Matteo

2
You can fix the issue described by @kundor in 1 byte by adding a space after the corresponding {}.
Phlarx

@kundor fixed! Thanks. I kept the :02 format to right-pad one digit hours with zeroes.
dfernan

@kundor *left-pad one digit hours with zeroes.
dfernan

@dfernan: Well, :2 left-pads with spaces, which the challenge says is OK.
Nick Matteo

2

C# Interactive (138 Bytes)

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
Can you golf this down by 1) naming the date var d instead of dt? and 2) use sleep(1e3) or 999 instead of 1000?
steenbergh

@steenbergh see update
series0ne

A few things... This is just a snippet not a method or program (not sure if it's valid in C# Interactive though), it is essentially a golfed version of my code, and if it is should have been commented as improvements not a separate solution (though this is speculation) and there are lots of small improvements you can make here, and do you even need the sleep?
TheLethalCoder

@TheLethalCoder I specifically put C# Interactive because this works in the interactive console ONLY. This would not work as a standard C# program.
series0ne

Also note that this won't work when the hour is 23 and when the minute is 0
TheLethalCoder

2

PHP, 112 120 bytes

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,"-");

As there's no way to clear the screen (that I can find) I had to go with a pile of newlines. Also the question being updated to "at least" once a minute saves a byte with 9 instead of 60.

edit: @Titus noticed a bug in the padding of the second hour. Fixing it cost 8 bytes.


This displays warning text on stdout along with the correct output: 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. Anything on Meta about that?
steenbergh

@steenbergh That´s a notice; it will not be displayed if you use default values (command line parameter -n or error_reporting(22519);
Titus

hours must be padded to length 2
Titus

Good point, the H setting for date goes from 00-23, but I forgot about it for the second hour.
user59178

Save two bytes with physical linebreaks.
Titus

2

Bash (3 and 4): 90 bytes

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

Due to the use of $0, this script must be put into a file, not pasted into an interactive bash shell.

The first command sets $d to 60 hyphens; it relies on the fact that the first line of this script is 60 characters long. This is three characters shorter than the next best thing I could come up with:

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

If you don't want this to run your box out of PIDs or memory eventually, you can add eval to the beginning of the last line, which would make this 95 bytes.


Gives me the error let: h=09: value too great for base (error token is "09"). Problem is that leading zeros are interpreted as octal constants, so 09 is invalid.
Nick Matteo

Hrm, that means my script is broken in several ways. Thanks.
Evan Krall

2

BASH, 165 141 155 bytes

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
I could save another 8 bytes removing the sleep, but I'm not comfortable with an indefinite while loop running on my computer without a sleep ;-)
pLumo

Some optimizations: move sleep 9 to the condition of the while loop; remove the - in front of M in the format string on line 4. You also don't need to use $ in front of variable names in arithmetic expressions, so $((60-$m)) can be $((60-m))
Evan Krall

I'm not sure whether your math on line 9 is accurate: h=23; echo $((10#$h+1)) prints 24 for me.
Evan Krall

Whats wrong with 24?
pLumo

I need the -M because $((60-08)) gives an error.
pLumo

1

Gura, 138 bytes

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);}

Pretty short and straightforward :)


Wow ... That's fast. Any tips on running Gura? Just downloaded the binaries, but running Gura.exe and pasting in this code gives me a syntax error symbol k is not defined.
steenbergh

Forgot a semicolon ! You can try to run it again :)
Sygmei

1
Does this update every minute? The console seems to run this code just once...
steenbergh

Woops, did not saw that part, should be working now !
Sygmei

When it updates, it should either clear the screen or add 30 newlines. Man, I'm on your case...
steenbergh

1

Ok, haven't done a code golf in a while, so here goes my sad attempt :)

Unix Korn Shell: 177 171 170 bytes

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

spliced the 2 echos into 1, saved a few bytes ... (sleep 9 instead of sleep 10 saves 1 byte :P ) lol
Ditto

1

Mathematica, 235 bytes

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

Processing, 204 200 198 197 bytes

5 bytes saved thanks to @L. Serné by using smarter ternaries

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();}

This outputs 30+ newlines for each update (which takes place when the frame gets updated)

Ungolfed

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();
}

Changing ((i=hour())<10?" ":"")+i into ((i=hour())>9?i:" "+i) would save 2B twice... Good luck with further golfing!
Luke

@L.Serne thanks for the tip :)
Kritixi Lithos

Another improvement that might work: ((i=hour()+1)>24?i=0:i)>9 becomes (i=hour()+1)>9, since hour outputs a number in the range 0-23, and even with 1 added to that, it'll never be greater than 24. Also, you should move the increment of i inside the condition in the for loop like you did in the very last loop. Should save 13B in total.
Luke

@L.Serné For the first point, I still have to include the ternary because 23+1 in a 24-hour clock becomes 0 (or at least I think). Next, if I move the increment of i inside the condition of the for-loop, i will start as 1 instead of 0 and I need to add one more byte i++<=minute() and the bytecount will still be the same. But nonetheless, thanks for helping me golf 1 more bytes :)
Kritixi Lithos

1

C, 239 bytes

#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;}

Inspired by Seth's and Abel's entries, this will output 0 instead of 24 for the next hour, as required, and will use 30 lines to clear the screen.


1

SmileBASIC, 55 bytes

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

Explanation:

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)

Note: SmileBASIC only has 50 columns of text, so it won't look good...


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);}

This code assumes that the using System.Threading; line is included.

Full class:

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);
    }
}

This solution has no way of exiting the loop (the original, commented, runs the code on a separate thread), so the Console.ReadKey statement is redundant. The only way to exit is to either close the console window or Ctrl+Break...
nurchi

This is only a code snippet not a method or program, also the using System.Threading; needs to be included in the byte count if you are using it. Same with Using System;.
TheLethalCoder
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.