Пришло время для испытания часов!


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
«обновляется раз в минуту» - может ли оно обновляться чаще?
смс

1
@smls Да, вы можете обновлять так часто, как вам нравится. Я изменю спецификации на «хотя бы раз в минуту».
Стинберг

1
@KritixiLithos Это нарушило бы выравнивание с двузначными часами (9, 10 или 23, 00), поэтому нет, не допускается.
Стинберг

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 от 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

У вас не будет ссылки на эмулятор, не так ли?
Стинберг

Я бы порекомендовал cemetech.net/projects/jsified, но помните, что использование этого эмулятора из Интернета с моральной точки зрения некорректно, если вы сами не владеете калькулятором такого типа.
Timtech

1
Не бойтесь нажимать на ссылку, потому что эмулятор является законным и просит вас загрузить свой собственный ROM, прежде чем он заработает. Я имел обыкновение иметь их в свободном доступе, но их больше нет. Если вы можете найти 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-строки для сохранения одного байта ( f'\n{h+1:2} 'против '\n%2d '%(h+1)). Вы можете изменить [sleep(9)]его 1на сохранение 8 байтов, но тогда это просто спам на экране.

Благодаря TuukkaX сохраненный один байт изменяется while 1:...;sleep 60на while[sleep(60)]:....

Мне пришлось использовать еще 5 байтов, чтобы следующий час после 23 показывал 0, а не 24, как только что прокомментировал OP. :-(

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

Сохраненные два байта, используя битовую мелочь для сокращения (h+1)%24, заимствованы из Ruby-ответа Value Ink .


Не могли бы вы объяснить, почему вы поставили квадратные скобки вокруг условия if? Разве просто не было бы промежутка между while и sleep равным 1 байту, в отличие от 2 с обеих сторон? РЕДАКТИРОВАТЬ: Неважно, это сделать это правдивым. Справедливо.
Тень

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}

Можете ли вы использовать backticks вместо системы? `cls`vssystem'cls'
IMP1

Кажется, нет, но вы можете использовать, h=t.hourа затем использовать hвместо второго t.hour, который экономит 3 байта.
IMP1

@ IMP1 действительно, backticks не работают для cls. Спасибо за ваше другое предложение, хотя!
Value Ink

@ IMP1, как выясняется, puts`clear`это путь, если вы используете терминалы Unix. Он просто не работает с командной строкой Windows cls.
Value Ink

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

4

Perl 6 , 113 байт

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

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

Или попробуйте измененную версию которая выводит результат работы в течение нескольких часов.

Expanded:

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% ​​более эффективно CPU.

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

Неуправляемый и объяснение

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 и собираюсь запустить эту программу в обозримом будущем вместо моих часов в строке состояния. Это хорошая идея?
owlswipe

@steenbergh Ой, исправлено. Было бы полезно упомянуть этот крайний случай в вопросе.
DLosc

@DLosc Нет, я просто шучу :)). Но да, умный!
owlswipe

1
@steenbergh Он печатает h MOD 24, если изначально h = 23, то следующий цикл повторяет его 24 и получает значение 0. Но мне интересно, работает ли он также. CLS очищает первую строку, чтобы на экране никогда не было обеих напечатанных строк, верно?
Дженс

4

Java 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 Ха, я не понял этого! 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));}

Ungolfed:

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

3

JavaScript (ES6), 162 байта

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

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:
Wheat Wizard

Я начал ваш код @ 19: 55. В 20:01 вижу 19 - \n 20 -----------------------------------------------------------. Часы не обновляются ...
Steenbergh

@steenbergh Я попробовал сам, установив часы вручную, и это работает для меня.
овс

@ovs - это не удовольствие от часов :-). Во всяком случае, вероятно, что-то с repl.it тогда ...
Steenbergh

head-desk Сервер 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 изменил Get-Date на date и Clear до 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}: dash повторяется раз в минуту
    • \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импорт, а OP говорит, что это разрешено.
ElPedro

