Dibuja un reloj binario BCD

10

Cree un reloj binario BCD en ASCII. Como está implícito, mostrará el tiempo en seis columnas de puntos:

Reloj binario
(fuente: Wikimedia Commons )

Cada columna es un dígito codificado en binario, que lee horas, minutos y segundos de izquierda a derecha. Las horas se dan en formato de 24 horas.

El tiempo de visualización se lee desde la línea de comandos o desde la entrada estándar (lo que mejor se ajuste). Si está vacío, se debe utilizar la hora actual.

El tamaño de salida está un poco limitado aquí y solo podemos ajustar dos líneas de texto. Por lo tanto, debe colocar los puntos en solo dos líneas. Los personajes ., :y 'son útiles aquí.

Entrada

El tiempo de visualización en formato ISO-8601, es decir, HH:MM:SSsin segundos fraccionarios. Formato obligatorio de 24 horas. La entrada puede estar vacía, en cuyo caso se utilizará la hora actual.

Salida

Dos líneas con representan el reloj binario BCD como en la imagen de arriba. Cada línea tiene exactamente seis caracteres de longitud y los únicos caracteres permitidos son espacio, punto, dos puntos y apóstrofe.

Ganador

El código más corto por conteo de bytes gana. En un empate, la solución obtuvo las primeras victorias.

Entrada de muestra 1

 

(vacío)

Salida de muestra 1

     .
''. ::

Entrada de muestra 2

17:59:20

Salida de muestra 2

 ..'  
.:..' 

Entrada de muestra 3

01:08:01

Salida de muestra 3

   '  
 .   .
Joey
fuente

Respuestas:

5

Golfscript (+ rubí / fecha) - 46 caracteres

"#{`date`}"10>+9<" .':":S-.{4/12-S=}%n@{4%S=}%

Puede reemplazar `date`con Time.nowsi es necesario (+2 caracteres).

Nabb
fuente
Sabía que era inútil probar Golfscripting ;-)
Joey
5

Rubí, 107 103 99 94 90 caracteres

$><<[$/,(gets||Time.now.to_s[11,8]).tr(z=" .':","").bytes.map{|a|$><<z[a/4-12];z[a%4]}]*""

Tenga en cuenta que la entrada no debe contener un salto de línea, por lo que para probar la solución use algo como echo -n "01:08:01" | ruby1.9 bcd.rb.

Para probar el comportamiento predeterminado, ejecútelo ruby1.9 bcd.rbe ingrese ^D(es decir, un EOF literal).

Ventero
fuente
¡No hay tal cosa como un EOF literal! :-)
JB
1
Puedes afeitar a 4 personajes con Time.now.to_s[11,8].
Lars Haugseth
@Lars: ¡Lo cambié, gracias!
Ventero
3

Windows PowerShell, 81

Como no creé una implementación al escribir la tarea, también me siento elegible para jugar golf desde el principio :-)

-join" .':
"[(($d="$(date)$args"[-8..-1]-ne58)|%{($_-band12)/4})+,4+($d|%{$_%4})]

Historia:

  • 2011-02-26 23:50 (119) Primer intento.
  • 2011-02-26 23:55 (108) Diversión en línea.
  • 2011-02-27 00:03 (102) Optimizado seleccionando la primera línea. [Math]::Floores muuuuy largo. Odio eso.
  • 2011-02-27 02:22 (101) No necesito :para la primera línea.
  • 2011-02-27 02:53    (95) Optimizado obteniendo entrada u hora actual.
  • 2011-03-04 20:36    (88) Solo queda una combinación. Indexación de todos los caracteres necesarios (incluido el salto de línea) de una sola cadena.
  • 2011-03-04 20:39    (83) Usando en 58lugar de :qué auto-conversiones también a entero - ya no es necesario encerrar $_entre comillas :-)
  • 2011-03-04 20:42    (81) Los paréntesis después de la -joinya no son necesarios.
Joey
fuente
2

Ruby - 124 caracteres

t=*((i=gets)=="
"? Time.now.strftime('%H%M%S'):i).tr(':
','').bytes
puts (0..1).map{|i|t.map{|_|" .':"[i<1? _/4-12:_%4]}*''}
Dogbert
fuente
2

C#

236 caracteres

using System;using System.Linq;class X{static void Main(){var d=Console.In.ReadToEnd().Replace(":","");for(int i=0;i<2;i++)Console.WriteLine(string.Join("",(d==""?DateTime.Now.ToString("HHmmss"):d).Select(c=>" .':"[i<1?c/4-12:c%4])));}}

Legible:

using System;
using System.Linq;
class X
{
    static void Main()
    {
        var d = Console.In.ReadToEnd().Replace(":", "");
        for (int i = 0; i < 2; i++)
            Console.WriteLine(string.Join("",
                (d == "" ? DateTime.Now.ToString("HHmmss") : d)
                .Select(c => " .':"[i < 1 ? c / 4 - 12 : c % 4])));
    }
}
Timwi
fuente
1
No hay necesidad de hacerlo - 48cuando lo estás haciendo % 4, como48 % 4 == 0
Dogbert
@Dogbert: ¡Genial, gracias! Eso también me dio la idea de que c/4-12es más corta que (c-48)/4... :)
Timwi
2

