Czas na wyzwanie zegara!

25

Chciałbym, żebyś zbudował mi zegar, który wyświetla czas w tym formacie:

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

Wyświetla się „18: 10”. Bieżąca godzina i następna godzina są wyświetlane na początku wiersza, a następnie spacja i liczba myślników: w pierwszym wierszu liczba minut, które upłynęły w tej godzinie, a druga linia pokazuje, ile minut więcej iść za tę godzinę.

Wyjaśnić

  • Zegar powinien wyświetlać czas systemowy. Jeśli pobieranie czasu z innego źródła jest wygodniejsze, to też jest w porządku. To nie może być dostarczony jako wejście.
  • W 18:00górnej linii jest tylko 18(końcowe spacje dozwolone, ale nie wymagane)
  • W 18:59dolnej linii jest19 -
  • Godziny <10 są wstępnie wypełnione znakiem 0( 01 -----) lub wyrównane do prawej ( 1 -----). Wyrównana do lewej pojedyncza cyfra nie jest dozwolona, ​​nawet jeśli myślniki zaczynają się we właściwym miejscu ( 1 -----jest nieprawidłowa).
  • Zegar powinien wyświetlać godziny w formacie 24-godzinnym.
  • Chociaż nazywa się to formatem 24-godzinnym, tak naprawdę nie ma 24na nim żadnego . Podczas 23. godziny druga linia zaczyna się od 00lub 0.
  • Wyświetlacz musi być aktualizowany co najmniej raz na minutę, ale nie musi to nastąpić dokładnie za 00sekundę. Możesz aktualizować częściej / w sposób ciągły, jeśli jest to wygodniejsze, ale wynik musi oczywiście być czytelny - nie jeden rozmaz na całym ekranie.

Wkład

Żaden.

Wydajność

  • Jak opisano powyżej. W obu liniach dozwolone są końcowe spacje, aby wstawić zegar do 60-poziomowych pozycji, dozwolona jest również nowa linia.
  • Ekran musi zostać wyczyszczony podczas wyświetlania następnej minuty: za pomocą polecenia wyczyść ekran lub dodając nie mniej niż 30 nowych linii.

Dodatkowe zasady

Steenbergh
źródło
czy możemy mieć dwie spacje między liczbą a myślnikami?
Adám
6
„aktualizowany raz na minutę” - czy można go częściej aktualizować?
sml
1
@smls Tak, możesz aktualizować tak często, jak chcesz. Zmienię specyfikację na „przynajmniej raz na minutę”.
steenbergh
1
@KritixiLithos To zepsułoby wyrównanie z dwucyfrowymi godzinami (9, 10 lub 23, 00), więc nie, niedozwolone.
steenbergh
1
Czy po 23 jest następna godzina 24 czy 0?
Kritixi Lithos

Odpowiedzi:

2

MATL , 41 bajtów

Dzięki @Kundor za zauważenie błędu, teraz poprawionego

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

Wypróbuj w MATL online! Pamiętaj jednak, że program zostaje zabity po 30 sekundach, więc trudno jest wyłapać jakiekolwiek zmiany w danych wyjściowych.

Jak to działa

