É hora de um desafio de relógio!


25

Gostaria que você me construísse um relógio que mostre a hora neste formato:

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

Isso exibe '18: 10'. A hora atual e a próxima hora são mostradas na frente da linha, seguidas por um espaço e um número de traços: na primeira linha, o número de minutos que passaram nessa hora e a segunda linha mostra quantos minutos mais para ir nesta hora.

Esclarecer

  • O relógio deve exibir a hora do sistema. Se buscar a hora de outra fonte é mais conveniente, tudo bem. Ele não pode ser fornecido como entrada.
  • At 18:00, a linha superior é apenas18 (espaços à direita permitidos, mas não necessários)
  • Em 18:59, a linha inferior é19 -
  • As horas <10 são preenchidas previamente com a 0( 01 -----) ou alinhadas à direita ( 1 -----). Um dígito único alinhado à esquerda não é permitido, nem mesmo se os traços começarem no lugar certo (1 ----- é inválido).
  • O relógio deve exibir as horas no formato 24h.
  • Embora seja chamado de formato 24h, na verdade não existe um 24. Durante a 23ª hora, a segunda linha começa com 00ou 0.
  • A exibição precisa ser atualizada pelo menos uma vez por minuto, mas isso não precisa acontecer exatamente em 00segundos. Você pode atualizar com mais frequência / continuamente, se for mais conveniente, mas é claro que o resultado ainda deve ser legível - nem uma mancha em toda a tela.

Entrada

Nenhum.

Saída

  • Como descrito acima. Espaços à direita para ajustar o relógio para as posições 60-ish são permitidos nas duas linhas, uma nova linha à direita também é permitida.
  • A tela precisa ser limpa ao exibir o próximo minuto: com um comando de tela limpa ou adicionando nada menos que 30 novas linhas.

Regras adicionais


podemos ter dois espaços entre o número e os traços?
Adám 17/01/19

6
"atualizado uma vez por minuto" - pode ser atualizado com mais frequência?
SMLS

1
@smls Sim, você pode atualizar quantas vezes quiser. Vou mudar as especificações para 'pelo menos uma vez por minuto'.
precisa saber é o seguinte

1
@KritixiLithos Isso quebraria o alinhamento com horas de dois dígitos (9, 10 ou 23, 00), portanto não, não é permitido.
precisa saber é o seguinte

1
Após 23, a próxima hora é 24 ou 0?
Kritixi Lithos

Respostas:


2

MATL , 41 bytes

Obrigado a @Kundor por perceber um erro, agora corrigido

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

Experimente no MATL online! Mas observe que o programa é interrompido após 30 segundos, por isso é difícil detectar quaisquer alterações na saída.

Como funciona

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

Poderia ser eu, mas na segunda iteração, apenas a linha superior é impressa ... #
23417

@steenbergh Funciona para mim com minutos e segundos, em vez de horas e minutos, então as mudanças são facilmente vistas: matl.suever.net/…
Luis Mendo

1
Sim, funciona. - de fato, pode ser legal ter isso como as linhas 3 e 4 do meu próprio relógio.
21817

@steenbergh: você aceitou esta resposta, mas ela não é válida - mostra as horas depois das 23 às 24. Acredito que a resposta mais curta e correta seja a do Ruby da Value Ink.
Nick Matteo

@kundor Obrigado por perceber. Corrigido ao custo de 3 bytes
Luis Mendo

11

TI-Basic, 94 bytes

