Настав час для годинного виклику!


25

Я хотів би, щоб ви побудували мені годинник, який відображає час у такому форматі:

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

Це відображає '18: 10 '. Поточна година та наступна година відображаються в передній частині рядка, після чого пробіл і ряд тире: на першому рядку кількість хвилин, що пройшли за цю годину, а в другому рядку відображається скільки ще хвилин йти в цю годину.

Для уточнення

  • Годинник повинен відображати час системи. Якщо час отримати з іншого джерела зручніше, це теж добре. Він може не подаватися як вхід.
  • У 18:00верхньому рядку просто 18(пробіли дозволені, але не обов'язкові)
  • В 18:59, в нижньому рядку19 -
  • Години <10 або попередньо обкладені 0( 01 -----), або вирівняні вправо ( 1 -----). Однозначна вирівнювання ліворуч не дозволена, навіть якщо тире починається в потрібному місці ( 1 -----недійсне).
  • Годинник повинен відображати години у форматі 24 години.
  • Хоча це називається 24-годинним форматом, насправді 24його немає. Протягом 23-ї години другий рядок починається з 00або 0.
  • Дисплей потрібно оновлювати принаймні раз на хвилину, але це не повинно відбуватися рівно за 00секунду. Ви можете оновлюватись частіше / постійно, якщо це зручніше, але результат, звичайно, повинен бути розбірливим - жодного мазка по всьому екрану.

Вхідні дані

Немає.

Вихідні дані

  • Як описано вище. На обох лініях дозволено проміжок часу, щоб встановити годинник до 60-ти позицій, також дозволений кінцевий новий рядок.
  • Екран потрібно очистити під час відображення наступної хвилини: або командою з чітким екраном, або додавши не менше 30 нових рядків.

Додаткові правила


може у нас є два проміжки між числом і тире?
Адам

6
"оновлюється раз на хвилину" - Чи можна оновлювати її частіше?
smls

1
@smls Так, ви можете оновлюватись скільки завгодно. Я поміняю характеристики на "хоча б раз на хвилину".
steenbergh

1
@KritixiLithos Це порушило б вирівнювання з двоцифровими годинами (9, 10 або 23 00), тому ні, не дозволено.
steenbergh

1
Після 23, наступна година 24 чи 0?
Kritixi Lithos

Відповіді:


2

MATL , 41 байт

Дякуємо @Kundor за те, що помітив помилку, яку тепер виправлено

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

Спробуйте в MATL онлайн! Але зауважте, що програма вбивається через 30 секунд, тому важко вловити будь-які зміни у виході.

Як це працює

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

Може мені бути, але на другій ітерації друкується лише верхній рядок ...
steenbergh

@steenbergh Це працює для мене хвилин і секунд замість годин і хвилин, тому зміни легко помітити: matl.suever.net/…
Луїс Мендо

1
Так, працює. - насправді, може бути круто, щоб це було як рядки 3 та 4 мого власного годинника.
steenbergh

@steenbergh: ти прийняв цю відповідь, але вона не вірна - вона показує годину після 23 як 24. Я вважаю, що найкоротша правильна відповідь - Ruby one by Value Ink.
Нік Маттео

@kundor Дякую за те, що помітили. Виправлено ціною 3 байти
Луїс Мендо

11

TI-Basic, 94 байти

" 
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

Відносно прямо. Це рядок з одним пробілом на початку. Години вирівнюються вправо. Це працює лише на калькуляторах TI-84 +, оскільки TI-83 не має внутрішнього годинника.

Редагувати: Дякую @kundor за те, що я не закрив останню петлю. Виправлено зараз (+2 байти).

Редагування №2: Перша година повинна бути нульовою, а не двадцять чотири. Виправлено вартістю +14 байт.


Кожна команда вважається одним байтом?
Сигмей

@Sygmei Більшість жетонів - це один байт, так. Тим НЕ менше, маркери , такі як Str1, getTimeі sub(є два байта кожен. Ви можете дізнатися більше на сайті tibasicdev.wikidot.com/tokens
Timtech

Ви б не мали посилання на емулятор, чи не так?
steenbergh

Я б рекомендував cemetech.net/projects/jstified, але пам’ятайте, що морально неправильно використовувати ПЗУ з Інтернету за допомогою цього емулятора, якщо ви самі не володієте цим типом калькулятора.
Тімтех

1
Не бійтеся натискати на посилання, тому що емулятор є законним і просить завантажити свій власний ROM, перш ніж він запрацює. TI раніше мав їх у вільному доступі, але вони вже не є. Якщо ви можете знайти TI-84 у друга, це був би найкращий варіант.
Timtech

9

Пакет, 197 байт

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

Примітка: 10-й рядок має пробіл. Для мене %time%форматування годин із провідним простором, але хвилин із початковим нулем. Я вирішив, що провідний нуль - це простіший вихідний формат, оскільки все, що мені потрібно зробити, - це додати 100 годин і видалити першу цифру. Хвилини складніші, оскільки 08або 09спричиняють восьмигранні помилки синтаксичного розбору, тому я префіксую 1ефективно додаючи 100 хвилин, коригуючи це шляхом відповідного зміщення циклу, що на байт коротше, ніж віднімання 100.


7

Python 3.6, 110 114 112 байт

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

Це використовує нове диафрагменное рядок форматування , щоб зберегти один байти ( f'\n{h+1:2} 'проти '\n%2d '%(h+1)) . Ви можете змінити , [sleep(9)]щоб 1врятувати 8 байт, а потім він просто спам екрану.

Збережений один байт змінився while 1:...;sleep 60на while[sleep(60)]:..., завдяки TuukkaX.

Мені довелося використати ще 5 байтів, щоб наступна година відображалася після 23, щоб вона становила 0, а не 24, як ОП щойно коментував. :-(

Відновлено один байт, спавши лише 9 секунд замість 60.

Збережено два байти за допомогою скорочення (h+1)%24, щоб скоротити , запозичене у відповіді Ruby Value Ink .


Чи можете ви поясніть, чому ви поставили квадратні дужки навколо умови if? Чи не просто простір між режимом "час і сон" буде 1 байтом, на відміну від 2 з обох боків? EDIT: Неважливо, зробити це правдою. Досить справедливо.
Тінь

1
@shadow: sleepповертається None, що є помилковим.
Нік Маттео

@ ToivoSäwén: sleepтакож є в timeмодулі, тому імпорт * краще.
Нік Маттео

5

Рубі, 98 95 91 байт

Оновлення кожні 5 секунд. Працює лише в терміналах у стилі Unix.

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

Версія командного рядка Windows, 95 92 байти:

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

Чи можете ви використовувати задні посилання замість системних? `cls`vssystem'cls'
IMP1

Здається, ні, але ви можете використовувати, h=t.hourа потім використовувати hзамість другого t.hour, що економить 3 байти.
IMP1

@ IMP1, справді, backbox не працює cls. Дякую за іншу пропозицію!
Значення чорнила

@ IMP1, як виявляється, puts`clear`це шлях, якщо ви використовуєте термінали Unix. Він просто не працює з командним рядком Windows cls.
Значення чорнила

Для вікон ви можете puts"\e[H\e[2J"очистити консоль, яку я думаю, голить чотири байти. Перший рядок loop{t=Time.now;puts"\e[H\e[2J%02d %s
змусив

4

Perl 6 , 113 байт

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

Спробуйте один раз із тайм-аутом на секунду.

Або спробуйте змінену версію, яка виводить результат роботи протягом декількох годин.

Розширено:

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
}

Які оператори підтримує "трикутник"? У [\+]ньому додається і в [\-]ній віднімається. Чи працює це з множенням і таке?
Yytsi

@TuukkaX Це має працювати майже з усіма операторами інфікування. Це в основному те саме, [+] LISTщо зменшити, за винятком того, що дає проміжні значення. Дивіться сторінку документації для продукту
Бред Гілберт b2gills

4

QBasic, 120 127 121 байт

Не запускайте це дуже довго, або ваш ноутбук загориться. Зараз на 99.several9s% ​​ефективніше процесор.

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

Необурені і пояснення

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

Почнемо з очищення екрана, потім отримуємо поточні години та хвилини TIMER, що повертає кількість секунд з півночі.

Це перший раз, коли я спробував PRINT USING, тому мені було приємно виявити, що він не страждає від звичайної химерності QBasic, що позитивні цифри друкуються з провідним пробілом. ##оскільки специфікатор формату гарантує, що одноцифрові номери вирівнюються вправо та пробілом, якщо потрібно. Ми повинні використовувати цикл для дефісів, на жаль, оскільки QBasic не має функції повторення рядків. (Якщо я помиляюся, будь ласка, повідомте мене!)

Усі PRINTвисловлювання закінчуються ;придушенням нового рядка; але після дефісів нам потрібен новий рядок; таким чином, одиночний ?після внутрішньої FORпетлі.

Зараз SLEEP 1це необхідно. Без цього екран очищається так швидко після друку, що це просто мерехтливий безлад. (Я використовував LOCATE 1замість цього CLSспочатку з цієї причини, поки не зрозумів цьогоCLS з " SLEEPвсе одно коротше".) RUNПерезапускає програму зверху - найкоротший спосіб отримати нескінченний цикл.


Як це справляється за останню годину дня? У верхньому рядку написано 23, але що, година в нижньому рядку?
steenbergh

Я використовую Note7 і думаю запустити цю програму в осяжному майбутньому замість свого годинникового рядка стану. Це гарна ідея?
сова

@steenbergh Whoops, виправлено. Вам було б корисно згадати цей крайній випадок у питанні.
DLosc

@DLosc Nah, я просто жартую :)). Але так, розумний !!
сова

1
@steenbergh Він друкує h MOD 24, якщо спочатку h = 23, то наступний цикл циклу його 24 і стає модифікованим до 0. Але мені цікаво, чи працює він також. CLS видаляє перший рядок, щоб ніколи не було обох друкованих рядків на екрані, правда?
Єнс

4

Ява 8, 313 300 299 байт

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

Це оновлює лише кожні 30 ітерацій циклу while. Інші 29 ітерацій просто друкують нові рядки.

Оновлено

Збережено 13 14 байтів завдяки допомозі Кевіна Круїссена! Спасибі!


Привіт, Ласкаво просимо до PPCG! Перш за все, дозволені лише програми / функції, а ваш поточний код - фрагмент. Вам доведеться оточити його методом (тобто void f(){...}потрібно додати необхідний імпорт (у вашому випадку import java.time.*;). Враховуючи це, ваш код можна переграти в декількох місцях, щоб знизити його до 311 байт (навіть із доданим методом) (декларування та імпорт). (Оскільки цей коментар занадто довгий, я розмістив його в наступному коментарі .. xD)
Кевін Круїйсен

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 байти ) Я рекомендую прочитати Поради щодо гольфу на Java та Поради щодо гольфу на <всіх мовах> . Насолодитися перебуванням.
Кевін Круїйсен

@KevinCruijssen Я оновив свою відповідь і зміг зберегти ще 3 байти за допомогою лямбда-нотації. Також я змінив декілька фрагментів коду, який ви надали, а також, щоб відповідати специфікаціям (наприклад, for(i=0;i++<60замість 61 і (h<10?замість 9. Дякую за те, що ви повідомили про декларацію про методи та деякі поради щодо гольфу!
CraigR8806

А, 61 замість 60 справді була моєю помилкою. Я думав, що написав це як for(i=0;++i<61замість for(i=0;i++<61(у другому випадку це дійсно повинно бути 60, і хоча це однакова кількість байтів, це, мабуть, більш очевидно / читабельно). Хоча h<9в моєму коді правильно. У вас були h+1<10раніше, і я просто змінив це на h<9, видаливши 1 з обох сторін. :)
Кевін Круїссен

1
@KevinCruijssen Ha Я цього не брав! h<9. Я відредагую його, щоб зберегти ще 1 байт. Знову дякую!
CraigR8806

4

C, 176 162 161 160 156 байт

Це грубе зловживання покажчиками, але компілюється та працює, як зазначено. Обов’язково компілюйте без оптимізації, інакше ви, швидше за все, потрапите на 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));}

Безголівки:

#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 байти

Оновлення раз на секунду

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)


Ви можете зберегти досить багато байтів шляхом реструктуризації коду, так що це лише одне твердження (можна зателефонувати console.clear()всередині console.logаргументу) і максимально призначити невикористані дужки. Версія для 15: 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'+$:$))).
Лука

Ви можете зберегти купу байт, поставивши години та хвилини в одну функцію m=>`0${h++} \.slice(-3)+'-'.repeat(m).
Ніл

3

Python 2, 131 129 127 байт

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

зберегли байт завдяки @TuukkaX


2
Новий рядок та пробіл вам не знадоблятьсяwhile 1:
Пшеничний майстер

Я запустив ваш код @ 19: 55. О 20:01, бачу 19 - \n 20 -----------------------------------------------------------. Години не оновлюються ...
steenbergh

@steenbergh Я спробував це сам, встановивши годинник вручну, і він працює для мене.
ов

@ovs - це не задоволення від годинника :-). У всякому разі, напевно, щось із repl.it тоді ...
steenbergh

головний стіл Сервер Repl.it на одну годину відстає від мого місцевого часу ... І це навіть говорить у самій верхній частині консолі. Я побачу себе, спасибі ...
steenbergh

3

C 251 267 251 байт

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

Безгольова версія

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

Здійснює виконану роботу! Однозначно можна якось скоротити. Припустимоunistd.h файл включений.

@Neil Дякую за інформацію.

@Seth Спасибі за економію 8 байт.


IIRC, ви повинні включити все необхідне для отримання коду для компіляції (у цьому випадку визначень time_tта struct tm) у свій рахунок байтів.
Ніл

Замість того , printf("\n");ви можете використовуватиputs("");
Сет

3

Перший раз гольф ...

Powershell, 116 байт (було 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}

Редагувати: з порад @ AdmBorkBork, змінити «Дата отримання» на дату та «Очистити» на cls, щоб заощадити 6 байт.


Ласкаво просимо в PPCG, хороша відповідь
Джордж

Ласкаво просимо до PPCG! Кілька простих гольфів - ви можете використовувати clsзамість clearі (поки ви в Windows) dateзамість get-date. Я також впевнений, що є якийсь простіший спосіб вивести форматування - я граю з ним, і я повідомлю вам, якщо я щось придумаю.
AdmBorkBork

Приємно. Спробуйте це: 108 байт while($d=date){cls;"{0,2} {2}``n{1,2} {3}"-f($h=$d.Hour),(++$h%24),('-'*($m=$d.Minute)),('-'*(60-$m));Sleep 9}. Використовуйте розрив рядка LF у своєму редакторі замість `` n`
mazzy

3

PHP, 104 105 байт

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

вітрина printfспеціальних символів прокладки:
"%'-Ns"= ліва рядок колодки з -доN символів.

надрукує 99 нових рядків (кожні 6 секунд) замість очищення екрана.

Перший новий рядок повинен бути одним символом. Отже, у Windows він повинен бути замінений на \n.


2

Мова GameMaker, 134 байти

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

У налаштуваннях ви повинні ігнорувати не фатальні помилки, щоб це працювало. Також у GML #рівнозначно \nбільшості мов.


2

Perl 6 , 104 байти

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

Потрібно запустити на терміналі, сумісному з ANSI, щоб послідовність керування для скидання термінала працювала.

Досить базовий (тому що більш заплутані підходи я намагався вийти довше):

  • DateTime.now.&{" "}.say xx*: Перетворіть поточний час у рядок (див. Нижче) і скажіть його, і повторіть все це нескінченну кількість разів. Рядок побудований так:
    • \ec: Код управління ANSI <ESC>cдля скидання терміналу, який очищає екран.
    • {.hour.fmt: '%2s'}: година, вирівнюється вправо до 2 стовпців
    • : простір
    • {'-'x.minute}: тире повторюється раз у хвилину
    • \n: новий рядок
    • {(.hour+1).fmt: '%2s'}: наступна година, вирівнюється праворуч до 2 стовпців
    • : простір
    • {'-'x 60-.minute}: тире повторення разів 60 мінус хвилини

2

AWK, 190 байт

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

Оскільки у AWKнього немає вбудованої sleepфункції, я просто маю її постійно перевіряти годинник, щоб побачити, чи змінилася хвилина. Ключове, що це працює ... правда? :)


