Implemente un cronómetro digital simple , que mostrará el tiempo transcurrido en segundos y minutos, como se describe a continuación.
Importante
¡Lea las secciones de Pantalla y Controles !
Monitor
El tiempo transcurrido, debe mostrarse en el MM:SS
formato, reemplazando la cadena de tiempo mostrada anteriormente "en el lugar" (también se permite borrar la totalidad o una parte de la pantalla).
El cronómetro debe actualizarse al menos cada segundo.
Ejemplos:
0 minutos, 0 segundos
00:00
0 minutos, 33 segundos
00:33
1 minuto, 50 segundos
01:50
Inicialmente, puede comenzar con '00: 00 'o con cualquier otro valor en el rango [00: 00-59: 59].
Una vez que su cronómetro llega 59:59
, debe reiniciarse 00:00
y continuar de nuevo.
Puede usar una base diferente (en lugar de decimal) o incluso un sistema de numeración diferente si lo desea, siempre que siga el patrón general.
Por ejemplo, 13:03
se puede mostrar como:
13:03
0D:03
N:D
10101:3
XIII:III
Tenga en cuenta que si utiliza un sistema / base de numeración no decimal, debe codificarse con caracteres ASCII (o Unicode) imprimibles, por ejemplo, no está permitido usar dos bytes binarios (no imprimibles) durante minutos y segundos.
También debe dejar a la izquierda su salida con ceros, según corresponda, si su sistema numérico lo permite.
Reemplazar el carácter separador :
con cualquier otro carácter imprimible (incluidos los dígitos) también es aceptable.
Controles
El cronómetro debe comenzar en pausa y permanecer en este estado, hasta que el usuario lo inicie explícitamente , presionando la tecla 'control' (ver más abajo).
Si, mientras el cronómetro está contando, el usuario presiona la tecla 'control' nuevamente, el cronómetro debe pausar (manteniendo la hora actual), hasta que la tecla 'control' se presione una vez más.
El 'control' clave puede ser una única pulsación de tecla, por ejemplo s
, o cualquier combinación de teclas, por ejemplo Ctrl+Shift+X
, pero debe ser 'atómica', presionando varias teclas en secuencia, por ejemplo, s
entonces Enter
, está no permitido .
Se debe usar la misma tecla de 'control' (o combinación) para pausar y reanudar el cronómetro.
Debe usar una tecla específica de 'control' , es decir, 'ninguna tecla' no está permitida.
Alternativamente, puede usar un clic del mouse simple o doble, en lugar de presionar una tecla para 'control'.
Reglas
- Este es el código de golf , gana la respuesta más corta en bytes;
- Se aplican las lagunas de código estándar de golf;
- Su programa debe (en teoría) ser capaz de ejecutarse para siempre.
fuente
00:05
se imprime y luego, en algún momento, se reanuda nuevamente, ¿deben00:06
aparecer 3000 milisegundos después de presionar la tecla de reanudar, o está bien imprimirlo un segundo después de presionar la tecla de reanudar?Respuestas:
SmileBASIC,
867771 bytesDIALOG
muestra un cuadro de texto en la pantalla táctil.N
es el número de segundos que el cuadro de texto permanecerá en la pantalla antes de que desaparezca. SiN
es así0
, permanece hasta que el usuario presiona el botón en la pantalla táctil.DIALOG
Devuelve1
si el usuario presionó el botón y0
si se cerró automáticamente. Entonces, cuando el usuario presiona el botón de pausa, regresa1
y el tiempo de visualización se establece en0
, pausando el cronómetro. Después de que el usuario presiona el botón nuevamente, configuramos el tiempo de visualización nuevamente1
, reanudando el temporizador. Básicamente, cada vez queDIALOG
regresa1
, el tiempo de visualización cambia1
y se0
usa!=
, lo que es equivalente a un XOR lógico siempre que ambas entradas sean 1 o 0.fuente
Python 2,
167129 bytes-36 bytes en su mayoría * por usar la idea de Maltysen de atrapar
ctrl-c
usando una excepción: ¡vaya a dar crédito!-4 bytes gracias a DLosc (init
n
yb
a 0 en lugar def()
)-1 byte gracias a FlipTack (usar en
p^=1
lugar dep=1-p
)-2 bytes gracias a Felipe Nardi Batista (eliminar especificadores de precisión)
Funciona igual que mi original, a continuación, pero con la secuencia de teclas de control de
ctrl+c
.(Probado por mí con Python 2.7.8 en Windows 7, 64 bits;
Probado por Brian Minton con Python 2.7.13 en Linux, 64 bits)
* también se contrajo la
if
declaración a una búsqueda en la lista para obtenertry
una sola línea.Mi original:
(Probado por mí con Python 2.7.8 en Windows 7, 64 bits; sin embargo, este código es específico de Windows debido al uso de la
msvcrt
biblioteca)La tecla de control es 'p'.
n
yb
se inicializan con el mismo valor al inicio, dando un "desplazamiento" de 0;p
se inicializa a 0, lo que indica un estado en pausa.Cada vez que se presiona la tecla de control,
p
se cambia el valor de . Cuando se cambia de un estado en pausa a un estado activo,b
se actualiza a un nuevo valor manteniendo cualquier compensación actual del estado (s) activo anterior conb-n
.Durante un estado activo
n
se actualiza repetidamente a la hora actual mediante una llamadatime.time()
.La diferencia entre
n
yb
,t
es entonces el número total de segundos (incluida una parte fraccional) transcurrido durante el estado o estados activos.Los minutos transcurridos son entonces
t/60
y cada uno de los minutos y segundos se muestran mod 60 con(t/60%60,t%60)
. Los ceros iniciales se anteponen para cada uno utilizando el formato de cadena de la parte entera con'...%0.2d...'
. Imprimir una tupla (el final,
) donde el primer elemento tiene un retorno de carro inicial (el\r
) hace que se sobrescriba el texto previamente impreso.fuente
^=
pero cambié en algún momento durante la formulación..
en%0.2d
? funciona bien como%02d
Python -
160159143 bytes¡Gracias a @JonathanAllan por salvarme 18 bytes!
Solo usa bibliotecas incorporadas, por lo que la clave de control es
ctrl-c
atraparlo con unexcept keyboardInterrupt
.fuente
except:
? Tengo una versión mía que funciona haciéndolo ...bash + utilidades Unix, 90 o 93 bytes
Versión de 90 bytes:
Versión de 93 bytes:
Ctrl-C es el carácter de reanudación / pausa. Un espacio es el delimitador entre minutos y segundos.
La diferencia entre las dos versiones es que el programa de 90 bytes funcionará durante 2 ^ 63 segundos (en ese momento, bash me dará un desbordamiento de enteros).
La versión de 93 bytes realmente funcionará para siempre.
El problema original incluía el requisito: "Su programa debe (en teoría) ser capaz de ejecutarse para siempre".
Si correr durante 2 ^ 63 segundos es suficiente para cumplir con ese requisito, entonces la solución de 90 bytes funciona. ¡Esa duración es más de 20 veces la edad del universo!
Si el programa necesita poder ejecutarse por más tiempo que eso, tendré que ir con la solución de 93 bytes.
Probablemente debería señalar que esta solución, así como al menos algunas de las otras publicadas, se retrasarán muy lentamente el tiempo transcurrido verdadero. Este deslizamiento se debe a que el programa está inactivo durante un segundo entre cada ejecución del cuerpo del bucle, pero el cuerpo del bucle tarda una pequeña cantidad de tiempo en ejecutarse. Esto será intrascendente en la práctica.
fuente
Initially, you can start with '00:00' or with any other value in range [00:00-59:59]
, que permanecerá en la pantalla hasta que presione 'control' por primera vez. Lo siento si no he podido formular esto lo suficientemente claro.QBasic,
213211 bytesLa tecla de control es la pestaña. Dejar esto en funcionamiento puede provocar incendios en la computadora portátil. Usted ha sido advertido.
Aquí está en acción, haciendo una pausa a los 10, 15 y 20 segundos:
Ungolfed y comentó
Tenga en cuenta que los valores de
TIMER
son de punto flotante. Esto no afecta a la salida, desdeMOD
y\
truncado a enteros. Pero sí agrega precisión a la cantidad de tiempo ahorrado: si pausa el temporizador justo antes de un tic, verá que cuando lo enciende nuevamente, el número cambia en menos de un segundo.fuente
Lote, 132 bytes
Al presionar
n
se (des) pausará el temporizador. El parpadeo de salida se puede reducir a un costo de tres (o cuatro) bytes.fuente
Bash puro, 141 bytes
Esto usa nada más que basuras integradas de Bash (sin herramientas externas). El carácter de control es Ctrl-Z, de modo que el
SIGTSTP
manejo estándar detiene el cronómetro.set -m
habilita el control del trabajo , que generalmente está desactivado en un script.&
) .read -t 1
espera un segundo la entrada del usuario , luego falla.until
ciclo continúa mientrasread
siga fallando.printf
genera el tiempo correctamente rellenado y formateado$[s=s>3598?0:s+1,s/60]
La expansión aritmética calcula primero el tiempo actualizado, verifica si ajusta y aumenta el contador de segundoss
, y luego devuelve la división de pisoss/60
.$[s%60]
da los segundos restantes.trap
controlador paraTSTP
, la señal Ctrl-Zgenera. Cuando Ctrl-Zse presiona mientras se ejecuta el script externo, se ejecutaráfg>/dev/null
y volverá a colocar el subshell en primer plano .>/dev/null
es necesario dejar defg
imprimir el comando subshell cada vez.00:00
y envía unaSTOP
señal al proceso secundario$!
, que pausará el proceso.read
espera la entrada para siempre, manteniendo vivo el guión.Si Ctrl-Zse presiona mientras el subshell está en primer plano, hará una pausa en la ejecución y devolverá el script externo al primer plano, donde esperará en silencio. Si el script externo está en primer plano, el controlador de trampa reanudará la ejecución del subshell y volverá a contar.
fuente
Javascript en la consola de Chrome, 143 bytes
Cuando se ingresa en la consola, inicia el contador a las 00:00 y luego habilita el control que se presiona en el documento.
No hay mucha magia, especialmente
(i/60)|0
el número de pisosHecho y probado en la consola de Chrome
fuente
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 bytesExplicación
Haga clic en el temporizador para iniciar o pausar el cronómetro. Como tal, un solo clic es la clave de control . El separador entre los dos valores es dos puntos.
Cada vez que el usuario hace clic en el clic,
b
se verifica el valor de . Se inicializa según lo0
que evalúafalse
, por lo que se evalúa una cadena de código cada 1000 milisegundos. Esto establece la variable en la identificación del intervalo, por lo que se puede detener más tarde. Sib
contiene un número, se evalúa comotrue
, por lo que se detiene el intervalo. Esto devuelve el valorundefined
, por lo que el ciclo continúa.La cadena de código cambia el html del elemento con id
a
(el cronómetro). Primero, los minutos se analizan tomando el valor del cronómetro anterior, dividiéndolo por los dos puntos y obteniendo el valor de los minutos, que aumenta en 0 si el valor de los segundos no es 59 (mayor que 58), y 1 en caso contrario, módulo 60 Entonces este valor se rellena. Luego viene el colon y, por último, los segundos. El código simplemente obtiene el valor anterior, lo aumenta en 1, toma el módulo 60 y, opcionalmente, lo rellena.fuente
C
309179 bytesVersión sin golf:
Uso: presione Enterpara pausar y reanudar el cronómetro.
Explicación:
break
el primerwhile
bucle y espere hasta que Enterllegue el siguiente .goto
primerwhile
bucle y reanuda el conteo.Ahora, sé que
goto
es una mala práctica de codificación en C, pero no pude encontrar otra forma.fuente
getchar()
bloquea hasta que se presiona algún carácter.m=0,s=0;
falla, porque no declaraste estas variables en ningún lado.Javascript, 124 bytes
La 'clave de control' es un clic en el documento. Para probar esto, pegue el código en la consola o en un archivo html dentro de la
<script>
etiqueta.Explicación:
Probado en cromo
fuente
PHP,
9491 bytesSupongo que 32 es el código clave para la barra espaciadora (que probablemente no lo sea);
Actualmente no tengo forma de probar ncurses. Pero el resto del código funciona bien.
comienza en
00:00
, pero aumenta inmediatamente cuando finaliza la pausaSi usted (como yo) no tiene ncurses, puede probar reemplazando el segundo
date
parámetro con$t+=$r^=!rand(sleep(1),19);
o$t+=$r^=++$x%20<1+sleep(1);
. (sleep
siempre regresa0
)Descompostura
fuente
C # 220 bytes
Golfed
Usando la
s
tecla para iniciar / detener. Todo el programa funciona recordando el TimeDelta usandoDateTime.Now
La mayoría de C # -Magic aquí proviene de la función C # 7.0
using static
.fuente
Bash, 65 bytes
trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}
Tenga en cuenta que debe escribirse en un script de archivo para que funcione correctamente, o bien, intente:
bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'
Versión extendida para explicarlo:
El
%(...)T
formato para imprimirf es válido en bash 5+.fuente
00:00
e incrementa un contador cuando golpeasCtrl-C
. No hay animación del temporizador. (Probado en bash 5.0.7)bash -c 'trap d=\$[!d] 2;for((;;)){ printf "\r%(%M:%S)T" $[n+=d];sleep 1;}'
. @roblogicbash -c
:)C (gcc) ,
121115bytesPruébalo en línea!
Establece un controlador de señal para SIGINT, que se activa presionando control-C. Mantenemos un desfase de tiempo
b
y mostramos el tiempo del reloj de pared menos el desfase de tiempo. Si estamos en pausa, incremente la base de tiempo cada vez que el reloj de pared marque para congelar el tiempo que se muestra.¡Gracias a @ceilingcat por reducir 6 bytes!
fuente
Fecha Zsh + Gnu, 242 bytes
Con 1/100 de segundo! Requiere un terminal interactivo, pero de todos modos aquí hay un enlace TIO .
Presione Enterpara iniciar / detener el temporizador; Ctrl-Csalir.
Comentarios (un poco desactualizados):
fuente
Commodore BASIC (C64 / TheC64 Mini, VIC-20, PET, C16 / + 4) - 147 bytes tokenizados y BASIC
{clear}
en el listado se muestraSHIFT+CLR/HOME
como un carácter PETSCII cuando se sigue una comilla de apertura, mientras que{home}
es laCLR/HOME
clave sin desplazamiento con la misma condición de seguir una comilla de apertura.Use la barra espaciadora como tecla de control.
Para trabajar con el Commodore 128 en BASIC 7, cambie la lista en las siguientes líneas:
Agrega siete tokens adicionales al conteo (ya que todos los números se almacenan en BASIC como 7 bytes, por lo que
goto10
son 8 bytes tokenizados mientrasgoto
que solo es 1).fuente