`           % 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
źródło
Może to być ja, ale przy drugiej iteracji drukowana jest tylko górna linia ...
steenbergh 17.01.17
@steenbergh Działa dla mnie z minutami i sekundami zamiast godzin i minut, więc zmiany są łatwo widoczne: matl.suever.net/…
Luis Mendo
1
Tak, działa. - w rzeczywistości fajnie byłoby mieć to jako linie 3 i 4 mojego własnego zegara.
steenbergh
@steenbergh: zaakceptowałeś tę odpowiedź, ale jest ona nieprawidłowa - pokazuje godzinę po 23 jako 24. Uważam, że najkrótszą poprawną odpowiedzią jest Rubinowa według Value Ink.
Nick Matteo
@kundor Dziękujemy za zauważenie. Poprawiony kosztem 3 bajtów
Luis Mendo
11

TI-Basic, 94 bajty

" 
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

Stosunkowo proste. To ciąg z jedną spacją na początku. Godziny są wyrównane do prawej. Działa to tylko w kalkulatorach TI-84 +, ponieważ TI-83 nie ma wewnętrznego zegara.

Edycja: Dzięki @kundor za zauważenie, że nie zamknąłem ostatniej pętli. Naprawiono teraz (+2 bajty).

Edycja nr 2: Pierwsza godzina powinna wynosić zero, a nie dwadzieścia cztery. Korekta kosztem +14 bajtów.

Timtech
źródło
Każde polecenie liczy się jako jeden bajt?
Sygmei,
@Sygmei Większość tokenów to jeden bajt, tak. Jednakże, takie jak tokeny Str1, getTimei sub(są dwa bajty każda. Możesz dowiedzieć się więcej na stronie tibasicdev.wikidot.com/tokens
Timtech
Nie miałbyś linku do emulatora, prawda?
steenbergh
Polecam cemetech.net/projects/jstified ale pamiętam, że jest moralnie złe użycie ROM z Internetu z tego emulatora, chyba że jesteś właścicielem tego typu kalkulatora samodzielnie.
Timtech
1
Nie bój się kliknąć łącza, ponieważ emulator jest legalny i prosi o przesłanie własnej pamięci ROM, zanim zadziała. TI miał je za darmo, ale już ich nie ma. Jeśli możesz znaleźć TI-84 od znajomego, byłaby to najlepsza opcja.
Timtech
9

Partia, 197 bajtów

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

Uwaga: 10. linia ma spację końcową. Dla mnie %time%formatuje godziny z wiodącym odstępem, ale minuty z wiodącym zero. Uznałem, że wiodące zero jest łatwiejszym formatem wyjściowym, ponieważ wszystko, co muszę zrobić, to dodać 100 godzin i usunąć pierwszą cyfrę. Minuty są trudniejsze, ponieważ spowodują 08lub 09spowodują błędy analizy ósemkowej, więc 1efektywnie dodaję 100 minut, dostosowując się do tego poprzez odpowiednie przesunięcie pętli, która jest bajtem krótszym niż odejmowanie 100.

Neil
źródło
7

Python 3.6, 110 114 112 bajtów

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

Wykorzystuje to nowe formatowanie ciągów F w celu zapisania jednego bajtu ( f'\n{h+1:2} 'vs. '\n%2d '%(h+1)) Możesz zmienić [sleep(9)]na, 1aby zapisać 8 bajtów, ale wtedy to tylko spamowanie ekranu.

Zapisane jeden bajt zmieniającą while 1:...;sleep 60się while[sleep(60)]:...dzięki TuukkaX.

Musiałem użyć jeszcze 5 bajtów, aby następna godzina wyświetlana po 23 była równa 0, zamiast 24, jak właśnie skomentował OP. :-(

Odzyskano jeden bajt, śpiąc tylko 9 sekund zamiast 60.

Zaoszczędziłem dwa bajty, używając krótkiego majsterkowania, aby skrócić (h+1)%24, zapożyczonego z rubinowej odpowiedzi Value Ink .

Nick Matteo
źródło
Czy możesz wyjaśnić, dlaczego umieściłeś nawiasy kwadratowe wokół warunku if? Czy nie wystarczyłoby, aby odstęp między chwilą a snem wynosiłby 1 bajt, w przeciwieństwie do 2 z każdej strony? EDYCJA: Nieważne, aby to było prawdą. Słusznie.
Shadow
1
@shadow: sleepzwraca None, co jest fałszem.
Nick Matteo
@ ToivoSäwén: sleepjest również w timemodule, więc import * jest lepszy.
Nick Matteo
5

Ruby, 98 95 91 bajtów

Aktualizuje się co 5 sekund. Działa tylko w terminalach typu uniksowego.

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

Wersja wiersza polecenia systemu Windows, 95 92 bajty:

loop{t=Time.now;puts"\e[H\e[2J%02d %s
%02d "%[h=t.hour,?-*m=t.min,-~h%24]+?-*(60-m);sleep 5}
Wartość tuszu
źródło
Czy możesz używać backticków zamiast systemu? `cls`vssystem'cls'
IMP1
Wydaje się, że nie, ale możesz użyć, h=t.houra następnie użyć hzamiast drugiego t.hour, co pozwala zaoszczędzić 3 bajty.
IMP1
@ IMP1 rzeczywiście, backtyki nie działają cls. Dziękuję za twoją inną sugestię!
Wartość tuszu
Okazuje się, że @ IMP1 to puts`clear`droga, jeśli używasz terminali uniksowych. Po prostu nie działa z wierszem poleceń systemu Windows cls.
Wartość tuszu
W przypadku systemu Windows możesz puts"\e[H\e[2J"wyczyścić konsolę, która moim zdaniem goli cztery bajty. loop{t=Time.now;puts"\e[H\e[2J%02d %s
Spowoduje to
4

Perl 6 , 113 bajtów

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

Spróbuj raz z limitem jednej sekundy.

Lub wypróbuj zmienioną wersję, która generuje wynik działania przez kilka godzin.

Rozszerzony:

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
źródło
Jakie operatory obsługuje „trójkąt”? W [\+]dodaje i [\-]wydaje się odejmować. Czy to działa z mnożeniem i tym podobne?
Yytsi
@TuukkaX Powinno działać z prawie wszystkimi operatorami infix. Jest to w zasadzie to samo, [+] LISTco redukcja, tyle że daje wartości pośrednie. Zobacz stronę Dokumenty na produkty
Brad Gilbert b2gills
4

QBasic, 120 127 121 bajtów

Nie uruchamiaj tego zbyt długo, bo twój laptop się zapali. Teraz 99.several9s% ​​bardziej wydajny procesor.

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

Bez golfa i wyjaśnienia

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

Zaczynamy od wyczyszczenia ekranu, a następnie otrzymujemy bieżące godziny i minuty TIMER, które zwracają liczbę sekund od północy.

Po raz pierwszy próbowałem PRINT USING, więc z przyjemnością odkryłem, że nie ma zwyczajnego dziwactwa QBasic, że liczby dodatnie są drukowane z wiodącą spacją. ##ponieważ specyfikator formatu zapewnia, że ​​liczby jednocyfrowe są wyrównane do prawej i wypełnione spacją, zgodnie z wymaganiami. Niestety musimy użyć pętli dla łączników, ponieważ QBasic nie ma funkcji powtarzania łańcucha. (Jeśli się mylę, proszę dać mi znać!)

Wszystkie PRINTinstrukcje kończą się, ;aby ukryć nowy wiersz; ale po myślnikach potrzebujemy nowego wiersza; w ten sposób samotnik ?po wewnętrznej FORpętli.

To SLEEP 1jest teraz konieczne. Bez niego ekran jest usuwany tak szybko po wydrukowaniu, że to tylko migotliwy bałagan. (Z tego powodu użyłem LOCATE 1zamiast CLS, dopóki nie zdałem sobie sprawy, że CLSi SLEEPtak jest krótszy.) RUNPonownie uruchamia program od góry - najkrótszy sposób na uzyskanie nieskończonej pętli.

DLosc
źródło
Jak sobie z tym radzi ostatnia godzina dnia? Górna linia brzmi 23, ale jaka jest godzina w dolnej linii?
steenbergh
Używam Note7 i zastanawiam się nad uruchomieniem tego programu w dającej się przewidzieć przyszłości zamiast mojego paska czasu. Czy to dobry pomysł?
owlswipe
@steenbergh Ups, naprawione. Przydałoby się wspomnieć o tym przypadku krawędzi w pytaniu.
DLosc
@DLosc Nie, po prostu żartuję :)). Ale tak, mądry !!
owlswipe
1
@steenbergh Drukuje h MOD 24, jeśli początkowo h = 23, to w następnej pętli cykl ma 24 i zostaje zmieniony na 0. Ale jestem ciekawy, czy to również działa. CLS usuwa pierwszą linię, więc nigdy nie ma obu drukowanych linii na ekranie, prawda?
Jens
4

Java 8, 313 300 299 bajtów

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

To aktualizuje tylko co 30 iteracji pętli while. Pozostałe 29 iteracji po prostu drukuje nowe linie.

Zaktualizowano

Zaoszczędzono 13 14 bajtów dzięki pomocy Kevina Cruijssena! Dzięki!

CraigR8806
źródło
Cześć, witamy w PPCG! Przede wszystkim dozwolone są tylko programy / funkcje, a bieżący kod jest fragmentem kodu. Będziesz musiał go otoczyć metodą (tj. void f(){...}I musisz dodać wymagany import (w twoim przypadku import java.time.*;). Biorąc to pod uwagę, twój kod może być golfowany w wielu miejscach, aby obniżyć go do 311 bajtów (nawet z dodaną metodą -deklaracja i import). (Ponieważ jest za długi na ten komentarz, umieściłem go w następnym komentarzu .. 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 bajty ) Zalecam przeczytanie Porad dla golfistów w Javie i Porad dla golfistów w <wszystkich językach> . Miłego pobytu.
Kevin Cruijssen
@KevinCruijssen Zaktualizowałem moją odpowiedź i byłem w stanie zaoszczędzić jeszcze 3 bajty, używając notacji lambda. Zmieniłem również kilka elementów na kod, który podałeś, aby spełnić specyfikacje (np. for(i=0;i++<60Zamiast 61 i (h<10?zamiast 9. Dziękujemy za poinformowanie mnie o deklaracji metody i kilku wskazówkach golfowych!
CraigR8806
Ach, 61 zamiast 60 było rzeczywiście moim błędem. Myślałem, że napisałem to tak jak for(i=0;++i<61zamiast for(i=0;i++<61(w tym drugim przypadku powinno to być rzeczywiście 60, i chociaż jest to ta sama ilość bajtów, prawdopodobnie jest to bardziej oczywiste / czytelne). Jednak h<9mój kod jest poprawny. Miałeś h+1<10wcześniej i po prostu zmieniłem to na h<9usuwając 1 z obu stron. :)
Kevin Cruijssen
1
@KevinCruijssen Ha Nie podniosłem tego! h<9. Zmienię go, aby zapisać jeszcze 1 bajt. Dzięki jeszcze raz!
CraigR8806
4

C, 176 162 161 160 156 bajtów

Jest to rażące nadużycie wskaźników, ale kompiluje się i działa zgodnie z opisem. Pamiętaj, aby skompilować bez optymalizacji, w przeciwnym razie prawdopodobnie dojdziesz do awarii.

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

Nie golfowany:

#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
źródło
3

JavaScript (ES6), 162 bajty

Aktualizacje raz na sekundę

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
źródło
Możesz zaoszczędzić sporo bajtów, restrukturyzując kod, aby był to tylko jeden wyciąg (można wywołać console.clear()wewnątrz console.logargumentu) i przypisać jak najwięcej nieużywanym nawiasom. Wersja dla 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'+$:$))).
Łukasz
Możesz zaoszczędzić sporo bajtów, umieszczając godziny i minuty w jednej funkcji m=>`0${h++} \.slice(-3)+'-'.repeat(m).
Neil
3

