Mostrar un reloj digital

20

Mostrar un reloj digital

(Veo que hay muchos desafíos de reloj, he intentado leerlos todos, estoy bastante seguro de que esto es único)

Escribir un código que actualiza continuamente un reloj digital mostrado en el formato h:m:sen que h, my spuede ocupar 1 o 2 caracteres cada una. Las restricciones en términos simples como @BlueEyedBeast lo expresaron, básicamente quiero que reemplace el tiempo que se muestra.

  • No se permiten líneas nuevas.
  • Se permiten espacios finales
  • No se permiten otros caracteres finales
  • No se deben perder segundos (57 -> 59 no está permitido)
  • Los números que comienzan con "0" están permitidos, siempre que no ocupen más de 2 caracteres.
  • El código no debe aceptar ninguna entrada.
  • Si su idioma no puede obtener la hora actual sin entrada, puede usarla para ingresar hasta 8 bytes de una manera permitida de manera estándar
  • La salida debe ser stdout
  • ¡Esto es codegolf, por lo que gana la respuesta más corta!

Ejemplo

Estoy trabajando en un idioma llamado *> <> (estrella de mar) porque programas como este no son posibles en> <> (solo espera el archivo de E / S). Aquí hay un programa de reloj digital que funciona (sin golf). Este programa está escrito en *> <> :

s":"m":"hnonon"   "ooo88888888888ooooooooooo1S

Nota: Todo es idéntico a> <> en esto excepto, s = segundo, m = minuto, h = hora, S = dormir (100ms * x)

Esto produce:

14:44:31

Actualización cada 100 ms hasta que finalice.

Ejemplos no permitidos

Lo siguiente no está permitido:

1:

14:44:3114:44:32

2:

14:44:31 14:44:32

3:

14:44:31
14:44:32

El tiempo debe permanecer en la primera línea que se emitió sin caracteres finales visibles. Sin embargo, se permitiría borrar la terminal, ya que todavía no tendría caracteres finales.

redstarcoder
fuente
1
¿Tenemos que esperar 100 ms o podemos actualizar constantemente para siempre?
Azul
1
no tiene que esperar, la espera es justo lo que hace el ejemplo.
redstarcoder
2
Los requisitos de desafío me parecen demasiado estrictos.
mbomb007
1
@ mbomb007 Eliminé "El programa debe poder salir por entrada del usuario que no sea una señal / interrupción" ya que las respuestas actuales no parecían seguirlo de todos modos.
redstarcoder
1
¿Puede el programa confiar en una configuración local específica del sistema operativo?
raznagul

Respuestas:

5

Pyke, 6 bytes

Ctr\ J

Pruébalo aquí!

Creo que esto es valido. Reemplace el carácter de espacio con retorno de carro para salida válida (no funciona en línea)

Azul
fuente
Lo siento, no lo es. No se permiten líneas nuevas ni caracteres finales después del tiempo. Pondré 2 ejemplos para ser más explícito.
redstarcoder
¿No veo eso en las especificaciones?
Azul
1
La primera línea dice que no se permiten nuevas líneas, la tercera dice que no hay caracteres finales. Lo siento si eso no está claro, agradecería consejos sobre cómo solucionarlo.
redstarcoder
Entonces, ¿quieres que reemplace el viejo tiempo que se muestra?
Azul
¡Sí exactamente! Tu código actual parece perfecto.
redstarcoder
10

HTML + JS (ES6), 8 + 60 = 68 bytes

Probado en cromo.

setInterval`a.innerHTML=new Date().toLocaleTimeString('fr')`
<a id=a>

-1 byte (@ETHProductions): utilice el formato de hora francés en lugar de .toTimeString().slice(0,8)


HTML + JS (ES6), 8 + 62 = 70 bytes

Esto funcionará en Firefox.

setInterval('a.innerHTML=new Date().toLocaleTimeString`fr`',0)
<a id=a>

-3 bytes (@ETHProductions): utilice el formato de hora francés en lugar de .toTimeString().slice(0,8)

Darrylyeo
fuente
2
¿Como funciona esto? Nunca he visto la sintaxis de backtick antes. Tampoco puedo encontrar nada después de una búsqueda rápida.
Carcigenicate
1
Trabajando para mí en Inox (cromo)
redstarcoder
1
@Carcigenicate Es parte de la última especificación de JavaScript, ECMAScript6. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
darrylyeo
@darrylyeo Gracias. Pude encontrar cosas en la sintaxis literal, pero no pude ver cómo se aplicaba aquí. Necesito leer la especificación nuevamente. Todavía no entiendo cómo se usa la función que precede al backtick.
Carcigenicate
2
Puede guardar 3 bytes en Firefox one con new Date().toLocaleTimeString`fr` (1 byte en Chrome one with ...TimeString('fr'))
ETHproductions
6

