Desenhar um relógio binário BCD

10

Crie um relógio binário BCD em ASCII. Como está implícito, deve exibir o tempo em seis colunas de pontos:

Relógio binário
(fonte: Wikimedia Commons )

Cada coluna é um dígito com código binário, que lê horas, minutos e segundos da esquerda para a direita. As horas são fornecidas no formato de 24 horas.

O tempo para exibição é lido na linha de comando ou no stdin (o que couber melhor). Se vazio, a hora atual deve ser usada.

O tamanho da saída é um pouco restrito aqui e só podemos ajustar duas linhas de texto. Portanto, você deve colocar os pontos em apenas duas linhas. Os personagens ., :e 'são úteis aqui.

Entrada

O tempo para exibição no formato ISO-8601, ou seja, HH:MM:SSsem segundos fracionários. Formato obrigatório de 24 horas. A entrada pode estar vazia e, nesse caso, a hora atual será usada.

Resultado

Duas linhas com representam o relógio binário BCD como na imagem acima. Cada linha tem exatamente seis caracteres e os únicos caracteres permitidos são espaço, ponto, dois pontos e apóstrofo.

Vencedora

O código mais curto pela contagem de bytes vence. Em um empate, a solução registrou as primeiras vitórias.

Entrada de amostra 1

 

(esvaziar)

Saída de amostra 1

     .
''. ::

Entrada de amostra 2

17:59:20

Saída de amostra 2

 ..'  
.:..' 

Entrada de amostra 3

01:08:01

Saída de amostra 3

   '  
 .   .
Joey
fonte

Respostas:

5

Golfscript (+ ruby ​​/ data) - 46 caracteres

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

Você pode substituir `date`por, Time.nowse necessário (+2 caracteres).

Nabb
fonte
Eu sabia que era inútil tentar mesmo Golfscripting ;-)
Joey
5

Rubi, 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]}]*""

Observe que a entrada não deve conter uma quebra de linha; portanto, para testar a solução, use algo parecido echo -n "01:08:01" | ruby1.9 bcd.rb.

Para testar o comportamento padrão, execute-o com ruby1.9 bcd.rbe digite ^D(ou seja, um EOF literal).

Ventero
fonte
Não existe um EOF literal! :-)
JB
11
Você pode cortar 4 caracteres com Time.now.to_s[11,8].
Lars Haugseth
@ Lars: Mudou, obrigado!
Ventero
3

Windows PowerShell, 81

Como não criei uma implementação ao escrever a tarefa, também me sinto elegível a jogar desde o início :-)

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

História:

  • 2011-02-26 23:50 (119) Primeira tentativa.
  • 2011-02-26 23:55 (108) Inlining fun.
  • 2011-02-27 00:03 (102) Otimizado selecionando a primeira linha. [Math]::Flooré muito longo. Eu odeio isso.
  • 2011-02-27 02:22 (101) Eu não preciso :da primeira linha.
  • 2011-02-27 02:53    (95) Otimizado para obter entrada ou hora atual.
  • 2011-03-04 20:36    (88) Apenas uma única associação permanece. Indexar todos os caracteres necessários (incluindo a quebra de linha) de uma única sequência.
  • 2011-03-04 20:39    (83) Usando em 58vez de :quais transmissões automáticas para números inteiros também - não há mais necessidade de colocar $_aspas :-)
  • 2011-03-04 20:42    (81) Os parênteses após o -joinnão são mais necessários.
Joey
fonte
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
fonte
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])));}}

Legível:

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
fonte
11
Não há necessidade de fazer - 48quando você está fazendo % 4, como48 % 4 == 0
Dogbert 27/02
@Dogbert: Brilhante, obrigado! Isso também me deu a idéia de que c/4-12é menor do que (c-48)/4... :)
Timwi
2

Script de golfe (+ Ruby), 63

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

Ainda iniciante no Golfscript. Não me bata.

Joey
fonte
Há algumas coisas a serem reduzidas (veja minha resposta). Específico para o que você tem no momento que não está na minha resposta - colchetes podem ser omitidos nas chamadas de função ruby, ""coagidos a falsos para que você possa removê-lo ,\.
Nabb 27/02
@ Nabb: Obrigado. Bem, Ventero já me disse que ele tinha até 63, embora eu não pudesse fazê-lo me dizer como ;-). Ainda assim, arrastar Ruby para isso através da interpolação de cordas parece trapaça, de alguma forma. Eu acho que vou ficar com meu idioma preferido abaixo e apenas tentar bater o Ruby :-)
Joey
bem desde a questão necessário acesso à hora actual, não é realmente possível sem recorrer a rubi de qualquer maneira
gnibbler
@gnibbler: Eu sei. Ainda assim, é a única característica realmente portável de Golfscript e eu não gosto particularmente de usá-lo devido a isso ;-)
Joey
2

Perl (84)

#! perl -pl
$ _ || = hora local; y /: // d; / \ d {6} /; $ _ = $ &; y / 0-9 / .... '' /; $ _. = "\ n $ & "; y / 0-9 /. ':.': ./
gótico chinês do perl
fonte
Você pode salvar um personagem mudando "\n$&"para $/.$&- trick-golf Perl comum :)
Timwi
@Timwi eu poderia usar uma nova linha real lá :)
perl chineses 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
fonte
Recebo 137 quando faço um wc -c. Bom trabalho, tho. +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
fonte
Que tal: t=raw_input().replace(':','')/ if not t:t=strftime('%H%M%S')- poupa 5 caracteres :)
Timwi
@ Timwi Obrigado por isso!
Juan 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
fonte
1

VBA (Excel), 150 148 132 bytes

Usando Janela Imediata e Célula [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
remoel
fonte
O tempo é dado na linha de comando ou no stdin. Nem parece funcionar aqui.
Joey
Me desculpe, o que você quer dizer?
Remoel 19/02/19
É uma tarefa mais antiga com uma restrição de entrada bastante rigorosa e o VBA provavelmente não pode manipular a entrada como especificado. Em termos da tarefa dada, esta resposta não a resolve, pois escolhe ignorar parte dos requisitos.
Joey
11
@remoel, Você pode melhorar esta resposta trazendo a Ifinstrução para a [..]notação e usando um espaço sem quebra em vez de um espaço regular na instrução de divisão (Alt + 255) e, em seguida, usando a adição de strings em vez da concatenação de strings. Deve ser semelhante 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, onde o primeiro caractere na declaração de divisão é o espaço não separável
Taylor Scott
11
truques legais de espaço ininterrupto para a splitfunção. Aprendi coisas novas novamente XD Nice! E obrigado! : D
remoel 20/02/19
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)))}}
Usuário desconhecido
fonte
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
fonte