Es ist Zeit für eine Uhr Herausforderung!

25

Ich möchte, dass Sie mir eine Uhr bauen, die die Zeit in diesem Format anzeigt:

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

Dies zeigt '18: 10 'an. Die aktuelle Stunde und die nächste Stunde werden am Anfang der Zeile angezeigt, gefolgt von einem Leerzeichen und mehreren Strichen: In der ersten Zeile wird die Anzahl der Minuten angezeigt, die in dieser Stunde verstrichen sind, und in der zweiten Zeile wird angegeben, wie viele Minuten noch verstrichen sind in dieser Stunde gehen.

Zu klären

  • Die Uhr sollte die Systemzeit anzeigen. Wenn es bequemer ist, die Zeit von einer anderen Quelle abzurufen, ist das auch in Ordnung. Es kann sein, dass es nicht als Eingabe geliefert wird.
  • Bei 18:00ist die oberste Zeile nur 18(Leerzeichen am Ende sind zulässig, aber nicht erforderlich).
  • Unter 18:59dem Strich ist19 -
  • Die Stunden <10 werden entweder mit einem 0( 01 -----) oder rechtsbündig ( 1 -----) aufgefüllt . Eine linksbündige einzelne Ziffer ist nicht zulässig, auch wenn die Bindestriche an der richtigen Stelle beginnen ( 1 -----ungültig).
  • Die Uhr sollte die Stunden im 24-Stunden-Format anzeigen.
  • Obwohl es das 24h-Format genannt wird, gibt es eigentlich kein 24auf. In der 23. Stunde beginnt die zweite Zeile mit 00oder 0.
  • Die Anzeige muss mindestens einmal pro Minute aktualisiert werden, dies muss jedoch nicht genau in 00Sekunden geschehen . Sie können häufiger / fortlaufend aktualisieren, wenn dies bequemer ist, aber das Ergebnis muss natürlich noch lesbar sein - kein einziger Fleck auf dem gesamten Bildschirm.

Eingang

Keiner.

Ausgabe

  • Wie oben beschrieben. Das Auffüllen der Uhr mit Leerzeichen auf 60-ish-Positionen ist in beiden Zeilen zulässig, ein abschließender Zeilenumbruch ist ebenfalls zulässig.
  • Der Bildschirm muss gelöscht werden, wenn die nächste Minute angezeigt wird: entweder mit einem Befehl zum Löschen des Bildschirms oder durch Hinzufügen von mindestens 30 Zeilenumbrüchen.

Zusätzliche Regeln

steenbergh
quelle
Dürfen zwischen der Zahl und den Strichen zwei Leerzeichen stehen?
Adám
6
"einmal pro Minute aktualisiert" - Kann es öfter aktualisiert werden?
smls
1
@smls Ja, Sie können so oft aktualisieren, wie Sie möchten. Ich ändere die technischen Daten auf "mindestens einmal pro Minute".
Steenbergh
1
@KritixiLithos Das würde die Ausrichtung mit zweistelligen Stunden (9, 10 oder 23, 00) unterbrechen, also nein, nicht erlaubt.
steenbergh
1
Ist nach 23 die nächste Stunde 24 oder 0?
Kritixi Lithos

Antworten:

2

MATL , 41 Bytes

Vielen Dank an @Kundor für die Feststellung eines Fehlers, der jetzt korrigiert wurde

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

Probieren Sie es bei MATL online! Beachten Sie jedoch, dass das Programm nach 30 Sekunden beendet wird, sodass es schwierig ist, Änderungen an der Ausgabe zu erfassen.

Wie es funktioniert