Python 2, 131 129 127 bajtów

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

zapisał bajt dzięki @TuukkaX

ovs
źródło
2
Nie potrzebujesz nowej linii i spacji powhile 1:
Wheat Wizard
Zacząłem twój kod @ 19: 55. O 20:01 rozumiem 19 - \n 20 -----------------------------------------------------------. Godziny nie są aktualizowane ...
steenbergh
@steenbergh Sam próbowałem, ustawiając zegar ręcznie i działa dla mnie.
ovs
@ovs nie są zabawnymi wyzwaniami zegara :-). W każdym razie prawdopodobnie coś z repl.it wtedy ...
steenbergh
head-desk Serwer Repl.it jest o godzinę opóźniony w stosunku do mojego czasu lokalnego ... I nawet tak mówi na samym szczycie konsoli.
Wyjdę na
3

C 251 267 251 bajtów

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

Wersja bez golfa

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

Wykonuje pracę! Zdecydowanie można go w jakiś sposób skrócić. Załóżmy, że unistd.hplik jest dołączony.

@Neil Dzięki za informację.

@Seth Thanks, za zapisanie 8 bajtów.

Abel Tom
źródło
IIRC musisz uwzględnić wszystko, co niezbędne do skompilowania kodu (w tym przypadku definicji time_ti struct tm) w liczbie bajtów.
Neil
Zamiast printf("\n");ciebie możesz użyćputs("");
Seth
3

