¡Es hora de un desafío de reloj!

25

Me gustaría que me construyas un reloj que muestre la hora en este formato:

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

Esto muestra '18: 10 '. La hora actual y la siguiente se muestran al frente de la línea, seguidas de un espacio y una serie de guiones: en la primera línea, la cantidad de minutos que han pasado en esta hora, y la segunda línea muestra cuántos minutos más ir en esta hora

Para aclarar

  • El reloj debe mostrar la hora del sistema. Si buscar el tiempo de otra fuente es más conveniente, también está bien. Es posible que no se suministre como entrada.
  • En 18:00, la línea superior es justa 18(espacios finales permitidos pero no obligatorios)
  • En 18:59el resultado final es19 -
  • Las horas <10 se rellenan previamente con un 0( 01 -----) o se alinean a la derecha ( 1 -----). No se permite un solo dígito alineado a la izquierda, ni siquiera si los guiones comienzan en el lugar correcto ( 1 -----no es válido).
  • El reloj debe mostrar las horas en formato de 24 h.
  • Aunque se llama formato 24h, en realidad no hay un formato 24. Durante la hora 23, la segunda línea comienza con 00o 0.
  • La pantalla debe actualizarse al menos una vez por minuto, pero eso no tiene que suceder exactamente en 00segundos. Puede actualizar más frecuentemente / continuamente si eso es más conveniente, pero el resultado debe ser, por supuesto, legible, no una mancha en toda la pantalla.

Entrada

Ninguna.

Salida

  • Como se describió anteriormente. Los espacios finales para acolchar el reloj a posiciones de 60 ish están permitidos en ambas líneas, también se permite una nueva línea final.
  • La pantalla debe borrarse cuando se muestra el siguiente minuto: ya sea con un comando de pantalla clara o agregando no menos de 30 líneas nuevas.

Reglas adicionales

Steenbergh
fuente
¿podemos tener dos espacios entre el número y los guiones?
Adám
66
"actualizado una vez por minuto": ¿se puede actualizar con más frecuencia?
sonríe el
1
@smls Sí, puede actualizar con la frecuencia que desee. Cambiaré las especificaciones a 'al menos una vez por minuto'.
steenbergh
1
@KritixiLithos Eso rompería la alineación con horas de dos dígitos (9, 10 o 23, 00), así que no, no está permitido.
steenbergh
1
Después de las 23, ¿la siguiente hora es 24 o 0?
Kritixi Lithos

Respuestas:

2

MATL , 41 bytes

Gracias a @Kundor por notar un error, ahora corregido

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

Pruébalo en MATL en línea! Pero tenga en cuenta que el programa se elimina después de 30 segundos, por lo que es difícil detectar cualquier cambio en la salida.

Cómo 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
Luis Mendo
fuente
Podría ser yo, pero en la segunda iteración, solo se imprime la línea superior ...
steenbergh
@steenbergh Funciona para mí con minutos y segundos en lugar de horas y minutos, por lo que los cambios se ven fácilmente: matl.suever.net/…
Luis Mendo
1
Sí, funciona. - De hecho, podría ser genial tener esto como líneas 3 y 4 de mi propio reloj.
steenbergh
@steenbergh: aceptó esta respuesta, pero no es válida, muestra la hora después de las 23 como 24. Creo que la respuesta correcta más corta es la Ruby de Value Ink.
Nick Matteo
@kundor Gracias por notarlo. Corregido al costo 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 sencillo. Esa es una cadena con un espacio al principio. Las horas están alineadas a la derecha. Esto solo funciona en las calculadoras TI-84 + ya que la TI-83 no tiene un reloj interno.

Editar: Gracias @kundor por notar que no cerré el último bucle. Corregido ahora (+2 bytes).

Edición n.º 2: la primera hora debe ser cero, no veinticuatro. Corregido a un costo de +14 bytes.