" 
Repeat 99<length(Ans
Ans+"-
End
Ans→Str1
Repeat 0
getTime
ClrDraw
Ans{Ans(1)≠24,1,1
Text(0,0,Ans(1),sub(Str1,1,1+Ans(2
Text(6,0,Ans(1)+1,sub(Str1,1,61-Ans(2
End

Relativamente simples. Essa é uma string com um espaço no começo. As horas estão alinhadas à direita. Isso funciona apenas nas calculadoras TI-84 +, pois a TI-83 não possui um relógio interno.

Edit: Obrigado @kundor por perceber que eu não fechei o último loop. Corrigido agora (+2 bytes).

Edição # 2: A primeira hora deve ser zero, não vinte e quatro. Corrigido a um custo de +14 bytes.


Todo comando conta como um byte?
Sygmei

@ Sygmei A maioria dos tokens tem um byte, sim. No entanto, fichas, tais como Str1, getTimee sub(são dois bytes cada. Você pode aprender mais em tibasicdev.wikidot.com/tokens
Timtech

Você não teria um link para um emulador?
2191717

Eu recomendaria cemetech.net/projects/jstified, mas lembre-se de que é moralmente errado usar uma ROM da Internet com este emulador, a menos que você seja o proprietário desse tipo de calculadora.
Timtech

1
Não tenha medo de clicar no link, porque o emulador é legítimo e solicita que você envie sua própria ROM antes que ele funcione. A TI costumava disponibilizá-los gratuitamente, mas não existe mais. Se você encontrar uma TI-84 de um amigo, essa seria a melhor opção.
Timtech

9

Lote, 197 bytes

@echo off
set/ah=100+%time:~0,2%,m=1%time:~3,2%
cls
call:l
set/ah=(h-3)%%24+100,m=260-m
call:l
timeout/t>nul 60
%0
:l
set s=%h:~1% 
for /l %%i in (101,1,%m%)do call set s=%%s%%-
echo %s%

Nota: a 10ª linha possui um espaço à direita. Para mim, %time%formata horas com um espaço à esquerda, mas minutos com um zero à esquerda. Decidi que um zero à esquerda era um formato de saída mais fácil, pois tudo o que preciso fazer é adicionar 100 horas e remover o primeiro dígito. Minutos, são mais complicadas quanto 08ou 09irá causar erros de análise octal, de modo que um prefixo 1adicionando eficazmente 100 minutos, ajustando para isso por compensação do circuito de forma apropriada, que é um byte mais curto do que a subtracção 100.


7

Python 3.6, 110 114 112 bytes

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

Isso usa a nova formatação da string f para salvar um byte ( f'\n{h+1:2} 'vs. '\n%2d '%(h+1)) Você pode alterar [sleep(9)]para 1para salvar 8 bytes, mas isso apenas gera spam na tela.

Foi salvo um byte alterado while 1:...;sleep 60para while[sleep(60)]:..., graças ao TuukkaX.

Eu tive que usar mais 5 bytes para que a próxima hora exibida após 23 fosse 0, em vez de 24, como OP comentou. :-(

Recuperou um byte dormindo apenas 9 segundos em vez de 60.

Economizou dois bytes usando uma quebra de bits para encurtar (h+1)%24, emprestado da resposta Ruby da Value Ink .


Poderia explicar por que você colocou colchetes ao redor da condição if? Ter o espaço entre as horas e o sono não seria de 1 byte, em oposição aos 2 de cada lado? Edição: Não importa, é para torná-lo verdade. Justo.
Shadow

1
@ Shadow: sleepretorna None, o que é falso.
perfil completo de Nick Matteo

@ ToivoSäwén: sleeptambém está no timemódulo, então importar * é melhor.
Nick Matteo

5

Ruby, 98 95 91 bytes

Atualiza a cada 5 segundos. Funciona apenas em terminais estilo Unix.

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

Versão do prompt de comando do Windows, 95 92 bytes:

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

Você pode usar backticks em vez de sistema? `cls`vssystem'cls'
IMP1 18/01/19

Parece que não, mas você pode usar h=t.houre depois usar em hvez do segundo t.hour, o que economiza 3 bytes.
IMP1

@ IMP1, de fato, os backticks não funcionam cls. Obrigado pela sua outra sugestão!
Value Ink

@ IMP1, como se vê, puts`clear`é o caminho a percorrer se você usar terminais Unix. Simplesmente não funciona com o prompt de comando do Windows cls.
Value Ink

Para o Windows, você pode puts"\e[H\e[2J"limpar o console, que eu acho que raspa quatro bytes. Isso faria sua primeira linha ser lidaloop{t=Time.now;puts"\e[H\e[2J%02d %s
IMP1 18/01/17

4

Perl 6 , 113 bytes

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

Experimente uma vez com um tempo limite de um segundo.

Ou tente uma versão alterada que produz o resultado da execução por várias horas.

Expandido:

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
}

Quais operadores o 'triângulo produz' suporta? Em [\+]acrescenta e [\-]parece subtrair. Isso funciona com multiplicação e tal?
Yytsi 17/01/19

@TuukkaX Ele deve funcionar com quase todos os operadores de infix. É basicamente o mesmo [+] LISTque é reduzir, exceto que fornece os valores intermediários. Veja a página de documentos para produzir
Brad Gilbert b2gills

4

QBasic, 120 127 121 bytes

Não execute isso por muito tempo ou seu laptop pegará fogo. Agora 99.várias% mais eficiência em 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

Ungolfed e explicação

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

Começamos limpando a tela e obtemos as horas e minutos atuais TIMER, que retornam o número de segundos desde a meia-noite.

Esta é a primeira vez que tentei PRINT USING, e fiquei encantada ao descobrir que não sofre com a peculiaridade QBasic usual de que números positivos são impressos com um espaço à esquerda. ##pois o especificador de formato garante que os números de um dígito sejam alinhados à direita e preenchidos com um espaço, conforme necessário. Infelizmente, temos que usar um loop para os hífens, pois o QBasic não possui uma função de repetição de string. (Se eu estiver enganado, por favor me avise!)

Todas as PRINTinstruções terminam com ;suprimir a nova linha; mas depois dos hífens, precisamos de uma nova linha; assim, o solitário ?após o FORloop interno .

O SLEEP 1agora é necessário. Sem ele, a tela é limpa tão rapidamente após a impressão que é apenas uma bagunça tremeluzente. (Usei em LOCATE 1vez de CLSa princípio por esse motivo, até perceber que, CLScomSLEEP é mais curto de qualquer maneira.) RUNReinicia o programa a partir do topo - o caminho mais curto para obter um loop infinito.


Como isso lida com a última hora do dia? A linha superior lê 23, mas que horas são na linha inferior?
precisa saber é o seguinte

Estou usando o Note7 e pensando em executar este programa no futuro próximo no lugar do relógio da barra de status. Essa é uma boa ideia?
owlswipe

@steenbergh Opa, fixo. Seria útil que você mencionasse esse caso extremo na pergunta.
DLosc 17/01

@DLosc Nah, estou apenas brincando :)). Mas sim, inteligente !!
Owlswipe

1
@steenbergh Ele imprime h MOD 24, se inicialmente h = 23, o ciclo seguinte é 24 e é modificado para 0. Mas estou curioso para saber se funciona também. O CLS limpa a primeira linha para que nunca haja ambas as linhas impressas na tela, certo?
Jens

4

Java 8, 313 300 299 bytes

import java.time.*;()->{for(int c=0,h=LocalDateTime.now().getHour(),m=LocalDateTime.now().getMinute(),i;;)if(c>30){c=0;String l="",u,d;for(i=0;i++<60;)l+="-";u=l.substring(0,m);d=l.substring(m);System.out.println((h<10?"0":"")+h+" "+u+"\n"+(h<9?"0":"")+(h+1)+" "+d);}else{c++;System.out.println();}}

Isso atualiza apenas a cada 30 iterações do loop while. As outras 29 iterações apenas imprimem novas linhas.

Atualizada

Salvo 13 14 bytes devido a ajuda de Kevin Cruijssen! Obrigado!


Olá, seja bem-vindo ao PPCG! Primeiro de tudo, apenas programas / funções são permitidos e seu código atual é um trecho. Você precisará cercá-lo com um método (isto é, void f(){...}e precisar adicionar as importações necessárias (no seu caso import java.time.*;) .Dito isto, seu código pode ser jogado em vários lugares para reduzi-lo a 311 bytes (mesmo com o método adicionado . -Declaração e importação) (Uma vez que é demasiado longo para este comentário, eu colocá-lo na próxima comentário .. xD)
Kevin Cruijssen

import java.time.*;void f(){for(int c=0,h=LocalDateTime.now().getHour(),m=LocalDateTime.now().getMinute(),i;;)if(c>99){c=0;String l="",u,d;for(i=0;i++<61;)l+="-";u=l.substring(0,m);d=l.substring(m);System.out.println((h<10?"0":"")+h+" "+u+"\n"+(h<9?"0":"")+(h+1)+" "+d);}else{c++;System.out.println();}}( 303 bytes ) Eu recomendo a leitura de Dicas para jogar golfe em Java e Dicas para jogar golfe em <todos os idiomas> . Aproveite sua estadia.
Kevin Cruijssen

@KevinCruijssen Atualizei minha resposta e pude salvar mais 3 bytes usando a notação lambda. Também mudei algumas partes para o código que você forneceu, também, para atender às especificações (por exemplo, em for(i=0;i++<60vez de 61 e em (h<10?vez de 9. Obrigado por me informar sobre a declaração do método e algumas dicas de golfe!)
CraigR8806

Ah, os 61 em vez dos 60 foram realmente meu erro. Eu pensei que tinha escrito isso como em for(i=0;++i<61vez de for(i=0;i++<61(neste segundo caso, deveria ser 60, e mesmo sendo a mesma quantidade de bytes, provavelmente é mais óbvio / legível). O h<9código está correto, no entanto. Você tinha h+1<10antes e eu simplesmente mudei isso h<9removendo 1 dos dois lados. :)
Kevin Cruijssen

1
@KevinCruijssen Ha, eu não entendi isso! h<9. Vou editá-lo para economizar mais 1 byte. Obrigado novamente!
CraigR8806

4

C, 176 162 161 160 156 bytes

Este é um abuso grosseiro de ponteiros, mas compila e executa conforme especificado. Certifique-se de compilar sem otimização, caso contrário você provavelmente atingirá um 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 bytes

Atualizações uma vez por segundo

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)


You can save quite a few bytes by restructuring the code so it is only one statement (it's possible to call console.clear() inside the console.log argument) and assigning in unused parentheses as much as possible. Version for 154B: setInterval(c=>c.log(H(h,c.clear(d=new Date))+` ${'-'.repeat(m)} ${H(h+1)} `+'-'.repeat(60-m)),1e3,console,m=d.getMinutes(h=d.getHours(H=$=>$<9?'0'+$:$))).
Luke

You can save a bunch of byte by putting the hours and minutes into a single function m=>`0${h++} \.slice(-3)+'-'.repeat(m).
Neil

3

Python 2, 131 129 127 bytes

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

saved a byte thanks to @TuukkaX


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

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

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

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

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

3

C 251 267 251 bytes

 #include<time.h>f(){time_t t;struct tm *t1;h,m,i;while(1){time(&t);t1=localtime(&t);h=t1->tm_hour;m=t1->tm_min;printf("%d ",h);for(i=1;i<=m;i++)printf("-");puts("");printf("%d ",h+1);for(i=0;i<=59-m;i++)printf("-");puts("");sleep(1);system("clear");}}

Ungolfed version

#include<time.h>
void f()
{
 time_t t;
 struct tm *t1;
 int h,m,i;

 while(1)
 {
  time(&t);     
  t1=localtime(&t);
  h=t1->tm_hour;
  m=t1->tm_min;

  printf("%d ",h);
  for(i=1;i<=m;i++)
   printf("-");

  puts("");
  printf("%d ",h+1);

  for(i=0;i<=59-m;i++)
   printf("-");

  puts("");    

  sleep(1);
  system("clear");    
 }
}

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

@Neil Thanks for the info.

@Seth Thanks, for saving 8 bytes.


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

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

3

First time golfing...

Powershell, 116 bytes (was 122)

while($d=date){$f="{0:D2}";$h=$d.Hour;$m=$d.Minute;cls;"$($f-f$h)$("-"*$m)`n$($f-f(++$h%24))$("-"*(60-$m))";Sleep 9}

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


Welcome to PPCG, good answer
george

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

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

3

PHP, 104 105 bytes

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

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

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

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


2

GameMaker Language, 134 bytes

s=" "while 1{s+="-"a=current_hour b=current_minute draw_text(0,0,string(a)+string_copy(s,1,b+1)+"#"+string(a+1)+string_copy(s,0,61-b)}

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


2

Perl 6, 104 bytes

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

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

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

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

2

AWK, 190 bytes

#!/bin/awk -f
func p(x,y,c){printf("%2s ",x)
for(j=0;j<y;j++)printf(c)
print}BEGIN{for(;;){split(strftime("%H %M"),t)
m=t[2]
if(o!=m){p(a,30,"\n")
p(t[1],m,"-")
p((t[1]+1)%24,60-m,"-")}o=m}}

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


2

Python 3.5, 127 120 117 bytes

from time import*
while[sleep(9)]:h,m=localtime()[3:5];print('\n'*88,*['%2d '%x+'-'*y+'\n'for x,y in[(h,m),(h+1,60-m)]])

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

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

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

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

2

Python, 115 113 bytes

saved a couple of bytes thanks to @kundor and @Phlarx

import time
while 1:h,m=time.localtime()[3:5];print("\x1b[0;H{:02} {}\n{:02} {} ".format(h,"-"*m,h+1,"-"*(60-m)))

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

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

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

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

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

2

C# Interactive (138 Bytes)

while(true){var d=DateTime.Now;Console.WriteLine($"{d.Hour:00} {new string('-',d.Minute)}\n{d.Hour+1:00} {new string('-',60-d.Minute)}");}

1
Can you golf this down by 1) naming the date var d instead of dt? and 2) use sleep(1e3) or 999 instead of 1000?
steenbergh

@steenbergh see update
series0ne

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

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

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

2

PHP, 112 120 bytes

for(;;sleep(9))echo($s=str_pad)($h=date(H),99,"\n",0).$s(" ",1+$m=date(i),"-")."\n".$s(++$h%24,2,0,0).$s(" ",61-$m,"-");

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

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


This displays warning text on stdout along with the correct output: Notice: Use of undefined constant str_pad - assumed 'str_pad' in C:\wamp64\www\my-site\a.php on line 2 - Notice: Use of undefined constant H - assumed 'H' in C:\wamp64\www\my-site\a.php on line 2 - Notice: Use of undefined constant i - assumed 'i' in C:\wamp64\www\my-site\a.php on line 2. Anything on Meta about that?
steenbergh

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

hours must be padded to length 2
Titus

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

Save two bytes with physical linebreaks.
Titus

2

Bash (3 and 4): 90 bytes

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

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

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

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

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


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

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

2

BASH, 165 141 155 bytes

while :
do
clear
m=`date +%-M`
a=`printf %${m}s`
b=`printf %$((60-m))s`
h=`date +%H`
echo $h ${a// /-}
printf "%02d %s" $((10#$h+1)) ${b// /-}
sleep 9
done

1
I could save another 8 bytes removing the sleep, but I'm not comfortable with an indefinite while loop running on my computer without a sleep ;-)
pLumo

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

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

Whats wrong with 24?
pLumo

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

1

Gura, 138 bytes

k(a,b)={if(a<10){a="0"+a;}println(a," ","-"*b)};repeat{t=datetime.now();k(t.hour,t.min);k(t.hour+1,60-t.min);os.sleep(60);print("\n"*30);}

Pretty short and straightforward :)


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

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

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

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

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

1

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

Unix Korn Shell: 177 171 170 bytes

while :
do
clear
h=`date +%H`
m=`date +%M`
d=-----
d=$d$d$d$d
d=$d$d$d
a=`echo $d|cut -b-$m`
let m=60-$m
b=`echo $d|cut -b-$m`
let i=h+1
echo "$h $a\n$i $b"
sleep 9
done

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

1

Mathematica, 235 bytes

d=UpdateInterval;e=Dynamic;f=Refresh;g=AbsoluteTime;Grid[Partition[Riffle[e[f[Floor@Mod[g[]/3600+#,24],d->1]]&/@{0,1},With[{t=#},e[f[""<>Array["-"&,If[t==60,60-#,#]]&@Setting@Floor@Mod[g[]/60+#,60],d->1]]]&/@{0,60}],2],Alignment->Left]

1

Processing, 204 200 198 197 bytes

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

void draw(){int i;String s=((i=hour())>9?i:" "+i)+" ";for(i=0;i<minute();i++)s+="-";s+="\n"+((i=hour()+1)>9?i>23?" 0":i:" "+i)+" ";for(i=0;i<60-minute();i++)s+="-";print(s);for(;i++<99;)println();}

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

Ungolfed

void draw(){
  int i;
  String s=((i=hour())>9?i:" "+i)+" ";
  for(i=0;i<minute();i++)
    s+="-";
  s+="\n"+((i=hour()+1)>9?i>23?" 0":i:" "+i)+" ";
  for(i=0;i<60-minute();i++)
    s+="-";print(s);
  for(;i++<99;)
    println();
}

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

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

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

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

1

C, 239 bytes

#include<time.h>
#include<unistd.h>
#define F printf(
void d(n,p){for(;n--;F"%c",p));}int main(){time_t*t;for(;;){d(30,10);time(t);int*m=localtime(t);F"%2d ",m[2]);d(m[1],45);F"\n%2d ",(m[2]+1)%24);d(60-m[1],45);F"\n");sleep(1);}return 0;}

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


1

SmileBASIC, 55 bytes

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

Explanation:

TMREAD OUT HOUR,MINUTE,
CLS
PRINT HOUR,"-"*MINUTE
PRINT (HOUR+1) MOD 24,"-"*(60-MINUTE)
EXEC 0 'runs the code stored in slot 0 (the default)

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


1

C# 181 176

for(;;){Console.Clear();var t=DateTime.Now;var h=t.Hour;var m=t.Minute;Console.Write("{0,2} {1}\n{2,2} {3}",h,"".PadLeft(m,'-'),++h%24,"".PadLeft(60-m,'-'));Thread.Sleep(100);}

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

Full class:

class Program
{
    static void Main(string[] args)
    {
        Console.Title = string.Format("Started the app at: {0}", DateTime.Now.TimeOfDay);
        //new Timer((o) => { Console.Clear(); var t = DateTime.Now; var h = t.Hour; var m = t.Minute; Console.Write("{0,2} {1}\n{2,2} {3}", h, "".PadLeft(m, '-'), ++h % 24, "".PadLeft(60 - m, '-')); }, null, 0, 60000);

        for (; ; ) { Console.Clear(); var t = DateTime.Now; var h = t.Hour; var m = t.Minute; Console.Write("{0,2} {1}\n{2,2} {3}", h, "".PadLeft(m, '-'), ++h % 24, "".PadLeft(60 - m, '-')); Thread.Sleep(100); }

        Console.ReadKey(true);
    }
}

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

This is only a code snippet not a method or program, also the using System.Threading; needs to be included in the byte count if you are using it. Same with Using System;.
TheLethalCoder
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.