2

Python 3,5, 127 120 117 байт

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
Чи можете ви не просто print('\n'*50)замість os.system('cls')цього працювати як на * nix, так і на Windows? Заощадите пару байтів, оскільки ви можете втратити osімпорт, і ОП каже, що це дозволено.
ElPedro

О, я не прочитав його належним чином. Велике спасибі людино.
Гурупад Мамадапур

Щойно для інформації, більшість людей, як правило, використовують <s> </s> навколо свого старого рахунку байтів, а потім кладуть нове число байтів після цього, тому що цікаво бачити прогрес, оскільки відповідь покращується :-) Потрібно спробувати 3,5 деякі час. Я все ще працюю з Python 2.
ElPedro

1
@ElPedro Так, я забув це зробити. Я зараз редагую.
Гурупад Мамадапур

2

Пітон, 115 113 байт

зберегли пару байтів завдяки @kundor та @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)))

Принаймні в моїй системі це не стирає основні символи, так що кількість тире на другому рядку не зменшується в міру проходження часу. Також: ви можете зберегти три байти, поставивши цикл while на один рядок, і два байти, змінивши :02формати на справедливі :2.
Нік Маттео

2
Виправити проблему, описану @kundor, можна в 1 байті, додавши пробіл після відповідного {}.
Фларкс