Pierwszy raz w golfa ...

PowerShell, 116 bajtów (było 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}

Edycja: Z porady @ AdmBorkBork zmieniono Get-Date na datę i Wyczyść na cls, aby zaoszczędzić 6 bajtów.

mcmurdo
źródło
Witamy w PPCG, dobra odpowiedź
George
Witamy w PPCG! Kilka łatwych golfów - możesz używać clszamiast cleari (o ile jesteś na Windowsie) datezamiast get-date. Jestem też pewien, że istnieje łatwiejszy sposób na wyjście z formatowania - bawię się nim i dam ci znać, jeśli coś wymyślę.
AdmBorkBork
Miły. Spróbuj tego: 108 bajtów while($d=date){cls;"{0,2} {2}``n{1,2} {3}"-f($h=$d.Hour),(++$h%24),('-'*($m=$d.Minute)),('-'*(60-$m));Sleep 9}. Użyj podziału linii LF w swoim edytorze zamiast ``
n
3

PHP, 104 105 bajtów

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

prezentacja printfniestandardowych znaków dopełniania:
"%'-Ns"= lewy ciąg padu z -do Nznaków.

wydrukuje 99 nowych linii (co 6 sekund) zamiast czyszczenia ekranu.

Pierwszy znak nowej linii musi być pojedynczym znakiem. W systemie Windows należy go zastąpić \n.

