Disegna un orologio binario BCD


10

Crea un orologio binario BCD in ASCII. Come implicito, deve mostrare il tempo in sei colonne di punti:

Orologio binario
(fonte: Wikimedia Commons )

Ogni colonna è una cifra con codice binario, che legge ore, minuti e secondi da sinistra a destra. Le ore sono indicate nel formato 24 ore.

Il tempo di visualizzazione viene letto dalla riga di comando o dallo stdin (a seconda di quale si adatta meglio). Se vuoto, è necessario utilizzare l'ora corrente.

Le dimensioni dell'output sono un po 'limitate qui e possiamo contenere solo due righe di testo. Quindi ti viene richiesto di mettere i punti in solo due linee. I personaggi ., :e 'torniamo utili qui.

Ingresso

Il tempo di visualizzazione in formato ISO-8601, ovvero HH:MM:SSsenza secondi frazionari. Formato obbligatorio di 24 ore. L'ingresso può essere vuoto, nel qual caso verrà utilizzata l'ora corrente.

Produzione

Due linee con rappresentano l'orologio binario BCD come nell'immagine sopra. Ogni riga ha esattamente sei caratteri e gli unici caratteri ammessi sono spazio, punto, due punti e apostrofo.

Vincitore

Vince il codice più breve per numero di byte. In pareggio, la soluzione ha segnato le prime vittorie.

Esempio di input 1

 

(vuoto)

Uscita campione 1

     .
''. ::

Esempio di input 2

17:59:20

Uscita campione 2

 ..'  
.:..' 

Esempio di input 3

01:08:01

Uscita campione 3

   '  
 .   .

Risposte:


5

Golfscript (+ ruby ​​/ date) - 46 caratteri

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

Puoi sostituirlo `date`con Time.nowse necessario (+2 caratteri).


Sapevo che era addirittura inutile provare Golfscripting ;-)
Joey,

5

Rubino, 107 103 99 94 90 caratteri

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

Si noti che l'input non deve contenere un'interruzione di linea, quindi per testare la soluzione utilizzare qualcosa di simile echo -n "01:08:01" | ruby1.9 bcd.rb.

Per testare il comportamento predefinito, eseguirlo con ruby1.9 bcd.rbe immettere ^D(ovvero un EOF letterale).


Non esiste un EOF letterale! :-)
JB

1
Puoi radere via 4 caratteri con Time.now.to_s[11,8].
Lars Haugseth,

@Lars: cambiato, grazie!
Ventero,

3

Windows PowerShell, 81

Dal momento che non ho creato un'implementazione durante la scrittura dell'attività, mi sento anch'io idoneo a giocarla dall'inizio :-)

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

Storia:

  • 26/02/2011 23:50 (119) Primo tentativo.
  • 26/02/2011 23:55 (108) Divertimento in linea.
  • 27/02/2011 00:03 (102) Ottimizzato selezionando la prima riga. [Math]::Floorè troppo lungo. Odio che.
  • 27/02/2011 02:22 (101) Non ho bisogno :della prima riga.
  • 27/02/2011 02:53    (95) Ottimizzazione dell'ingresso o dell'ora corrente.
  • 2011-03-04 20:36    (88) Rimane un solo join. Indicizzazione di tutti i caratteri necessari (inclusa l'interruzione di riga) da una singola stringa.
  • 2011-03-04 20:39    (83) Usando al 58posto del :quale anche i cast automatici devono essere interi - non è più necessario racchiudere $_tra virgolette :-)
  • 2011-03-04 20:42    (81) Le parentesi dopo il -joinnon sono più necessarie.

2

Rubino - 124 caratteri

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

2

C #

236 caratteri

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

Leggibile:

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

1
Non c'è bisogno di fare - 48quando lo fai % 4, come48 % 4 == 0
Dogbert,

@Dogbert: geniale, grazie! Questo mi ha dato anche l'idea che c/4-12è più breve di (c-48)/4... :)
Timwi,

2

Golfscript (+ Ruby), 63

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

Ancora un principiante con Golfscript. Non colpirmi.


Ci sono alcune cose da abbreviare (vedi la mia risposta). Specifico per quello che hai al momento che non è nella mia risposta - le parentesi possono essere omesse dalle chiamate di funzione ruby, ""costringono a false in modo da poterlo rimuovere ,\.
Nabb,

@Nabb: grazie. Bene, Ventero mi aveva già detto che era arrivato a 63, anche se non potevo portarlo a dirmi come ;-). Tuttavia, trascinare Ruby in questo attraverso l'interpolazione delle stringhe sembra in qualche modo barare. Penso che rimarrò nella mia lingua preferita qui sotto e cercherò di battere Ruby :-)
Joey,

beh, dato che la domanda richiedeva l'accesso all'ora corrente, non è davvero possibile senza ricorrere al rubino comunque
gnibbler,

@gnibbler: lo so. Tuttavia, è l'unica caratteristica davvero inestimabile di Golfscript e non mi piace particolarmente usarlo a causa di quello ;-)
Joey,

2

Perl (84)

#! perl -pl
$ _ || = localtime; y /: // d; / \ d {6} /; $ _ = $ &; y / 0-9 / .... '' /; $ _. = "\ n $ & "; y / 0-9 /. ':.': ./

Puoi salvare un personaggio cambiando "\n$&"in $/.$&- trucco comune Perl-golf :)
Timwi

@Timwi Potrei usare una vera newline lì :)
cinese perl goth

2

Python 3, 136 caratteri

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'))]))

Ottengo 137 quando faccio a wc -c. Ottimo lavoro comunque. +1
Kazark,

1

Python - 201 172 caratteri

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)

Che ne dici di: t=raw_input().replace(':','')/ if not t:t=strftime('%H%M%S')- ti salva 5 caratteri :)
Timwi il

@Timwi Grazie per quello!
Juan,

1

Lua - 163 160 caratteri

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

1

VBA (Excel), 150 148 132 byte

Utilizzo di finestra e cella immediate [A1]come input.

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

Il tempo è dato dalla riga di comando o dallo stdin. Nessuno dei due sembra funzionare qui.
Joey,

Mi dispiace, che vuoi dire?
rimodella il

È un'attività meno recente con una restrizione di input abbastanza rigorosa e VBA probabilmente non può gestire l'input come specificato. In termini di compito assegnato, questa risposta non lo risolve poiché sceglie di ignorare parte dei requisiti.
Joey,

1
@remoel, puoi migliorare questa risposta portando l' Ifistruzione nella [..]notazione e usando uno spazio non interrotto invece di uno spazio regolare nell'istruzione split (Alt + 255), e quindi usando l'aggiunta di stringa anziché la concatenazione di stringhe. Dovrebbe apparire 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, dove il primo personaggio dell'istruzione split è lo spazio non rivoluzionario
Taylor Scott,

1
trucchi interessanti di spazio non-rottura per la splitfunzione. Ho imparato di nuovo cose nuove XD Nice! E grazie! : D
rimuovi il

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

0

VimScript, 143 caratteri

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.