Python 2, 50 bytes

(Python 2.1+ para ctimesin argumento)

import time
while 1:print'\r'+time.ctime()[11:19],

time.ctime()produce una cadena formateada, a partir de la cual hh: mm: ss se puede dividir usando [11:19](permanece en la misma ubicación, independientemente de la fecha y la hora).

printAl devolver el carro '\r'antes del texto y hacer que el texto sea el primer elemento de una tupla, ,suprime efectivamente el final implícito '\n'y sobrescribe la salida escrita anteriormente.

while 1 bucles para siempre.

Jonathan Allan
fuente
3
Creo que esto necesita un ,al final para suprimir la nueva línea; de lo contrario, en Python 2.7.12 obtengo nuevas líneas.
redstarcoder
Vaya, sí, tienes razón ... actualizado
Jonathan Allan
5

Mathematica, 48 41 37 28 bytes

Do[s=Now[[2]],∞]~Monitor~s

La salida será una TimeObject, refrescante continuamente.

Se ve como esto: ingrese la descripción de la imagen aquí

Versiones alternativas

48 bytes:

Dynamic@Refresh[TimeObject[],UpdateInterval->.1]

53 bytes:

Dynamic@Refresh[DateString@"Time",UpdateInterval->.1]
JungHwan Min
fuente
1
Con la actualización cada segundo, ¿se aseguró de que nunca se salte segundos? (Ej .: 11:11:11 -> 11:11:13)
redstarcoder
Dynamic@{DateString@TimeObject[], Clock[]}[[1]]
DavidC
1
@redstarcoder se actualiza cada ~ 1.002s, así que cambié a actualizar cada 100 ms
JungHwan Min
Bien, me acabo de dar cuenta de que en realidad no necesito Pause.
JungHwan Min
Dynamic@{Now,Clock[]}[[1]]tiene 26 bytes y muestra un objeto de fecha y hora. Dynamic@{DateString@"Time",Clock[]}[[1]]es de 40 bytes y solo genera hh: mm: ss
Kelly Lowder
5

Veo que se ha eliminado el requisito de una entrada de IU sin señal para detener el programa. Entonces ahora podemos hacer:

Bash + coreutils, 28

yes now|date -f- +$'\e[2J'%T

yes emite continuamente la cadena "ahora", una vez por línea, en una tubería.

date -f-lee interpreta cada "ahora" como la hora actual, luego emite en el formato requerido. La cadena de formato incluye la secuencia de escape ANSI para borrar la pantalla. date hace emitir una nueva línea después de la fecha - No estoy seguro de si esto descalifica, ya que la pantalla se borra cada vez que de todos modos.

Si descalifica, podemos usar tren su lugar:

Bash + coreutils, 31

yes now|date -f- +%T|tr \\n \\r

Respuestas anteriores:

Golpe + X, 32

xclock -d -update 1 -strftime %T

Lamentablemente, esto solo puede actualizarse cada segundo. Si eso descalifica, entonces podemos hacer esto en su lugar:

Bash + coreutils, 43

until read -t0
do printf `date +%T`\\r
done
Trauma digital
fuente
Actualizar cada segundo está bien, siempre y cuando nunca se salte segundos (IE: 12-> 14).
redstarcoder
¡Permitiré tu nueva línea! Nunca esperé que este caso sucediera je.
redstarcoder
¿Esto está permitido? date +$'\e[2J'%T;$0
Evan Chen
@EvanChen no, porque cada iteración genera de forma recursiva un nuevo proceso y eventualmente utilizará la memoria disponible o el espacio PID, de forma análoga a un desbordamiento de pila. Sin embargo, podría hacerlo date +$'\e[2J'%T;exec $0por 24 bytes ...
Digital Trauma
4

QBIC , 6 bytes

