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 com00
ou0
. - A exibição precisa ser atualizada pelo menos uma vez por minuto, mas isso não precisa acontecer exatamente em
00
segundos. 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
- As brechas padrão são proibidas
- code-golf , a resposta mais curta em bytes vence.
Respostas:
MATL , 41 bytes
Obrigado a @Kundor por perceber um erro, agora corrigido
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
fonte
TI-Basic, 94 bytes
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.
fonte
Str1
,getTime
esub(
são dois bytes cada. Você pode aprender mais em tibasicdev.wikidot.com/tokensLote, 197 bytes
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 quanto08
ou09
irá causar erros de análise octal, de modo que um prefixo1
adicionando 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.fonte
Python 3.6,
110114112 bytesIsso 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)]
para1
para salvar 8 bytes, mas isso apenas gera spam na tela.Foi salvo um byte alterado
while 1:...;sleep 60
parawhile[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 .fonte
sleep
retornaNone
, o que é falso.sleep
também está notime
módulo, então importar * é melhor.Ruby,
989591 bytesAtualiza a cada 5 segundos. Funciona apenas em terminais estilo Unix.
Versão do prompt de comando do Windows,
9592 bytes:fonte
`cls`
vssystem'cls'
h=t.hour
e depois usar emh
vez do segundot.hour
, o que economiza 3 bytes.cls
. Obrigado pela sua outra sugestão!puts`clear`
é o caminho a percorrer se você usar terminais Unix. Simplesmente não funciona com o prompt de comando do Windowscls
.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
Perl 6 , 113 bytes
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:
fonte
[\+]
acrescenta e[\-]
parece subtrair. Isso funciona com multiplicação e tal?[+] LIST
que é reduzir, exceto que fornece os valores intermediários. Veja a página de documentos para produzirQBasic,
120127121 bytesNão execute isso por muito tempo ou seu laptop pegará fogo.Agora 99.várias% mais eficiência em CPU.Ungolfed e explicação
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
PRINT
instruções terminam com;
suprimir a nova linha; mas depois dos hífens, precisamos de uma nova linha; assim, o solitário?
após oFOR
loop interno .O
SLEEP 1
agora é necessário. Sem ele, a tela é limpa tão rapidamente após a impressão que é apenas uma bagunça tremeluzente. (Usei emLOCATE 1
vez deCLS
a princípio por esse motivo, até perceber que,CLS
comSLEEP
é mais curto de qualquer maneira.)RUN
Reinicia o programa a partir do topo - o caminho mais curto para obter um loop infinito.fonte
Java 8,
313300299 bytesIsso atualiza apenas a cada 30 iterações do loop while. As outras 29 iterações apenas imprimem novas linhas.
Atualizada
Salvo
1314 bytes devido a ajuda de Kevin Cruijssen! Obrigado!fonte
void f(){...}
e precisar adicionar as importações necessárias (no seu casoimport 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)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.for(i=0;i++<60
vez 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!)for(i=0;++i<61
vez defor(i=0;i++<61
(neste segundo caso, deveria ser 60, e mesmo sendo a mesma quantidade de bytes, provavelmente é mais óbvio / legível). Oh<9
código está correto, no entanto. Você tinhah+1<10
antes e eu simplesmente mudei issoh<9
removendo 1 dos dois lados. :)h<9
. Vou editá-lo para economizar mais 1 byte. Obrigado novamente!C,
176162161160156 bytesEste é 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.
Ungolfed:
fonte
JavaScript (ES6), 162 bytes
Atualizações uma vez por segundo
fonte
console.clear()
inside theconsole.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'+$:$)))
.m=>`0${h++} \.slice(-3)+'-'.repeat(m)
.Python 2,
131129127 bytessaved a byte thanks to @TuukkaX
fonte
while 1:
19 - \n 20 -----------------------------------------------------------
. The hours aren't updating...C
251267251 bytesUngolfed version
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.
fonte
time_t
andstruct tm
) in your byte count.printf("\n");
you can useputs("");
First time golfing...
Powershell, 116 bytes (was 122)
Edit: From @AdmBorkBork's advice, changed Get-Date to date, and Clear to cls, for a saving of 6 bytes.
fonte
cls
instead ofclear
and (so long as you're on Windows)date
instead ofget-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.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`PHP,
104105 bytesshowcase for
printf
´s custom padding characters:"%'-Ns"
=left pad string with-
toN
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
.fonte
GameMaker Language, 134 bytes
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.fonte
Perl 6, 104 bytes
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 minutefonte
AWK, 190 bytes
Since
AWK
doesn't have a built-insleep
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? :)fonte
Python 3.5,
127120117bytesfonte
print('\n'*50)
instead ofos.system('cls')
so it works on both *nix and Windows? Would save a couple of bytes as you can lose theos
import and OP says that this is allowed.Python,
115113 bytessaved a couple of bytes thanks to @kundor and @Phlarx
fonte
:02
formats to just:2
.:02
format to right-pad one digit hours with zeroes.:2
left-pads with spaces, which the challenge says is OK.C# Interactive (138 Bytes)
fonte
d
instead ofdt
? and 2) usesleep(1e3)
or999
instead of1000
?PHP,
112120 bytesAs 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 of60
.edit: @Titus noticed a bug in the padding of the second hour. Fixing it cost 8 bytes.
fonte
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?-n
orerror_reporting(22519);
H
setting for date goes from 00-23, but I forgot about it for the second hour.Bash (3 and 4): 90 bytes
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: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.fonte
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.BASH,
165141155 bytesfonte
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))
h=23; echo $((10#$h+1))
prints 24 for me.Gura, 138 bytes
Pretty short and straightforward :)
fonte
Gura.exe
and pasting in this code gives me a syntax errorsymbol k is not defined
.Ok, haven't done a code golf in a while, so here goes my sad attempt :)
Unix Korn Shell:
177171170 bytesfonte
Mathematica, 235 bytes
fonte
Processing,
204200198197 bytes5 bytes saved thanks to @L. Serné by using smarter ternaries
This outputs 30+ newlines for each update (which takes place when the frame gets updated)
Ungolfed
fonte
((i=hour())<10?" ":"")+i
into((i=hour())>9?i:" "+i)
would save 2B twice... Good luck with further golfing!((i=hour()+1)>24?i=0:i)>9
becomes(i=hour()+1)>9
, sincehour
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 ofi
inside the condition in thefor
loop like you did in the very last loop. Should save 13B in total.i
inside the condition of the for-loop,i
will start as1
instead of0
and I need to add one more bytei++<=minute()
and the bytecount will still be the same. But nonetheless, thanks for helping me golf 1 more bytes :)C, 239 bytes
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.
fonte
SmileBASIC, 55 bytes
Explanation:
Note: SmileBASIC only has 50 columns of text, so it won't look good...
fonte
C#
181176This code assumes that the
using System.Threading;
line is included.Full class:
fonte
Console.ReadKey
statement is redundant. The only way to exit is to either close the console window orCtrl+Break
...using System.Threading;
needs to be included in the byte count if you are using it. Same withUsing System;
.