Tytus
źródło
2

GameMaker Language, 134 bajty

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

W ustawieniach musisz ignorować niekrytyczne błędy, aby to zadziałało. Również w GML #jest równoważny z \nwiększością języków.

Timtech
źródło
2

Perl 6 , 104 bajtów

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

Musi być uruchomiony na terminalu kompatybilnym z ANSI, aby sekwencja sterująca do resetowania terminala działała.

Całkiem proste (ponieważ bardziej zaciemnione podejścia, które próbowałem, okazały się dłuższe):

  • DateTime.now.&{" "}.say xx*: Przekształć bieżący czas w ciąg znaków (patrz poniżej) i powiedz to, a następnie powtórz wszystko nieskończoną liczbę razy. Ciąg jest zbudowany w następujący sposób:
    • \ec: Kod sterujący ANSI <ESC>cdo resetowania terminala, który czyści ekran.
    • {.hour.fmt: '%2s'}: godzina, wyrównane do prawej do 2 kolumn
    • : przestrzeń
    • {'-'x.minute}: myślnik powtarzany razy minutę
    • \n: Nowa linia
    • {(.hour+1).fmt: '%2s'}: następna godzina, wyrównane do prawej do 2 kolumn
    • : przestrzeń
    • {'-'x 60-.minute}: myślnik powtarzany razy 60 minus minuta
smls
źródło
2

AWK, 190 bajtów

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

Ponieważ AWKnie ma wbudowanej sleepfunkcji, po prostu stale sprawdzam zegar, aby sprawdzić, czy minuta się jeszcze nie zmieniła. Najważniejsze, że to działa ... prawda? :)

Robert Benson
źródło
2

Python 3.5, 127 120 117 bajtów

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
źródło
1
Czy nie możesz print('\n'*50)zamiast tego działać os.system('cls')tak na * nix i Windows? Zaoszczędziłby kilka bajtów, ponieważ możesz utracić osimport, a OP mówi, że jest to dozwolone.
ElPedro
Och, wtedy nie przeczytałem go poprawnie. Dzięki wielkie.
Gurupad Mamadapur,
Tylko dla informacji, większość ludzi używa <s> </s> wokół swojej starej liczby bajtów, a następnie umieszcza nową liczbę bajtów po niej, ponieważ interesujące jest zobaczenie postępu w miarę poprawy odpowiedzi :-) Musisz spróbować 3.5 trochę czas. Nadal pracuję z Python 2.
ElPedro
1
@ElPedro Tak, zapomniałem to zrobić. Będę teraz edytować.
Gurupad Mamadapur,
2

Python, 115 113 bajtów

zaoszczędził kilka bajtów dzięki @kundor i @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
źródło
Przynajmniej w moim systemie nie usuwa to ukrytych znaków, więc liczba myślników w drugiej linii nie maleje z upływem czasu. Ponadto: możesz zapisać trzy bajty, umieszczając pętlę while w jednym wierszu, a dwa bajty, zmieniając :02formaty na just :2.
Nick Matteo
2
Możesz naprawić problem opisany przez @kundor w 1 bajcie, dodając spację po odpowiednim {}.
Phlarx
@kundor naprawiony! Dzięki. Zachowałem ten :02format, by wstawić prawą cyfrę jednocyfrową z zerami.
dfernan
@kundor * lewy pad jedna cyfra godziny z zerami.
dfernan
@dfernan: Cóż, :2lewe pola ze spacjami, które według wyzwania są w porządku.
Nick Matteo
2