@kundor виправлено! Спасибі. Я зберігав :02формат, щоб праворуч прокладати одну цифру годин з нулями.
dfernan

@kundor * ліворуч на одну цифру годин з нулями.
dfernan

@dfernan: Ну, :2ліві колодки з пробілами, про які йдеться у виклику.
Нік Маттео

2

C # Інтерактивна (138 байт)

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
Чи можете ви скористатись цим способом на 1), dзамість того, щоб назвати варію дати замість dt? і 2) використовувати sleep(1e3)або 999замість 1000?
steenbergh

@steenbergh дивіться оновлення
серія0ne

Кілька речей ... Це просто фрагмент, а не метод або програма (не впевнений, чи він дійсний у C # Interactive, хоча), це по суті версія для мого коду для гольфу, і якщо це слід було прокоментувати як поліпшення, а не окреме рішення (хоча це спекуляція), і тут ви можете вдосконалити багато невеликих удосконалень, і вам навіть сон потрібен?
TheLethalCoder

@TheLethalCoder я спеціально поставив C # Interactive, оскільки це працює В інтерактивній консолі ТОЛЬКО. Це не працює як стандартна програма C #.
серія0ne

Також зауважте, що це не буде працювати, коли година 23, а хвилина 0
TheLethalCoder

2

PHP, 112 120 байт

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

Оскільки немає можливості очистити екран (що я можу знайти), мені довелося перейти з купою нових рядків. Також питання, яке оновлюється до "принаймні" раз на хвилину, економить байт, 9а не 60.

редагувати: @Titus помітив помилку в підкладці другої години. Виправлення коштувало 8 байт.


Це відображає попередження текст на стандартний висновок поряд з правильним виходом: 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. Щось із мета про це?
steenbergh

@steenbergh Це повідомлення; він не відображатиметься, якщо ви використовуєте значення за замовчуванням (параметр командного рядка -nабоerror_reporting(22519);
Titus

години повинні бути прокладені на довжину 2
Тит

Хороший момент, Hналаштування дати йде з 00-23, але я забув про це на другу годину.
користувач59178

Збережіть два байти за допомогою фізичних рядків.
Тит

2

Bash (3 і 4): 90 байт

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

Завдяки використанню $0 цього сценарію потрібно помістити у файл, а не вставити в інтерактивну оболонку bash.

Перша команда встановлює $d60 дефісів; він спирається на те, що перший рядок цього сценарію має 60 символів. Це на три символи коротше, ніж наступне найкраще, що я міг би придумати:

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

Якщо ви не хочете, щоб у вашому полі в кінцевому підсумку вичерпувався PID або пам'ять, ви можете додати eval до початку останнього рядка, який би зробив це 95 байт.


Подає мені помилку let: h=09: value too great for base (error token is "09"). Проблема полягає в тому, що провідні нулі інтерпретуються як вісімкові константи, тому 09 недійсний.
Нік Маттео

Hrm, це означає, що мій сценарій розбитий декількома способами. Спасибі.
Еван Кралл

2

БАШ, 165 141 155 байт

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
Я міг би зберегти ще 8 байт, виймаючи сон, але мені не комфортно невизначений час, коли цикл працює на моєму комп’ютері без сну ;-)
pLumo

Деякі оптимізації: перехід sleep 9до стану циклу while; видаліть -перед М в рядку формату в рядку 4. Також вам не потрібно використовувати $ перед іменами змінних в арифметичних виразах, так $((60-$m))можна$((60-m))
Еван Кралл

Я не впевнений, чи точна ваша математика по рядку 9: h=23; echo $((10#$h+1))відбитки 24 для мене.
Еван Кралл

Що не так з 24?
pLumo

Мені потрібна -М, оскільки $ ((60-08)) дає помилку.
pLumo

1

Гура , 138 байт

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

Досить короткий і прямий :)


Нічого ... Це швидко. Якісь поради щодо запуску Гури? Щойно завантажили двійкові файли, але запуск Gura.exeта вставлення в цьому коді дає мені синтаксичну помилку symbol k is not defined.
steenbergh

Забув крапку з комою! Ви можете спробувати запустити його знову :)
Sygmei

1
Чи оновлюється це щохвилини? Здається, консоль запускає цей код лише один раз ...
steenbergh

Вуп, не бачив тієї частини, зараз повинен працювати!
Сигмей

Коли він оновлюється, він повинен або очистити екран, або додати 30 нових рядків. Людина, я за вашою справою ...
steenbergh

1

Гаразд, не робили гольфу з кодом за деякий час, тому ось моя сумна спроба :)