Timtech
fuente
¿Cada comando cuenta como un byte?
Sygmei
@Sygmei La mayoría de los tokens son de un byte, sí. Sin embargo, los tokens tales como Str1, getTime, y sub(son dos bytes cada uno. Puede obtener más información en tibasicdev.wikidot.com/tokens
Timtech
No tendría un enlace a un emulador, ¿verdad?
steenbergh
Recomendaría cemetech.net/projects/jstified pero recuerde que es moralmente incorrecto usar una ROM de Internet con este emulador a menos que usted mismo posea ese tipo de calculadora.
Timtech
1
No tengas miedo de hacer clic en el enlace, porque el emulador es legítimo y te pide que cargues tu propia ROM antes de que funcione. TI solía tenerlos disponibles gratuitamente, pero ya no están. Si puede encontrar una TI-84 de un amigo, esa sería la mejor opción.
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: la décima línea tiene un espacio final. Para mí, %time%formatea horas con un espacio inicial pero minutos con un cero inicial. Decidí que un cero inicial era un formato de salida más fácil, ya que todo lo que tengo que hacer para eso es agregar 100 horas y eliminar el primer dígito. Minutos son más difíciles como 08o 09provocarán errores de análisis octales, así que prefijo A 1efectivamente añadiendo 100 minutos, ajustando por este mediante la compensación del bucle apropiadamente, que es un byte más corto que restando el 100.

Neil
fuente
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))

Esto usa el nuevo formato de cadena f para guardar un byte ( f'\n{h+1:2} 'vs. '\n%2d '%(h+1)) Puede cambiar [sleep(9)]a 1para guardar 8 bytes, pero luego solo muestra la pantalla.

Se guardó un byte cambiando while 1:...;sleep 60a while[sleep(60)]:..., gracias a TuukkaX.

Tuve que usar 5 bytes más para que la siguiente hora mostrada después de las 23 fuera 0, en lugar de 24, como OP acaba de comentar. :-(

Recuperado un byte durmiendo solo 9 segundos en lugar de 60.

Se guardaron dos bytes usando un toque de bits para acortar (h+1)%24, tomado de la respuesta Ruby de Value Ink .

Nick Matteo
fuente
¿Podría explicar por qué ha puesto corchetes alrededor de la condición if? ¿No sería solo tener un espacio entre el tiempo y el sueño de 1 byte, en lugar de los 2 de cada lado? EDITAR: No importa, es para hacerlo veraz. Lo suficientemente justo.
Sombra
1
@shadow: sleepregresa None, lo cual es falso.
Nick Matteo
@ ToivoSäwén: sleeptambién está en el timemódulo, por lo que importar * es mejor.
Nick Matteo
5

Ruby, 98 95 91 bytes

Actualizaciones cada 5 segundos. Solo funciona en terminales de estilo Unix.

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

Versión del símbolo del sistema de 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}
Tinta de valor
fuente
¿Puedes usar backticks en lugar del sistema? `cls`vssystem'cls'
IMP1
Parece que no, pero puede usar h=t.houry luego usar en hlugar del segundo t.hour, lo que ahorra 3 bytes.
IMP1
@ IMP1 de hecho, los backticks no funcionan cls. ¡Gracias por tu otra sugerencia, sin embargo!
Value Ink el
Resulta que @ IMP1 puts`clear`es el camino a seguir si usa terminales Unix. Simplemente no funciona con el símbolo del sistema de Windows cls.
Value Ink el
Para Windows, puede puts"\e[H\e[2J"borrar la consola, que creo que afeita cuatro bytes. Haría que tu primera línea se leyeraloop{t=Time.now;puts"\e[H\e[2J%02d %s
IMP1
4

Perl 6 , 113 bytes

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

Pruébelo una vez con un tiempo de espera de un segundo.

O pruebe una versión alterada que muestre el resultado de ejecutarse durante varias 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
}
Brad Gilbert b2gills
fuente
¿Qué operadores admite el 'triángulo producido'? En [\+]agrega y en [\-]parece restar. ¿Funciona esto con la multiplicación y tal?
Yytsi
@TuukkaX Debería funcionar con casi todos los operadores infijos. Básicamente es lo mismo [+] LISTque se reduce, excepto que le da los valores intermedios. Vea la página de documentos para productos
Brad Gilbert b2gills
4

QBasic, 120 127 121 bytes

No ejecute esto por mucho tiempo o su computadora portátil se incendiará. Ahora 99.several9s% ​​más eficiente de la 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

Sin golfos y explicación

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

Comenzamos limpiando la pantalla, luego obtenemos las horas y minutos actuales de TIMER, que devuelve el número de segundos desde la medianoche.