C # Interactive (138 bajtów)

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
źródło
1
Czy możesz zagrać w golfa o 1) dzamiast nazwy daty var dt? i 2) użyć sleep(1e3)czy 999zamiast 1000?
steenbergh
@steenbergh patrz aktualizacja
series0ne
Kilka rzeczy ... To tylko fragment kodu, a nie metoda lub program (nie jestem pewien, czy jest poprawny w C # Interactive), to w zasadzie wersja mojego kodu w golfa, i jeśli powinna być skomentowana jako ulepszenie, a nie oddzielne rozwiązanie (choć jest to spekulacja) i jest wiele drobnych ulepszeń, które możesz wprowadzić tutaj i czy potrzebujesz nawet snu?
TheLethalCoder
@TheLethalCoder W szczególności umieściłem C # Interactive, ponieważ działa TYLKO w interaktywnej konsoli. Nie działałoby to jako standardowy program w języku C #.
series0ne
Zauważ też, że to nie zadziała, gdy godzina będzie 23, a gdy minuta będzie 0
TheLethalCoder
2

PHP, 112 120 bajtów

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

Ponieważ nie ma sposobu na wyczyszczenie ekranu (który mogę znaleźć) musiałem iść z kupą nowych linii. Również pytanie, które jest aktualizowane do „co najmniej” raz na minutę, oszczędza bajt 9zamiast60 .

edycja: @Titus zauważył błąd w dopełnieniu drugiej godziny. Naprawienie kosztuje 8 bajtów.

użytkownik59178
źródło
Te komunikaty ostrzegawcze tekst na standardowe wyjście wraz z odpowiednim wyjściem: 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. Coś na ten temat w Meta?
steenbergh
@steenbergh To jest zawiadomienie; nie będzie wyświetlana, jeśli użyjesz wartości domyślnych (parametr wiersza poleceń -nluberror_reporting(22519);
Titus
godziny należy uzupełnić do długości 2
Tytus
Dobrze, Hustawienie daty to 00-23, ale zapomniałem o tym na drugą godzinę.
user59178,
Zaoszczędź dwa bajty z fizycznymi podziałami linii.
Tytus
2

Bash (3 i 4): 90 bajtów

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

Ze względu na użycie $0tego skryptu należy go umieścić w pliku, a nie wkleić w interaktywnej powłoce bash.

Pierwsze polecenie ustawia $dna 60 łączników; opiera się na fakcie, że pierwsza linia tego skryptu ma długość 60 znaków. To trzy postacie krótsze niż kolejna najlepsza rzecz, jaką mogłem wymyślić:

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

Jeśli nie chcesz, aby to ostatecznie powodowało, że Twoje urządzenie nie korzysta z PID-ów lub pamięci, możesz dodać eval na początku ostatniego wiersza, co dałoby 95 bajtów.

Evan Krall
źródło
Daje mi błąd let: h=09: value too great for base (error token is "09"). Problem polega na tym, że zera wiodące są interpretowane jako stałe ósemkowe, więc 09 jest niepoprawny.
Nick Matteo
Hrm, to znaczy, że mój skrypt jest zepsuty na kilka sposobów. Dzięki.
Evan Krall,
2

BASH, 165 141 155 bajtów

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
źródło
1
Mógłbym zaoszczędzić kolejne 8 bajtów, usuwając sen, ale nie czuję się dobrze z nieokreśloną, gdy pętla działa na moim komputerze bez snu ;-)
pLumo
Niektóre optymalizacje: przejdź sleep 9do stanu pętli while; usuń -przed M w ciągu formatu w wierszu 4. Nie musisz także używać $ przed nazwami zmiennych w wyrażeniach arytmetycznych, więc $((60-$m))może być$((60-m))
Evan Krall
Nie jestem pewien, czy twoja matematyka na linii 9 jest dokładna: h=23; echo $((10#$h+1))drukuje dla mnie 24.
Evan Krall,
Co jest nie tak z 24?
pLumo,
Potrzebuję -M, ponieważ $ ((60-08)) daje błąd.
pLumo,
1

Gura , 138 bajtów

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

Dość krótkie i proste :)

Sygmei
źródło
Wow ... To szybko. Jakieś wskazówki na temat uruchamiania Gury? Właśnie pobrałem pliki binarne, ale uruchomienie Gura.exei wklejenie tego kodu powoduje błąd składniowy symbol k is not defined.
steenbergh
Zapomniałem średnika! Możesz spróbować uruchomić go ponownie :)
Sygmei
1
Czy to aktualizuje co minutę? Wygląda na to, że konsola uruchomiła ten kod tylko raz ...
steenbergh
Woops, nie widziałem tej części, powinien już działać!
Sygmei,
Po aktualizacji powinien wyczyścić ekran lub dodać 30 nowych linii. Człowieku, jestem w twojej sprawie ...
steenbergh
1

Ok, nie robiłem już golfa od jakiegoś czasu, więc oto moja smutna próba :)