Golfscript (+ Ruby), 63

."#{Time.now.strftime'%T'}"if':'-:|{4/12-" .':":@\=}%n|{4%@\=}%

Todavía un principiante con Golfscript. No me pegues

Joey
fuente
Hay algunas cosas para acortar (ver mi respuesta). Específico a lo que tiene en este momento que no está en mi respuesta: los corchetes se pueden omitir de las llamadas a la función ruby, ""coacciones a false para que pueda eliminarlas ,\.
Nabb
@Nabb: Gracias. Bueno, Ventero ya me dijo que lo había reducido a 63, aunque no pude traerlo para que me dijera cómo ;-). Aún así, arrastrar a Ruby a esto a través de la interpolación de cuerdas se siente como una trampa, de alguna manera. Creo que me quedaré con mi idioma preferido a continuación y solo trataré de vencer a Ruby :-)
Joey
bueno, ya que la pregunta requería acceso a la hora actual, no es realmente posible sin recurrir al rubí de todos modos
gnibbler
@gnibbler: lo sé. Aún así, es la única característica realmente inportable de Golfscript y no me gusta particularmente usarla debido a eso ;-)
Joey
2

Perl (84)

#! perl -pl
$ _ || = localtime; y /: // d; / \ d {6} /; $ _ = $ &; y / 0-9 / .... '' /; $ _. = "\ n $ & "; y / 0-9 /. ':.': ./
perl chino goth
fuente
Puede guardar un personaje cambiando "\n$&"a $/.$&- truco común de Perl-golf :)
Timwi
@Timwi podría usar una nueva línea real allí :)
chino perl goth
2

Python 3, 136 caracteres

import time
d=input()
for i in(0,1):print(''.join([" .':"[[c>>2,c&3][i]]for c in map(int,d.replace(':','')or time.strftime('%H%M%S'))]))
cemper93
fuente
Tengo 137 cuando hago un wc -c. Buen trabajo aunque. +1
Kazark
1

Python - 201 172 caracteres

from time import*
t=raw_input()
if not t:t=strftime('%H:%M:%S')
t=t.replace(':','')
for i in(0,2):print''.join(" .':"[int(bin(int(d))[2:].rjust(4,'0')[i:i+2],2)]for d in t)
Juan
fuente
¿Qué tal: t=raw_input().replace(':','')/ if not t:t=strftime('%H%M%S')- te ahorra 5 caracteres :)
Timwi
@Timwi ¡Gracias por eso!
Juan
1

Lua - 163 160 caracteres

s=io.read():match"(%S+)"or os.date("%X",os.time())t=" .':"w=io.write for l=1,2 do for k in s:gmatch"(%d)"do y=1+select(l,(k-k%4)/4,k%4)w(t:sub(y,y))end w"\n"end
jpjacobs
fuente
1

VBA (Excel), 150 148 132 bytes

Usando Ventana Inmediata y Celda [A1]como entrada.

a=Format(IIf([a1]="",Now,[a1]),"hhmmss"):b=Split(" ,.,',:",","):For c=1To Len(a):d=Mid(a,c,1):e=e &b(d\4):f=f &b(d Mod 4):Next:?e:?f
remodelar
fuente
El tiempo se da desde la línea de comandos o desde stdin. Ninguno de los dos parece funcionar aquí.
Joey
lo siento, qué quieres decir?
Remoel
Es una tarea anterior con una restricción de entrada bastante estricta y VBA probablemente no pueda manejar la entrada como se especifica. En términos de la tarea dada, esta respuesta no la resuelve, ya que elige ignorar parte de los requisitos.
Joey
1
@remoel, puede mejorar esta respuesta incorporando la Ifdeclaración a la [..]notación, y usando un espacio que no se rompa en lugar de un espacio regular en la declaración dividida (Alt + 255), y luego usando la suma de cadenas en lugar de la concatenación de cadenas. Debería verse como a=Format([IF(A1,A1,NOW())],"hhmmss"):b=Split("  . ' :"):For c=1To Len(a):d=Mid(a,c,1):e=e+b(d\4):f=f+b(d Mod 4):Next:?e:?f, donde el primer personaje en la declaración dividida es el espacio sin interrupciones
Taylor Scott
1
trucos geniales de espacio sin interrupciones para la splitfunción. Aprendí cosas nuevas otra vez XD Nice! ¡Y gracias! : D
remoel
0

Scala, 222:

object C{def main(a:Array[String]){
val t=if(a.length==0)new java.text.SimpleDateFormat("HHmmss").format(new java.util.Date)else a(0).replaceAll(":","")
t.map(c=>print(" ,'"(c/4%4)));println;t.map(c=>print(" ,':"(c%4)))}}
usuario desconocido
fuente
0

VimScript, 143 caracteres

if getline(1)==''
norm"=strftime("%T")^Mp
en
nm- "ax"=@a/4^MgP
nm, "ax"=@a%4^MgP
norm0YP--x--x--xP^M,,x,,x,,xP
%s/0/ /g
%s/1/./g
%s/2/'/g
%s/3/:/g
Kazark
fuente