Esta es la primera vez que lo intento PRINT USING, así que me encantó descubrir que no sufre la peculiaridad QBasic habitual de que los números positivos se imprimen con un espacio inicial. ##ya que el especificador de formato garantiza que los números de un solo dígito estén alineados a la derecha y rellenados con un espacio, según sea necesario. Desafortunadamente, tenemos que usar un bucle para los guiones, ya que QBasic no tiene una función de repetición de cadenas. (Si me equivoco, ¡házmelo saber!)

Todas las PRINTdeclaraciones terminan con ;suprimir la nueva línea; pero después de los guiones, necesitamos una nueva línea; así, el solitario ?después del FORbucle interno .

El SLEEP 1ahora es necesario. Sin ella, la pantalla se borra tan rápidamente después de la impresión que es solo un destello parpadeante. (He usado LOCATE 1en lugar de CLSen un primer momento por esa razón, hasta que me di cuenta de que CLScon SLEEPes más corto de todos modos.) RUNReinicia el programa desde la parte superior - el camino más corto para conseguir un bucle infinito.

DLosc
fuente
¿Cómo maneja esto la última hora del día? La línea superior dice 23, pero ¿cuál es la hora en la línea inferior?
steenbergh
Estoy usando el Note7 y estoy pensando en ejecutar este programa en el futuro previsible en lugar del reloj de mi barra de estado. ¿Es eso una buena idea?
owlswipe
@steenbergh Vaya, arreglado. Sería útil para usted mencionar ese caso límite en la pregunta.
DLosc
@DLosc Nah, solo estoy bromeando :)). Pero si, inteligente !!
owlswipe
1
@steenbergh Imprime h MOD 24, si inicialmente h = 23, entonces el siguiente ciclo de ciclo es 24 y se modifica a 0. Pero tengo curiosidad por saber si también funciona. El CLS borra la primera línea para que nunca haya ambas líneas impresas en la pantalla, ¿verdad?
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();}}

Esto solo actualiza cada 30 iteraciones del ciclo while. Las otras 29 iteraciones solo imprimen nuevas líneas.

Actualizado

¡Guardado 13 14 bytes gracias a la ayuda de Kevin Cruijssen! ¡Gracias!

CraigR8806
fuente
Hola, bienvenido a PPCG! En primer lugar, solo se permiten programas / funciones, y su código actual es un fragmento. Tendrá que rodearlo con un método (es decir, void f(){...}y deberá agregar las importaciones que requirió (en su caso import java.time.*;). Dicho esto, su código se puede jugar en varios lugares para reducirlo a 311 bytes (incluso con el método agregado -declaración e importación). (Dado que es demasiado largo para este comentario, lo coloqué en el siguiente comentario ... 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 ) Recomiendo leer Consejos para jugar golf en Java y Consejos para jugar golf en <todos los idiomas> . Disfruta tu estancia.
Kevin Cruijssen
@KevinCruijssen Actualicé mi respuesta y pude guardar 3 bytes más usando la notación lambda. También cambié algunas piezas al código que proporcionó, para cumplir con las especificaciones (por ejemplo, en for(i=0;i++<60lugar de 61 y en (h<10?lugar de 9. ¡Gracias por informarme sobre la declaración del método y algunos consejos de golf!
CraigR8806
Ah, el 61 en lugar de 60 fue de hecho mi error. Pensé que lo había escrito como en for(i=0;++i<61lugar de for(i=0;i++<61(en este segundo caso debería ser 60, y aunque es la misma cantidad de bytes, probablemente sea más obvio / legible). Sin h<9embargo, en mi código es correcto. Tuviste h+1<10antes y simplemente cambié esto al h<9eliminar 1 en ambos lados. :)
Kevin Cruijssen
1
@KevinCruijssen Ha ¡No entendí eso! h<9. Lo editaré para guardar 1 byte más. ¡Gracias de nuevo!
CraigR8806
4

C, 176 162 161 160 156 bytes

Este es un abuso grave de los punteros, pero se compila y ejecuta según lo especificado. Asegúrese de compilar sin optimización, de lo contrario es probable que llegue a una falla predeterminada.

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));}

Sin golf:

#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));
 }
}
Seth
fuente
3