`           % 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
Luis Mendo
quelle
Könnte ich sein, aber bei der zweiten Iteration wird nur die oberste Zeile gedruckt ...
steenbergh
@steenbergh Es funktioniert bei mir mit Minuten und Sekunden anstelle von Stunden und Minuten, daher sind die Änderungen leicht zu sehen: matl.suever.net/…
Luis Mendo
1
Ja, funktioniert. - in der Tat könnte es cool sein, dies als Zeilen 3 und 4 meiner eigenen Uhr zu haben.
Steenbergh
@steenbergh: Sie haben diese Antwort akzeptiert, sie ist jedoch ungültig. Sie zeigt die Stunde nach 23 als 24. Ich glaube, die kürzeste richtige Antwort ist die Ruby-Antwort von Value Ink.
Nick Matteo
@kundor Danke, dass du es bemerkt hast. Korrigiert auf Kosten von 3 Bytes
Luis Mendo
11

TI-Basic, 94 Bytes

" 
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

Relativ einfach. Das ist eine Zeichenfolge mit einem Leerzeichen am Anfang. Die Stunden sind rechtsbündig. Dies funktioniert nur bei TI-84 + Rechnern, da der TI-83 keine interne Uhr besitzt.

Edit: Danke @kundor, dass du bemerkt hast, dass ich die letzte Schleife nicht geschlossen habe. Jetzt behoben (+2 Bytes).

Edit # 2: Die erste Stunde sollte Null sein, nicht vierundzwanzig. Korrigiert zu einem Preis von +14 Bytes.

Timtech
quelle
Jeder Befehl zählt als ein Byte?
Sygmei
@Sygmei Die meisten Token bestehen aus einem Byte, ja. Jedoch Tokens wie Str1, getTimeund sub(sind jeweils zwei Bytes. Weitere Informationen finden
Timtech
Sie würden nicht zufällig einen Link zu einem Emulator haben, oder?
Steenbergh
Ich würde cemetech.net/projects/jstified empfehlen, aber denken Sie daran, dass es moralisch falsch ist, mit diesem Emulator ein ROM aus dem Internet zu verwenden, es sei denn, Sie besitzen diese Art von Taschenrechner.
Timtech
1
Haben Sie keine Angst, auf den Link zu klicken, da der Emulator echt ist und Sie auffordert, Ihr eigenes ROM hochzuladen, bevor es funktioniert. Früher hatte ich sie frei verfügbar, aber sie sind nicht mehr da. Wenn Sie einen TI-84 von einem Freund finden, ist dies die beste Option.
Timtech
9

Stapel, 197 Bytes

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

Hinweis: Die 10. Zeile enthält ein Leerzeichen. Formatiert für mich %time%Stunden mit einem führenden Leerzeichen, Minuten mit einer führenden Null. Ich entschied, dass eine führende Null ein einfacheres Ausgabeformat ist, da ich dafür nur 100 Stunden addieren und die erste Ziffer entfernen muss. Minuten sind kniffliger, da sie Fehler bei der Oktalanalyse verursachen 08oder 09verursachen können. Deshalb gehe ich davon aus, dass 1effektiv 100 Minuten hinzugefügt werden, und korrigiere dies, indem ich die Schleife entsprechend versetze. Dies ist ein Byte kürzer als das Subtrahieren der 100.

Neil
quelle
7

Python 3.6, 110 114 112 Bytes

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

Hierbei wird die neue F-String-Formatierung verwendet, um ein Byte ( f'\n{h+1:2} 'vs'\n%2d '%(h+1) ) . Sie können ändern [sleep(9)]zu 18 Bytes zu speichern, aber dann Spams es einfach auf den Bildschirm.

Änderung um ein Byte gespeichert while 1:...;sleep 60 , um while[sleep(60)]:...dank TuukkaX.

Ich musste 5 weitere Bytes verwenden, um die nächste Stunde nach 23 als 0 statt 24 anzuzeigen, wie OP gerade kommentierte. :-(

Erholte ein Byte, indem nur 9 Sekunden statt 60 Sekunden geschlafen wurden.

Sparte zwei Bytes, indem du ein bisschen herumfummelst, um sie zu verkürzen (h+1)%24, entlehnt von Value Ink's Ruby-Antwort .

Nick Matteo
quelle
Können Sie bitte erklären, warum Sie die if-Bedingung in eckige Klammern gesetzt haben? Würde der Abstand zwischen while und sleep nicht nur 1 Byte betragen, im Gegensatz zu den 2 auf beiden Seiten? EDIT: Egal, es ist wahr zu machen. Meinetwegen.
Shadow
1
@shadow: Gibt sleepzurück None, was falsch ist.
Nick Matteo
@ ToivoSäwén: sleepist auch im timeModul, deshalb ist das Importieren * besser.
Nick Matteo
5

Ruby, 98 95 91 Bytes

Updates alle 5 Sekunden. Funktioniert nur in Unix-Terminals.

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

Windows-Eingabeaufforderungsversion, 95 bis 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}
Wert Tinte
quelle
Können Sie Backticks anstelle von System verwenden? `cls`vssystem'cls'
IMP1
Es scheint nicht, aber Sie können verwenden h=t.hourund dann hanstelle der zweiten verwenden t.hour, was 3 Bytes spart.
IMP1
@ IMP1 In der Tat funktionieren Backticks nicht für cls. Vielen Dank für Ihren anderen Vorschlag!
Wert Tinte
@ IMP1 puts`clear`ist der richtige Weg, wenn Sie Unix-Terminals verwenden. Es funktioniert einfach nicht mit der Windows-Eingabeaufforderung cls.
Wert Tinte
Für Windows können Sie puts"\e[H\e[2J"die Konsole löschen, was meiner Meinung nach vier Bytes rasiert. Es würde Ihre erste Zeile zum Lesen bringenloop{t=Time.now;puts"\e[H\e[2J%02d %s
IMP1
4

Perl 6 , 113 Bytes

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

Probieren Sie es einmal mit einem Timeout von einer Sekunde.

Oder versuchen Sie eine geänderte Version , die das Ergebnis einer mehrstündigen ausgibt.

Erweitert:

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
}
Brad Gilbert b2gills
quelle
Welche Operatoren unterstützt das Dreieck? In [\+]fügt und in so [\-]scheint es , zu subtrahieren. Funktioniert das mit Multiplikation und so?
Yytsi
@ TuukkaX Es sollte mit fast allen Infix-Operatoren funktionieren. Es ist im Grunde dasselbe wie [+] LISTdas, was reduziert wird, außer dass Sie die Zwischenwerte erhalten. Siehe die Dokumentation Seite für Produkte
Brad Gilbert b2gills
4

QBasic, 120 127 121 Bytes

Lass das nicht zu lange laufen, sonst fängt dein Laptop Feuer. Jetzt 99.several9s% ​​CPU-effizienter.

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 und Erklärung

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

Wir beginnen mit dem Löschen des Bildschirms und erhalten dann die aktuellen Stunden und Minuten von TIMER, die die Anzahl der Sekunden seit Mitternacht zurückgeben.

Dies ist das erste Mal, dass ich es versucht habe. Daher war PRINT USINGich erfreut festzustellen, dass es nicht unter der üblichen QBasic-Eigenart leidet, dass positive Zahlen mit einem führenden Leerzeichen gedruckt werden.##as als Formatbezeichner stellt sicher, dass einstellige Zahlen rechtsbündig ausgerichtet und nach Bedarf mit einem Leerzeichen aufgefüllt werden. Wir müssen leider eine Schleife für die Bindestriche verwenden, da QBasic keine String-Wiederholungsfunktion hat. (Wenn ich mich irre, lass es mich bitte wissen!)

Alle PRINTAnweisungen enden mit ;, um den Zeilenumbruch zu unterdrücken. aber nach den Bindestrichen brauchen wir eine neue Zeile; also der einsame ?nach der inneren FORschleife.

Das SLEEP 1ist jetzt nötig. Andernfalls wird der Bildschirm nach dem Drucken so schnell gelöscht, dass es nur zu einem flackernden Durcheinander kommt. (I verwendet , LOCATE 1anstatt CLSzunächst aus diesem Grunde, bis ich erkennen , dass CLSmitSLEEP sowieso kürzer ist.) RUNStartet das Programm von oben neu - der kürzeste Weg, um eine Endlosschleife zu erhalten.

DLosc
quelle
Wie geht das mit der letzten Stunde des Tages um? In der obersten Zeile steht 23, aber wie spät ist es in der untersten Zeile?
Steenbergh
Ich verwende das Note7 und denke daran, dieses Programm auf absehbare Zeit anstelle meiner Statusleistenuhr auszuführen. Ist das eine gute idee
Owlswipe
@steenbergh Whoops, behoben. Es wäre hilfreich für Sie, diesen Randfall in der Frage zu erwähnen.
DLosc
@ DLosc Nein, ich mache nur Spaß :)). Aber ja, schlau !!
Owlswipe
1
@steenbergh Er gibt h MOD 24 aus, wenn anfangs h = 23, dann ist der nächste Schleifenzyklus 24 und wird auf 0 modifiziert. Aber ich bin gespannt, ob es auch funktioniert. Der CLS löscht die erste Zeile, sodass nie beide gedruckten Zeilen auf dem Bildschirm angezeigt werden.
Jens
4

Java 8, 313 300 299 Bytes

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

Dadurch werden nur alle 30 Iterationen der while-Schleife aktualisiert. Die anderen 29 Iterationen drucken nur neue Zeilen.

Aktualisiert

Gespeichert 13 14 Bytes aufgrund von Kevin Cruijssen Hilfe! Vielen Dank!

CraigR8806
quelle
Hallo, willkommen bei PPCG! Erstens sind nur Programme / Funktionen zulässig, und Ihr aktueller Code ist ein Ausschnitt. Sie müssen es mit einer Methode umgeben (dh void f(){...}und die erforderlichen Importe müssen hinzugefügt werden (in Ihrem Fall import java.time.*;). Abgesehen davon kann Ihr Code an mehreren Stellen abgelegt werden, um ihn auf 311 Byte zu senken (auch mit der hinzugefügten Methode) -Deklaration und Import). (Da es für diesen Kommentar zu lang ist, habe ich es in den nächsten Kommentar gesetzt .. 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 bytes ) Ich empfehle, Tipps zum Golfen in Java und Tipps zum Golfen in <allen Sprachen> zu lesen . Genieße deinen Aufenthalt.
Kevin Cruijssen
@KevinCruijssen Ich habe meine Antwort aktualisiert und konnte mit der Lambda-Notation 3 weitere Bytes einsparen. Auch änderte ich ein paar Stücke auf den Code , den Sie zur Verfügung gestellt, als auch, um den Spezifikationen zu entsprechen (zB for(i=0;i++<60anstelle von 61 und (h<10?anstelle von 9 Vielen Dank für mich über Methodendeklaration zu informieren und einige Golf - Tipps!
CraigR8806
Ah, die 61 statt 60 war in der Tat mein Fehler. Ich dachte, ich hätte es als for(i=0;++i<61statt geschrieben for(i=0;i++<61(in diesem zweiten Fall sollte es tatsächlich 60 sein, und obwohl es die gleiche Menge an Bytes ist, ist es wahrscheinlich offensichtlicher / lesbarer). Das h<9in meinem Code ist jedoch korrekt. Sie hatten h+1<10zuvor und ich änderte dies einfach h<9durch Entfernen von 1 auf beiden Seiten. :)
Kevin Cruijssen
1
@ KevinCruijssen Ha, das habe ich nicht mitbekommen! h<9. Ich werde es bearbeiten, um 1 weiteres Byte zu speichern. Danke noch einmal!
CraigR8806
4

C, 176 162 161 160 156 Bytes

Dies ist ein grober Missbrauch von Zeigern, der jedoch wie angegeben kompiliert und ausgeführt wird. Stellen Sie sicher, dass Sie ohne Optimierung kompilieren, da Sie sonst wahrscheinlich auf einen Segfault stoßen.

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));
 }
}
Seth
quelle
3

JavaScript (ES6), 162 Byte

Updates einmal pro Sekunde

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)

George Reith
quelle
You can save quite a few bytes by restructuring the code so it is only one statement (it's possible to call console.clear() inside the console.log argument) and assigning in unused parentheses as much as possible. Version for 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
You can save a bunch of byte by putting the hours and minutes into a single function 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

ovs
quelle
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.

Abel Tom
quelle
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.

mcmurdo
quelle
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.

Titus
quelle
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.

Timtech
quelle
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
smls
quelle
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? :)

Robert Benson
quelle
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)]])
Gurupad Mamadapur
quelle
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)))
dfernan
quelle
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)}");}
series0ne
quelle
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.

user59178
quelle
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.

Evan Krall
quelle
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
pLumo
quelle
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 :)

Sygmei
quelle
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
Ditto
quelle
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]
martin
quelle
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();
}
Kritixi Lithos
quelle
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.

Ahemone
quelle
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...

12Me21
quelle
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);
    }
}
nurchi
quelle
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