Unix Korn Shell: 177 171 170 bajtów

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
Tak samo
źródło
połączyłem 2 echa w 1, zapisałem kilka bajtów ... (spać 9 zamiast spać 10 zapisuje 1 bajt: P) lol
Ditto
1

Mathematica, 235 bajtów

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]
jaskółka oknówka
źródło
1

Przetwarzanie, 204 200 198 197 bajtów

5 bajtów zapisanych dzięki @L. Serné przy użyciu inteligentniejszych trójskładników

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

To daje ponad 30 nowych linii dla każdej aktualizacji (która ma miejsce, gdy ramka zostanie zaktualizowana)

Nie golfił

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
źródło
Zmiana ((i=hour())<10?" ":"")+ina ((i=hour())>9?i:" "+i)dwa pozwoli zaoszczędzić 2B ... Powodzenia w dalszej grze w golfa!
Łukasza
@ L.Serne dzięki za wskazówkę :)
Kritixi Lithos
Kolejne ulepszenie, które może zadziałać: ((i=hour()+1)>24?i=0:i)>9staje się (i=hour()+1)>9, ponieważ hourwypisuje liczbę z zakresu 0-23, a nawet z 1 dodaną do tego, nigdy nie będzie większa niż 24. Ponadto należy przesunąć przyrost iwarunku wewnątrz forpętli jak w ostatniej pętli. Powinny w sumie zaoszczędzić 13B.
Łukasz
@ L.Serné Po pierwsze, nadal muszę uwzględnić trójskładnik, ponieważ 23 + 1 w 24-godzinnym zegarze staje się 0 (a przynajmniej tak mi się wydaje). Następnie, jeśli przesunę krok przyrostu iwarunku pętli for, irozpocznie się jako 1zamiast 0i muszę dodać jeszcze jeden bajt, i++<=minute()a liczba bajtów pozostanie taka sama. Ale mimo to dziękuję za pomoc w golfie o jeszcze 1 bajt :)
Kritixi Lithos
1

C, 239 bajtów

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

Zainspirowany wpisami Setha i Abla, w razie potrzeby wyświetli 0 zamiast 24 przez następną godzinę i użyje 30 linii do wyczyszczenia ekranu.

Ahemone
źródło
1

SmileBASIC, 55 bajtów

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

Wyjaśnienie:

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)

Uwaga: SmileBASIC ma tylko 50 kolumn tekstu, więc nie będzie dobrze wyglądać ...

12Me21
źródło
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);}

Ten kod zakłada, że using System.Threading;wiersz jest uwzględniony.

Pełna klasa:

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
źródło
To rozwiązanie nie ma możliwości wyjścia z pętli (oryginał, skomentowany, uruchamia kod w osobnym wątku), więc Console.ReadKeyinstrukcja jest zbędna. Jedynym sposobem na wyjście jest zamknięcie okna konsoli lub Ctrl+Break...
nurchi
Jest to tylko fragment kodu, a nie metoda lub program, a także using System.Threading;należy go uwzględnić w liczbie bajtów, jeśli go używasz. To samo z Using System;.
TheLethalCoder