О, тогда я не прочитал это правильно. Большое спасибо, мужчина.
Гурупад Мамадапур

Просто для информации, большинство людей склонны использовать <s> </ s> для подсчета своего старого байта, а затем после него ставить новый счетчик байтов, потому что интересно видеть прогресс по мере улучшения ответа :-) Нужно попробовать 3.5 время. Я все еще работаю с Python 2.
ElPedro

1
@ElPedro Да, я забыл это сделать. Я сейчас отредактирую.
Гурупад Мамадапур

2

Python, 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форматы на just :2.
Ник Маттео

2
Вы можете решить проблему, описанную @kundor в 1 байте, добавив пробел после соответствующего {}.
Phlarx

@ Кундор исправлен! Спасибо. Я сохранил :02формат на правой клавише с одной цифрой часов с нулями.
Дфернан

@kundor * левая цифра часов с нулями.
17

@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 см. обновление
series0ne

Несколько вещей ... Это всего лишь фрагмент, а не метод или программа (хотя я не уверен, что он действителен в C # Interactive), это, по сути, версия моего кода для игры в гольф, и если она должна быть прокомментирована как улучшение, а не отдельное решение (хотя это предположение), и есть много небольших улучшений, которые вы можете сделать здесь, и вам вообще нужен сон?
TheLethalCoder

@TheLethalCoder Я специально поставил C # Interactive, потому что это работает ТОЛЬКО в интерактивной консоли. Это не будет работать как стандартная программа на C #.
серия0

Также обратите внимание, что это не будет работать, когда время 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.

edit: @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, но я забыл об этом на второй час.
user59178

Сохраните два байта с физическими переносами строк.
Тит

2

Баш (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.

Первая команда устанавливает $dдо 60 дефисов; он основан на том факте, что длина первой строки этого скрипта составляет 60 символов. Это на три символа короче, чем следующая лучшая вещь, которую я мог придумать:

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

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


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

Хм, это означает, что мой сценарий сломан несколькими способами. Спасибо.
Эван Кралл

2

BASH, 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; удалите -перед M в строке формата в строке 4. Вам также не нужно использовать $ перед именами переменных в арифметических выражениях, так что $((60-$m))может быть$((60-m))
Эван Кралл

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

Что не так с 24?
pLumo

Мне нужен ключ -M, потому что $ ((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.
Стинберг

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

1
Это обновление каждую минуту? Консоль, кажется, запускает этот код только один раз ...
steenbergh

Woops, не видел эту часть, должны работать сейчас!
Сигмей

Когда он обновляется, он должен либо очистить экран, либо добавить 30 новых строк. Чувак, я в вашем деле ...
steenbergh

1

Ладно, давно не занимался гольфом, так что вот моя грустная попытка :)

Unix Korn Shell: 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

Mathematica, 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. Serné, используя умные троицы

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+ новых строк для каждого обновления (что происходит, когда кадр обновляется)

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

Переход ((i=hour())<10?" ":"")+iна ((i=hour())>9?i:" "+i)сэкономил бы 2B дважды ... Удачи в дальнейшем игре в гольф!
Лука

@ L.Serne спасибо за совет :)
Kritixi Lithos

Еще одно улучшение, которое может сработать: ((i=hour()+1)>24?i=0:i)>9становится (i=hour()+1)>9, так как hourвыводит число в диапазоне 0-23, и даже с добавленным к нему 1, оно никогда не будет больше 24. Кроме того, вы должны переместить приращение iвнутрь условия в forцикле как вы сделали в самом последнем цикле. Всего должно сэкономить 13В.
Лука

@ L.Serné Для первого пункта мне все еще нужно включить троичный, потому что 23 + 1 в 24-часовых часах становится 0 (или, по крайней мере, я так думаю). Далее, если я переместу приращение iвнутрь условия цикла for, iначнется как 1вместо, 0и мне нужно добавить еще один байт, i++<=minute()и число байтов останется прежним. Но, тем не менее, спасибо, что помогли мне
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

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

Этот код предполагает, что 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...
Нурчи

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