{_C?_d

{      Starts a DO-loop
 _C    CLS
   ?   PRINT
    _d TIME$

Borra constantemente la pantalla e imprime la hora del sistema en el formato 22:03:41.

Steenbergh
fuente
3

Clojure, 150 136 141 bytes

V3: 141 bytes :(

+5 bytes para corregir un error. Dado que los tiempos no están rellenados con ceros, el reloj puede "encogerse" y expandirse cuando cambia la hora. Estaba "manchado" cuando se redujo porque ya no se borraba el último dígito. Se solucionó agregando algunos espacios al final para garantizar que todo se sobrescribiera.

#(while true(flush)(print(str(apply str(repeat 9"\b"))(.format(java.text.SimpleDateFormat."H:m:s")(java.util.Date.))"   "))(Thread/sleep 99))

V2: 136 bytes

#(while true(flush)(print(str(apply str(repeat 9"\b"))(.format(java.text.SimpleDateFormat."H:m:s")(java.util.Date.))))(Thread/sleep 99))

-14 bytes cambiando a usar SimpleDateFormatpara formatear la fecha. Sigue siendo enorme.

V1: 150 bytes

#(while true(let[d(java.util.Date.)](flush)(print(str(apply str(repeat 9 "\b"))(.getHours d)":"(.getMinutes d)":"(.getSeconds d)))(Thread/sleep 100)))

Me di cuenta de que probablemente estoy usando la peor forma posible para obtener la fecha. Definitivamente hay margen de mejora aquí.

Sin golf:

(defn -main []
  (while true
    (let [d (java.util.Date.)]
      (flush)
      (print
        (str
          (apply str (repeat 9 "\b"))
          (.getHours d)":"(.getMinutes d)":"(.getSeconds d)))
      (Thread/sleep 100))))
Carcigenicate
fuente
3

Bash + reloj, 19 bytes

watch no es parte de coreutils , pero está disponible en casi todas las distribuciones de Linux.

Golfed

watch -tn1 date +%T

Pruébalo en línea!

zepelín
fuente
2

WinDbg, 73 bytes

.do{r$t0=0;.foreach(p {.echotime}){r$t0=@$t0+1;j8==@$t0'.printf"p \r"'}}1

Actualiza continuamente una línea con la hora actual hasta que el usuario presiona Ctrl + Break.

Cómo funciona:

.do                          * Start do-while loop
{
    r$t0 = 0;                * Set $t0 = 0
    .foreach(p {.echotime})  * Foreach space-delimited word in a sentence like "Debugger (not 
    {                        * debuggee) time: Mon Dec  5 14:08:10.138 2016 (UTC - 8:00)"
        r$t0 = @$t0+1;       * Increment $t0
        j 8==@$t0            * If $t0 is 8 (ie- p is the current time)
        '
            .printf"p \r"    * Print p (current time) and \r so the next print overwrites
        '
    }
} 1                          * Do-while condition: 1, loop forever

Salida de muestra (bueno, ya tienes la idea):

0:000> .do{r$t0=0;.foreach(p {.echotime}){r$t0=@$t0+1;j8==@$t0'.printf"p \r"'}}1
14:10:12.329
Leche
fuente
2

PHP, 28 bytes

for(;;)echo date("\rH:i:s");

La datefunción imprime todo literalmente que no reconoce.

\r es el retorno de carro, establece el cursor en la primera columna.

Corre con -r.

Titus
fuente
2

MATL , 11 bytes

`XxZ'13XODT

Bucle infinito que borra la pantalla e imprime la hora en el formato especificado.

¡Puedes probarlo en MATL Online! . Este compilador es experimental; si no funciona, actualice la página y presione "Ejecutar" nuevamente.

Luis Mendo
fuente
2

C #, 82 bytes

()=>{for(;;)Console.Write(new string('\b',8)+DateTime.Now.ToString("HH:mm:ss"));};

Método anónimo que sobrescribe constantemente 8 caracteres con nueva salida. Se puede acortar 1 byte si se modifica para aceptar un parámetro ficticio ( z=>...).

Programa completo:

using System;

public class Program
{
    public static void Main()
    {
        Action a =
        () =>
        {
            for (;;)
                Console.Write(new string('\b', 8) + DateTime.Now.ToString("HH:mm:ss"));
        };

        a();
    }
}
adrianmp
fuente
1
¿Está permitido no importar System? Algunas personas lo hacen y otras no: /
Yytsi
No lo hizo en su solución real, solo en el programa de demostración, así que sí, está bien
Stefan
2

C #, 65 bytes

()=>{for(;;)Console.Write("\r"+DateTime.Now.ToLongTimeString());};

Funciona sobrescribiendo la misma línea dentro de un bucle sin fin

Stefan
fuente
2

SmileBASIC 3.3.2, 38 bytes

@L?TIME$;" ";
GOTO@L

UTF-16 apesta :(

De todos modos, esto imprime repetidamente la hora local en HH: MM: SS con un espacio después, sin nueva línea después. Sin embargo, no se actualiza cada segundo, solo se imprime repetidamente para siempre.

caracol_
fuente
Lo sentimos, esto no es válido, necesita reemplazar la salida, esto no lo hace. Establecer la primera línea @L?TIME$y agregar una línea después (para un total de 3 líneas) que leaLOCATE 0, 0 hace el truco (¿SmileBASIC admite retorno de carro?).
redstarcoder
También se olvidó de marcar la nueva línea, haciendo estos 40 bytes (UTF-16 es brutal para el golf de código). Puede obtener la longitud de los caracteres muy fácilmente a través de Python REPL len(""" YOUR CODE HERE """), luego simplemente haga * 2 para UTF-16.
Redstarcoder
No SB no hace CR en realidad, tendría que colocar una declaración LOCATE allí que destruiría absolutamente mi puntaje: P O un CLS: VSYNC que es igual de malo.
caracol_
Sí, lamentablemente esta solución no es válida sin ella. ¡Buenas noticias! SmileBASIC se puntúa como UTF-8 .
Redstarcoder
2

C, 134 116 89 80 76 75 73 bytes

main(n){for(;time(&n);)printf("\r%02d:%02d:%02d",n/3600%24,n/60%60,n%60);}

---- Old versions:
main(n){for(;;)n=time(0),printf("\r%02d:%02d:%02d",n/3600%24,n/60%60,n%60);}

n;main(){for(;;)n=time(0),printf("\r%02d:%02d:%02d",n/3600%24,n/60%60,n%60);}

---- 

n;main(){for(;;)n=time(0),printf("\r%02d:%02d:%02d",n/3600%24,n/60%60,n%60);}

----

Saved 9 more bytes thanks to @nmjcman101 again:
n;main(){for(;;)n=time(0),printf("\r%02d:%02d:%02d",(n/3600)%24,(n/60)%60,n%60);}

----

Saved 27 bytes thanks to @nmjcman101
n,b[9];main(){for(;;){n=time(0);strftime(b,9,"%H:%M:%S",localtime(&n));printf("\r%s",b);}}

----

I figured out I don't need to put `#include<stdio.h>` into the file :)
#include<time.h>
main(){for(;;){time_t n=time(0);char b[9];strftime(b,9,"%H:%M:%S",localtime(&n));printf("\r%s",b);}}

----

#include<time.h>
#include<stdio.h>
main(){for(;;){time_t n=time(0);char b[9];strftime(b,9,"%H:%M:%S",localtime(&n));printf("\r%s",b);}}
Stefan
fuente
Parece que (para mí) también puedes eliminarlo time.h. Esto elimina el tipo time_t, por lo que necesita hacer n un int en su lugar. Esto se puede hacer declarándolo fuera de main (like n;main...), lo que elimina la necesidad de int. También puede deshacerse de la charcon el mismo truco: b[9];main.... Ambos son de tipo int ahora, pero es lo suficientemente flexible.
nmjcman101
Wow, muchas gracias, no sabía que esto funcionaría. Gracias
Stefan
Por favor, deténgame si desea jugar golf usted mismo, pero también saqué el strftime...y el b[9]e imprimí esto: printf("\r%d:%d:%d",(n/3600)%60-29,(n/60)%60,n%60); no estoy seguro de si los padres son necesarios o no. También puede eliminar un conjunto de {}comillas entre comillas para que seafor(;;)a,b,c;
nmjcman101
1
Estos paréntesis son molestos. (n/60)%60, ¿seriamente?
anatolyg
1
Puede guardar 1 byte declarando ncomo parámetro de main, digamos en main(n)lugar den;main()
Karl Napf
2

Powershell, 39 bytes

for(){write-host -n(date -F h:m:s`0`r)}

Porque no me gusta usar cls en Powershell. De la publicación de briantist @ /codegolf//a/102450/63383

Daniel Cheng
fuente
2

Pascal, 61 bytes

uses sysutils;begin while 1=1do write(#13,timetostr(now))end.

Pascal gratis tiene buenas rutinas de tiempo en la unidad SysUtils. Sin golf:

uses
  sysutils;
begin
  while 1=1 do
    write(#13, timetostr(now));
end.
hdrz
fuente
2

C 65 (anterior 64) bytes

Garantizado para trabajar en máquinas Linux. :)

@Marco ¡Gracias!

f(){while(1){system("date +%T");usleep(100000);system("clear");}}
Abel Tom
fuente
1

Vim, 26 bytes

qqS<C-r>=strftime("%T")<CR><esc>@qq@q

Esto crea una macro recursiva (por ejemplo, un bucle eterno) que elimina todo el texto en la línea actual y lo reemplaza con la hora actual.

DJMcMayhem
fuente
1

Pyth - 28 bytes

Un poco largo, porque pyth no tiene strftime.

#p+"\r"j\:m.[`02`dP>4.d2.d.1
Maltysen
fuente
1

Groovy, 45 personajes

for(;;)print(new Date().format("\rHH:mm:ss"))
hombre trabajando
fuente
1

Jalea , 8 bytes

13Ọ7ŒTȮß

13Ọ        chr(13), carriage return
   7ŒT     time string, which extends the previous character
      Ȯ    print
       ß   call the whole link again

Pruébalo en línea!

El retorno de carro no funciona en línea, y no puedo hacer que el intérprete funcione, por lo que no se ha probado, pero funciona como se esperaba cuando uso caracteres imprimibles en lugar del CR.

JayDepp
fuente
1

ForceLang, 123 bytes

def s set
s d datetime
s z string.char 8
s z z.repeat 16
label 1
io.write z
io.write d.toTimeString d.now()
d.wait 9
goto 1

datetime.toTimeStringestá respaldado en la implementación de referencia por Java DateFormat.getTimeInstance(), que depende de la configuración regional, por lo que puede establecer la configuración regional predeterminada del sistema en una que utilice 24 horas.

SuperJedi224
fuente
1

PowerShell, 30 28 24 20 bytes

Cambié la región de mi computadora a Alemania en base al comentario de raznagul para ahorrar 4 bytes. :)

for(){date -F T;cls}

Versión anterior que funciona en todas las configuraciones regionales.

for(){date -F h:m:s;cls}
briantista
fuente
1

tcl, 69 bytes

while 1 {puts -nonewline \r[clock format [clock seconds] -format %T]}

Pruébalo aquí!

sergiol
fuente
0

Lote, 36 bytes

@set/p.=␈␈␈␈␈␈␈␈%time:~0,8%<nul
@%0

Donde representa el carácter ASCII BS (código 8).

Neil
fuente
0

Raqueta, 71 bytes

(require srfi/19)(let l()(display(date->string(current-date)"↵~3"))(l))

Donde el es en realidad un CR (hex 0d). Volcado hexadecimal del programa para mayor aclaración (byte de aviso en la posición hex 4d)

00000000  28 72 65 71 75 69 72 65  20 73 72 66 69 2f 31 39  |(require srfi/19|
00000010  29 28 6c 65 74 20 6c 28  29 28 64 69 73 70 6c 61  |)(let l()(displa|
00000020  79 28 64 61 74 65 2d 3e  73 74 72 69 6e 67 28 63  |y(date->string(c|
00000030  75 72 72 65 6e 74 2d 64  61 74 65 29 22 0d 7e 33  |urrent-date)".~3|
00000040  22 29 29 28 6c 29 29                              |"))(l))|
00000047

Utiliza SRFI / 19 incluido con la distribución Racket. (current-date)Obtiene la fecha y hora local actual. El date->stringformato ~3es el formato ISO-8601 hora-minuto-segundo. (let l () ... (l))en un bucle infinito idiomático. (require srfi/19)carga el srfi/19módulo

Winny
fuente
0

C, 156 bytes

#include<stdio.h>
#include<time.h>
int main(){time_t a;struct tm *b;char c[9];for(;;){time(&a);b=localtime(&a);strftime(c,9,"%H:%M:%S",b);printf("%s\r",c);}}
Entrenador Walt
fuente
0

TI-Basic, 40 bytes

(En TI-BASIC, muchos caracteres son tokens de 2 bytes, y los dos puntos al comienzo de una línea tienen 0 bytes adicionales)

:ClrHome
:Output(1,6,":
:setTmFmt(24
:While 1
:Output(1,1,getTmSrr(0
:getTime
:Output(1,7,Ans(3
:End
Julian Lachniet
fuente
0

R, 41 bytes

repeat{cat(format(Sys.time(),"%T"),"\r")}

Tiene un espacio final (debido a que catel separador predeterminado es un espacio).
Debido a la frecuencia de actualización de la R GUI, ejecutar esto en la GUI ocasionalmente omitirá algunos segundos, pero si lo guarda en un archivo y lo ejecuta en la línea de comando, se mostrará correctamente cada segundo.
Se ejecutará para siempre hasta que el usuario interrumpa.

plannapus
fuente