JavaScript (ES6), 162 bytes

Actualizaciones una 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)

George Reith
fuente
Puede guardar bastantes bytes reestructurando el código para que sea solo una declaración (es posible llamar console.clear()dentro del console.logargumento) y asignar paréntesis no utilizados tanto como sea posible. Versión para 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'+$:$))).
Lucas
Puede guardar un montón de bytes poniendo las horas y minutos en una sola función 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)

salvó un byte gracias a @TuukkaX

ovs
fuente
2
No necesita la nueva línea y el espacio después delwhile 1:
Wheat Wizard
Empecé tu código a las 19:55. A las 20:01, ya veo 19 - \n 20 -----------------------------------------------------------. Las horas no se actualizan ...
steenbergh
@steenbergh Lo intenté yo mismo configurando el reloj manualmente y funciona para mí.
ovs
@ovs no son divertidos desafíos de reloj :-). De todos modos, probablemente algo con repl.it entonces ...
steenbergh
head-desk El servidor Repl.it está a una hora de mi hora local ... E incluso lo dice en la parte superior de la consola. Me veré afuera, gracias ...
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");}}

Versión sin golf

#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");    
 }
}

¡Hace el trabajo! Definitivamente se puede acortar de alguna manera. Suponga que el unistd.harchivo está incluido.

@Neil Gracias por la información.

@Seth Gracias, por guardar 8 bytes.

Abel Tom
fuente
IIRC debe incluir todo lo necesario para que el código se compile (en este caso, las definiciones de time_ty struct tm) en su conteo de bytes.
Neil
En lugar de printf("\n");que pueda usarputs("");
Seth
3

Golf por primera vez ...

Powershell, 116 bytes (antes 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}

Editar: del consejo de @ AdmBorkBork, cambió Get-Date a fecha y Clear a cls, para ahorrar 6 bytes.