Оболонка Unix Korn: 177 171 170 байт

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

зробив 2 відлуння на 1, врятував декілька байтів ... (спати 9 замість сну 10 економить 1 байт: P) lol
Дітто

1

Математика, 235 байт

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

Обробка, 204 200 198 197 байт

5 байт збережено завдяки @L. Серне, використовуючи розумніші тернари

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

Це виводить 30+ нових рядків для кожного оновлення (яке відбувається, коли кадр оновлюється)

Безумовно

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

Перехід ((i=hour())<10?" ":"")+iна ((i=hour())>9?i:" "+i)два рази врятує 2В ... Удачі в подальшому гольфі!
Лука

@ L.Serne дякую за пораду :)
Kritixi Lithos

Ще одне поліпшення, яке може спрацювати: ((i=hour()+1)>24?i=0:i)>9стає (i=hour()+1)>9, оскільки hourвиводить число в діапазоні 0-23, і навіть додавши до цього 1, воно ніколи не буде більшим за 24. Також слід перемістити приріст iвнутрішньої умови вfor циклі як ви робили в останній цикл. Слід зберегти 13B в цілому.
Лука

@ L.Serné Для першого моменту я все-таки повинен включити потрійну, тому що 23 + 1 в цілодобовому годиннику стає 0 (або, принаймні, я думаю). Далі, якщо я переміщу прирістi всередині умови for-loop, iпочнеться як 1замість цього, 0і мені потрібно додати ще один байт, i++<=minute()і байт -рахунок все одно буде таким самим. Але тим не менше, дякую, що допомогли мені у гольфі ще 1 байт :)
Kritixi Lithos

1

C, 239 байт

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

Натхненний записами Сета та Авеля, це буде виводити 0 замість 24 протягом наступної години, як потрібно, і використовуватиме 30 рядків для очищення екрана.


1

SmileBASIC, 55 байт

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

Пояснення:

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)

Примітка. У SmileBASIC є лише 50 стовпців тексту, тому він не буде добре виглядати ...


1

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

Цей код передбачає, що using System.Threading; рядок включений.

Повний клас:

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

Це рішення не має можливості виходу з циклу (оригінал, коментується, запускає код на окремому потоці), тому Console.ReadKeyоператор є зайвим. Єдиний спосіб вийти - це або закрити вікно консолі, або Ctrl+Break...
nurchi

Це лише фрагмент коду, а не метод або програма, а також using System.Threading;потрібно включити до числа байтів, якщо ви його використовуєте. Те саме з Using System;.
TheLethalCoder
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.