Implemente um cronômetro digital simples , que exibirá o tempo decorrido em segundos e minutos, conforme descrito abaixo.
Importante
Por favor, leia as seções Display e Controls !
Exibição
O tempo decorrido deve ser exibido no MM:SS
formato, substituindo a sequência de horas exibida anteriormente "no local" (limpar a totalidade ou parte da tela também é permitido).
O cronômetro deve ser atualizado pelo menos a cada segundo.
Exemplos:
0 minutos, 0 segundos
00:00
0 minutos, 33 segundos
00:33
1 minuto, 50 segundos
01:50
Inicialmente, você pode começar com '00: 00 'ou com qualquer outro valor no intervalo [00: 00-59: 59].
Quando o cronômetro chegar 59:59
, ele deve redefinir para00:00
e continuar novamente.
Você pode usar uma base diferente (em vez de decimal) ou mesmo um sistema numérico diferente, se desejar, desde que siga o padrão geral.
Por exemplo, 13:03
pode ser exibido como:
13:03
0D:03
N:D
10101:3
XIII:III
Lembre-se de que se você usar um sistema / base numeral não decimal, ele deverá ser codificado usando caracteres ASCII (ou Unicode) imprimíveis, por exemplo, o uso de dois bytes binários (não imprimíveis) por minutos e segundos não será permitido.
Você também deve deixar sua saída com zeros, conforme apropriado, se o seu sistema numérico permitir isso.
Substituir o caractere separador :
por qualquer outro caractere imprimível (incluindo dígitos) também é aceitável.
Controles
O cronômetro deve começar em pausa e permanecer nesse estado até que o usuário inicie explicitamente , pressionando a tecla 'control' (veja abaixo).
Se, enquanto o cronômetro estiver contando, o usuário pressionar a tecla 'control' novamente, o cronômetro deverá pausar (mantendo a hora atual), até que o 'controle' tecla seja pressionada mais uma vez.
O 'controlo' chave pode ser uma única tecla, por exemplo s
, ou qualquer combinação de teclas, por exemplo Ctrl+Shift+X
, mas deve ser 'atómica', pressionando múltiplas chaves em sequência, por exemplo s
, em seguida Enter
, é não autorizados .
A mesma tecla 'controle' (ou combinação) deve ser usada para pausar e retomar o cronômetro.
Você deve usar uma chave 'control' específica , ou seja, 'qualquer tecla' não é permitida.
Como alternativa, você pode usar um clique simples ou duplo do mouse, em vez de pressionar uma tecla para 'controle'.
Regras
- Isso é código-golfe , a resposta mais curta em bytes vence;
- Aplicam-se lacunas de código-golfe padrão;
- Seu programa deve (teoricamente) ser capaz de funcionar para sempre.
fonte
00:05
impressão e, em algum momento, retomar novamente, deve00:06
aparecer 3000 milissegundos após a tecla retomar ser pressionada, ou está correto imprimi-lo um segundo inteiro depois que a tecla retomar foi pressionada?Respostas:
SmileBASIC,
867771 bytesDIALOG
exibe uma caixa de texto na tela de toque.N
é o número de segundos em que a caixa de texto permanecerá na tela antes de desaparecer. SeN
é0
, ele permanece até o usuário pressionar o botão na tela de toque.DIALOG
Retorna1
se o usuário pressionou o botão e0
se fechou automaticamente. Portanto, quando o usuário pressiona o botão de pausa, ele retorna1
e o tempo de exibição é definido como0
, pausando o cronômetro. Depois que o usuário pressiona o botão novamente, ajustamos o tempo de exibição para1
, retomando o temporizador. Basicamente, sempre queDIALOG
retorna1
, o tempo de exibição é alternado entre1
e0
utilizado!=
, o que é equivalente a um XOR lógico, desde que ambas as entradas sejam 1 ou 0.fonte
Python 2,
167129 bytes-36 bytes principalmente * de usar a idéia de Maltysen de capturar
ctrl-c
usando uma exceção - vá dar crédito!-4 bytes graças ao DLosc (init
n
eb
0 ao invés def()
)-1 byte graças ao FlipTack (use
p^=1
ao invés dep=1-p
)-2 bytes graças a Felipe Nardi Batista (remova os especificadores de precisão)
Funciona da mesma forma que o original, abaixo, mas com a sequência de teclas de controle de
ctrl+c
.(Testado por mim com o Python 2.7.8 no Windows 7, 64 bits;
Testado por Brian Minton com o Python 2.7.13 no Linux, 64 bits)
* também reduziu a
if
instrução de uma pesquisa de lista para obter a informaçãotry
como uma linha.Meu original:
(Testado por mim com o Python 2.7.8 no Windows 7, 64 bits - este código, no entanto, é específico do Windows devido ao uso do
msvcrt
biblioteca)A tecla de controle é 'p'.
n
eb
são inicializados com o mesmo valor na inicialização, fornecendo um "deslocamento" de 0;p
é inicializado como 0, indicando um estado de pausa.Sempre que a tecla de controle é pressionada, o valor de
p
é alterado. Ao alternar de um estado em pausa para um estado ativo, eleb
é atualizado para um novo valor, mantendo qualquer deslocamento atual dos estados ativos anterioresb-n
.Durante um estado ativo,
n
é atualizado repetidamente para a hora atual chamandotime.time()
.A diferença entre
n
eb
,,t
é então o número total de segundos (incluindo uma parte fracionária) decorrido durante o (s) estado (s) ativo (s).Os minutos decorridos são então
t/60
e cada um dos minutos e segundos é exibido com o mod 60(t/60%60,t%60)
. Os zeros à esquerda são anexados a cada um usando a formatação de string da parte inteira com'...%0.2d...'
. Imprimir uma tupla (a direita,
) em que o primeiro item tem um retorno de carro (a\r
) faz com que o texto impresso anteriormente seja substituído.fonte
^=
mudei em algum momento durante a formulação..
in%0.2d
? funciona muito bem como%02d
Python -
160159143 bytesGraças a @ JonathanAllan por me salvar 18 bytes!
Somente usa bibliotecas internas, portanto a chave de controle é
ctrl-c
capturada com umexcept keyboardInterrupt
.fonte
except:
? Eu tenho uma versão de trabalho da mina fazendo isso ...utilitários bash + Unix, 90 ou 93 bytes
Versão de 90 bytes:
Versão de 93 bytes:
Ctrl-C é o caractere de retomar / pausar. Um espaço é o delimitador entre minutos e segundos.
A diferença entre as duas versões é que o programa de 90 bytes funcionará por 2 ^ 63 segundos (nesse ponto, o bash fornecerá um estouro de número inteiro).
A versão de 93 bytes realmente funcionará para sempre.
O problema original incluía o requisito: "Seu programa deve (teoricamente) ser capaz de funcionar para sempre".
Se executar por 2 ^ 63 segundos for suficiente para atender a esse requisito, a solução de 90 bytes funcionará. Essa duração é mais de 20 vezes a idade do universo!
Se o programa precisar ser executado por mais tempo do que isso, terei que usar a solução de 93 bytes.
Provavelmente, devo salientar que esta solução, bem como pelo menos algumas das outras postadas, ficará muito lentamente para trás do verdadeiro tempo decorrido. Esse desvio ocorre porque o programa está inativo por um segundo entre cada execução do corpo do loop, mas o corpo do loop leva uma pequena quantidade de tempo para ser executado. Isso será inconseqüente na prática.
fonte
Initially, you can start with '00:00' or with any other value in range [00:00-59:59]
, que permanecerá na tela até você pressionar 'control' pela primeira vez. Desculpe se não fui capaz de formular isso com clareza suficiente!QBasic,
213211 bytesChave de controle é tab. Sair dessa execução pode causar incêndios no laptop. Você foi avisado.
Aqui está em ação, parando em 10, 15 e 20 segundos:
Ungolfed e comentou
Observe que os valores de
TIMER
são de ponto flutuante. Isso não afeta a saída, uma vezMOD
e\
truncado para números inteiros. Mas isso adiciona precisão à quantidade de tempo economizado: se você pausar o cronômetro imediatamente antes de um tiquetaque, verá quando o iniciar novamente que o número muda em menos de um segundo.fonte
Lote, 132 bytes
Pressionar
n
(des) pausará o temporizador. O tremulação da saída pode ser reduzido a um custo de três (ou quatro) bytes.fonte
Festa pura, 141 bytes
Isso não usa nada além dos Bash builtins (sem ferramentas externas). O caractere de controle é Ctrl-Z, de modo que o padrão
SIGTSTP
manuseio pausa o cronômetro.set -m
ativa o controle do trabalho , que geralmente está desativado em um script.&
) .read -t 1
aguarda um segundo pela entrada do usuário e falha.until
loop continua enquantoread
continua falhando.printf
saídas o tempo corretamente preenchido e formatado$[s=s>3598?0:s+1,s/60]
A expansão aritmética calcula primeiro o tempo atualizado, verificando se deve quebrar ou incrementar o contador de segundoss
e, em seguida, retorna a divisão com pisos/60
.$[s%60]
dá os segundos restantes.trap
manipulador paraTSTP
, o sinal é Ctrl-Zgerado. Quando Ctrl-Zpressionado enquanto o script externo está em execução, ele será executadofg>/dev/null
e colocará o subshell de volta em primeiro plano .>/dev/null
é necessário parar defg
imprimir o comando subshell todas as vezes.00:00
e envia umSTOP
sinal para o processo filho$!
, o que fará uma pausa no processo.read
aguarda a entrada para sempre, mantendo o script vivo.Se Ctrl-Zfor pressionado enquanto o subshell estiver em primeiro plano, ele interromperá a execução e retornará o script externo para o primeiro plano, onde aguardará silenciosamente. Se o script externo estiver em primeiro plano, o manipulador de traps continuará a execução do subshell e contará novamente.
fonte
Javascript no console do Chrome, 143 bytes
Quando inserido no console, ele entra no contador até 00:00 e ativa o controle pressionado com tecla no documento.
Não há muita mágica acontecendo, principalmente a
(i/60)|0
o número de andaresConcluído e testado no console do Chrome
fonte
m=s=g=i=0;(f=document).onclick=_=>g++;setInterval("g%2&&f.close(f.write(`${(m=i/60%60|0)>9?m:'0'+m}:`+((s=i++%60)>9?s:'0'+s)))",1e3)
HTML + JavaScript (ES6),
191 192 187 183174 bytesExplicação
Clique no cronômetro para iniciar ou pausar o cronômetro. Como tal, um único clique é a chave de controle . O separador entre os dois valores é dois pontos.
Sempre que o usuário clica no clique, o valor de
b
é verificado. É inicializado para o0
qual é avaliadofalse
, portanto, uma sequência de códigos é avaliada a cada 1000 milissegundos. Isso define a variável para o ID do intervalo, para que possa ser interrompida posteriormente. Seb
contiver um número, ele avalia comotrue
, portanto, o intervalo é parado. Isso retorna o valorundefined
, então o ciclo continua.A sequência de códigos altera o html do elemento com o id
a
(o cronômetro). Primeiro, os minutos são analisados usando o valor anterior do cronômetro, dividindo-o pelos dois pontos e obtendo o valor dos minutos, que é aumentado em 0 se o valor dos segundos não for 59 (maior que 58) e 1 caso contrário, módulo 60 Então esse valor é preenchido. Depois vem o cólon e, finalmente, os segundos. O código simplesmente obtém o valor antigo, aumenta em 1, pega o módulo 60 e opcionalmente o preenche.fonte
C
309179 bytesVersão não destruída:
Uso: Pressione Enterpara Pausar e Continuar o Cronômetro.
Explicação:
break
o primeirowhile
loop e aguarde até o próximo Enter.goto
primeiro faça umwhile
loop e retome a contagem.Agora, eu sei que
goto
é uma prática ruim de codificação em C, mas não consegui descobrir outra maneira.fonte
getchar()
bloqueia até que algum caractere seja pressionado.m=0,s=0;
falha, porque você não declarou essas variáveis em nenhum lugar.Javascript, 124 bytes
A 'chave de controle' é um clique no documento. Para testar isso, cole o código no console ou em um arquivo html dentro do diretório
<script>
tag.Explicação:
Testado no Chrome
fonte
PHP,
9491 bytesPresumo que 32 seja o código-chave da barra de espaço (o que provavelmente não é);
Atualmente, não tenho como testar ncurses. Mas o resto do código funciona bem.
começa em
00:00
, mas aumenta imediatamente quando a pausa terminaSe você (como eu) não possui ncurses, pode testar substituindo o segundo
date
parâmetro por$t+=$r^=!rand(sleep(1),19);
ou$t+=$r^=++$x%20<1+sleep(1);
. (sleep
sempre retorna0
.)demolir
fonte
C # 220 bytes
Golfe
Usando o
s
tecla para iniciar / parar. Todo o programa funciona lembrando o TimeDelta usandoDateTime.Now
A maioria das mágicas C # aqui vem do recurso C # 7.0
using static
.fonte
Bash, 65 bytes
trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}
Observe que ele deve ser gravado em um script de arquivo para funcionar corretamente; caso contrário, tente:
bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'
Versão estendida para explicar:
O
%(...)T
formato para printf é válido no bash 5+.fonte
00:00
e incrementa um contador quando você bateCtrl-C
. Não há animação do cronômetro. (Testado no bash 5.0.7)bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'
. @roblogicbash -c
:)C (gcc) ,
121115 bytesExperimente online!
Define um manipulador de sinal para SIGINT, que é acionado pressionando o controle-C. Mantemos um deslocamento de tempo em
b
e exibimos a hora do relógio de parede menos a diferença horária. Se fizermos uma pausa, aumente a base de tempo toda vez que o relógio da parede bater para congelar o tempo exibido.Graças a @ceilingcat por cortar 6 bytes!
fonte
Data Zsh + Gnu, 242 bytes
Apresentando 1/100 de segundo! Requer um terminal interativo, mas aqui está um link TIO .
Pressione Enterpara iniciar / parar o cronômetro;Ctrl-Csair.
Comentários (um pouco desatualizados):
fonte
Commodore BASIC (C64 / TheC64 Mini, VIC-20, PET, C16 / + 4) - 147 bytes tokenizados e BASIC
{clear}
na listagem éSHIFT+CLR/HOME
que sai como um caractere PETSCII ao seguir uma aspas de abertura, enquanto que{home}
é aCLR/HOME
chave sem a mudança na mesma condição de seguir uma aspas de abertura.Use a barra de espaço como chave de controle.
Para trabalhar com o Commodore 128 no BASIC 7, altere a listagem nas seguintes linhas:
Adiciona sete tokens extras à contagem (como todos os números são armazenados no BASIC como 7 bytes, portanto,
goto10
ocorre com 8 bytes tokenizados, enquanto quegoto
é apenas 1).fonte