mcmurdo
fuente
Bienvenido a PPCG, buena respuesta
George
Bienvenido a PPCG! Un par de campos de golf fáciles: puede usarlos en clslugar de cleary (siempre que esté en Windows) en datelugar de get-date. También estoy seguro de que hay una forma más fácil de generar el formato: estoy jugando con él y te avisaré si se me ocurre algo.
AdmBorkBork
Agradable. Intenta esto: 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}. Utilice el salto de línea LF en su editor en lugar de ``
n`
3

PHP, 104105 bytes

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

El escaparate de printfde caracteres de relleno personalizada:
"%'-Ns"= cadena almohadilla izquierda con -a Ncaracteres.

imprimirá 99 líneas nuevas (cada 6 segundos) en lugar de borrar la pantalla.

La primera línea nueva debe ser un solo personaje. Entonces, en Windows, debe ser reemplazado por \n.

Titus
fuente
2

Lenguaje GameMaker, 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)}

En la configuración, debe ignorar los errores no fatales para que esto funcione. Además, en GML, #es equivalente a \nen la mayoría de los idiomas.

Timtech
fuente
2

Perl 6 , 104 bytes

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

Debe ejecutarse en un terminal compatible con ANSI para que funcione la secuencia de control para restablecer el terminal.

Bastante básico (porque los enfoques más ofuscados que probé resultaron más largos):

  • DateTime.now.&{" "}.say xx*: Transforma el tiempo actual en una cadena (ver abajo) y dilo, y repite todo eso un número infinito de veces. La cadena se construye así:
    • \ec: Código de control ANSI <ESC>cpara restablecer el terminal, que borra la pantalla.
    • {.hour.fmt: '%2s'}: hora, alineado a la derecha con 2 columnas
    • : espacio
    • {'-'x.minute}: guión repetido veces por minuto
    • \n: nueva línea
    • {(.hour+1).fmt: '%2s'}: próxima hora, alineado a la derecha con 2 columnas
    • : espacio
    • {'-'x 60-.minute}: guión repetido veces 60 menos el minuto
smls
fuente
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}}

Como AWKno tiene una sleepfunción incorporada, simplemente hago que revise continuamente el reloj para ver si el minuto ha cambiado todavía. La clave es que funciona ... ¿verdad? :)

Robert Benson
fuente
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)]])
Gurupad Mamadapur
fuente
1
¿No puedes simplemente en print('\n'*50)lugar de os.system('cls')hacerlo, funciona tanto en * nix como en Windows? Ahorraría un par de bytes ya que puede perder la osimportación y OP dice que esto está permitido.
ElPedro
Oh, entonces no lo leí correctamente. Muchas gracias hombre.
Gurupad Mamadapur
Solo para información, la mayoría de las personas tiende a usar <s> </s> alrededor de su conteo de bytes anterior y luego coloca el nuevo conteo de bytes después porque es interesante ver el progreso como una respuesta mejorada :-) Debe probar 3.5 algunos hora. Todavía estoy trabajando con Python 2.
ElPedro
1
@ElPedro Sí, olvidé hacerlo. Lo editaré ahora.
Gurupad Mamadapur
2

Python, 115 113 bytes

ahorró un par de bytes gracias a @kundor y @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)))
dfernan
fuente
Al menos en mi sistema, esto no borra los caracteres subyacentes, por lo que el número de guiones en la segunda línea no disminuye a medida que pasa el tiempo. Además: puede guardar tres bytes colocando su bucle while en una línea y dos bytes cambiando los :02formatos a solo :2.
Nick Matteo
2
Puede solucionar el problema descrito por @kundor en 1 byte agregando un espacio después del {} correspondiente.
Phlarx
@kundor arreglado! Gracias. Mantuve el :02formato a la derecha de un dígito horas con ceros.
dfernan
@kundor * hora izquierda de un dígito con ceros.
dfernan
@dfernan: Bueno, :2pads izquierdos con espacios, que el desafío dice que está bien.
Nick Matteo
2

C # interactivo (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)}");}
series0ne
fuente
1
¿Puedes jugar golf con 1) nombrando la fecha var en dlugar de dt? y 2) usar sleep(1e3)o en 999lugar de 1000?
steenbergh
@steenbergh ver actualización
series0ne
Algunas cosas ... Esto es solo un fragmento, no un método o programa (aunque no estoy seguro de si es válido en C # Interactive), es esencialmente una versión de golf de mi código, y si debería haberse comentado como mejoras, no un solución separada (aunque esto es especulación) y hay muchas pequeñas mejoras que puedes hacer aquí, ¿e incluso necesitas dormir?
TheLethalCoder
@TheLethalCoder Puse específicamente C # Interactive porque esto funciona SOLO en la consola interactiva. Esto no funcionaría como un programa estándar de C #.
series0ne
También tenga en cuenta que esto no funcionará cuando la hora sea 23 y cuando el minuto sea 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,"-");

Como no hay forma de limpiar la pantalla (que puedo encontrar) tuve que ir con un montón de líneas nuevas. Además, la pregunta que se actualiza a "al menos" una vez por minuto guarda un byte en 9lugar de 60.

editar: @Titus notó un error en el relleno de la segunda hora. Arreglarlo cuesta 8 bytes.

usuario59178
fuente
Este mensaje de advertencia sobre el texto en la salida estándar, junto con la salida correcta: 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. ¿Algo sobre Meta sobre eso?
steenbergh
@steenbergh Eso es un aviso; no se mostrará si utiliza valores predeterminados (parámetro de línea de comando -noerror_reporting(22519);
Titus
las horas se deben rellenar hasta la longitud 2
Titus
Buen punto, el Hajuste para la fecha va de 00 a 23, pero lo olvidé durante la segunda hora.
user59178
Ahorre dos bytes con saltos de línea físicos.
Titus
2

Bash (3 y 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

Debido al uso de $0, este script debe colocarse en un archivo, no pegarse en un shell bash interactivo.

El primer comando se establece $den 60 guiones; se basa en el hecho de que la primera línea de este script tiene 60 caracteres de longitud. Estos son tres caracteres más cortos que la siguiente mejor cosa que se me ocurrió:

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

Si no desea que esto acabe con su cuadro de PID o memoria, puede agregarlo evalal comienzo de la última línea, lo que generaría estos 95 bytes.

Evan Krall
fuente
Me da el error let: h=09: value too great for base (error token is "09"). El problema es que los ceros iniciales se interpretan como constantes octales, por lo que 09 no es válido.
Nick Matteo
Hrm, eso significa que mi script está roto de varias maneras. Gracias.
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
pLumo
fuente
1
Podría guardar otros 8 bytes eliminando la suspensión, pero no me siento cómodo con un ciclo indefinido mientras se ejecuta en mi computadora sin una suspensión ;-)
pLumo
Algunas optimizaciones: pasar sleep 9a la condición del bucle while; elimine el -frente de M en la cadena de formato en la línea 4. Tampoco necesita usar $ delante de nombres de variables en expresiones aritméticas, por lo que $((60-$m))puede ser$((60-m))
Evan Krall
No estoy seguro de si su matemática en la línea 9 es precisa: h=23; echo $((10#$h+1))imprime 24 para mí.
Evan Krall
¿Qué pasa con 24?
pLumo
Necesito el -M porque $ ((60-08)) da un 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);}

Bastante corto y directo :)

Sygmei
fuente
Wow ... eso es rápido. ¿Algún consejo sobre cómo ejecutar Gura? Acabo de descargar los binarios, pero ejecutar Gura.exey pegar este código me da un error de sintaxis symbol k is not defined.
steenbergh
Olvidé un punto y coma! Puedes intentar ejecutarlo de nuevo :)
Sygmei
1
¿Se actualiza cada minuto? La consola parece ejecutar este código solo una vez ...
steenbergh
Woops, no vi esa parte, ¡debería estar funcionando ahora!
Sygmei
Cuando se actualiza, debe borrar la pantalla o agregar 30 líneas nuevas. Hombre, yo estoy en su caso ...
steenbergh
1

Ok, no he hecho un código de golf en mucho tiempo, así que aquí va mi triste intento :)

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
Ídem
fuente
empalmó los 2 ecos en 1, guardó algunos bytes ... (dormir 9 en lugar de dormir 10 guarda 1 byte: P) jajaja
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]
martín
fuente
1

Procesamiento, 204 200 198 197 bytes

5 bytes guardados gracias a @L. Serné utilizando ternaries más inteligentes

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();}

Esto genera más de 30 líneas nuevas para cada actualización (que tiene lugar cuando se actualiza el marco)

Sin golf

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();
}
Kritixi Lithos
fuente
Cambiar ((i=hour())<10?" ":"")+ia ((i=hour())>9?i:" "+i)ahorraría 2B dos veces ... ¡Buena suerte con más golf!
Lucas
@ L.Serne gracias por el consejo :)
Kritixi Lithos
Otra mejora que podría funcionar: se ((i=hour()+1)>24?i=0:i)>9convierte (i=hour()+1)>9, ya que hourgenera un número en el rango de 0-23, e incluso con 1 agregado a eso, nunca será mayor que 24. Además, debe mover el incremento del iinterior de la condición en el forbucle como hiciste en el último bucle. Debería ahorrar 13B en total.
Lucas
@ L.Serné Para el primer punto, todavía tengo que incluir el ternario porque 23 + 1 en un reloj de 24 horas se convierte en 0 (o al menos eso creo). A continuación, si muevo el incremento del iinterior de la condición del ciclo for, icomenzará como en 1lugar de 0y necesito agregar un byte más i++<=minute()y el bytecount seguirá siendo el mismo. Pero no obstante, gracias por ayudarme a jugar al golf 1 bytes más :)
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;}

Inspirado por las entradas de Seth y Abel, esto generará 0 en lugar de 24 durante la próxima hora, según sea necesario, y usará 30 líneas para borrar la pantalla.

Ahemone
fuente
1

SmileBASIC, 55 bytes

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

Explicación:

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)

Nota: SmileBASIC solo tiene 50 columnas de texto, por lo que no se verá bien ...

12Me21
fuente
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);}

Este código supone que la using System.Threading;línea está incluida.

Clase completa:

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);
    }
}
nurchi
fuente
Esta solución no tiene forma de salir del bucle (el original, comentado, ejecuta el código en un hilo separado), por lo que la Console.ReadKeydeclaración es redundante. La única forma de salir es cerrar la ventana de la consola o Ctrl+Break...
nurchi
Esto es solo un fragmento de código, no un método o programa, también using System.Threading;debe incluirse en el recuento de bytes si lo está utilizando. Lo mismo con Using System;.
TheLethalCoder