Zeichnen Sie eine BCD-Binäruhr

10

Erstellen Sie eine BCD- Binäruhr in ASCII. Wie impliziert, soll die Zeit in sechs Punktspalten angezeigt werden:

Binäre Uhr
(Quelle: Wikimedia Commons )

Jede Spalte ist eine binär codierte Ziffer, die Stunden, Minuten und Sekunden von links nach rechts liest. Die Stunden werden im 24-Stunden-Format angegeben.

Die Anzeigezeit wird von der Befehlszeile oder von stdin gelesen (je nachdem, was besser passt). Wenn leer, sollte stattdessen die aktuelle Zeit verwendet werden.

Die Ausgabegröße ist hier etwas eingeschränkt und wir können nur zwei Textzeilen anpassen. Sie müssen die Punkte also nur in zwei Zeilen einfügen. Die Charaktere ., :und 'kommen hier praktisch.

Eingang

Die Zeit für die Anzeige im ISO-8601-Format, dh HH:MM:SSohne Sekundenbruchteil. Obligatorisches 24-Stunden-Format. Der Eingang kann leer sein. In diesem Fall wird die aktuelle Zeit verwendet.

Ausgabe

Zwei Zeilen mit repräsentieren den BCD-Binärtakt wie im obigen Bild. Jede Zeile ist genau sechs Zeichen lang und die einzigen zulässigen Zeichen sind Leerzeichen, Punkt, Doppelpunkt und Apostroph.

Gewinner

Die kürzeste Anzahl von Code pro Byte gewinnt. Bei einem Unentschieden gewinnt die Lösung zuerst.

Probeneingabe 1

 

(leeren)

Beispielausgabe 1

     .
''. ::

Probeneingabe 2

17:59:20

Beispielausgabe 2

 ..'  
.:..' 

Probeneingabe 3

01:08:01

Beispielausgabe 3

   '  
 .   .
Joey
quelle

Antworten:

5

Golfscript (+ Rubin / Datum) - 46 Zeichen

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

Sie können `date`bei Time.nowBedarf durch (+2 Zeichen) ersetzen .

Nabb
quelle
Ich wusste, dass es hoffnungslos war, Golfscripting überhaupt zu versuchen ;-)
Joey
5

Rubin, 107 103 99 94 90 Zeichen

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

Beachten Sie, dass die Eingabe keinen Zeilenumbruch enthalten sollte. Verwenden Sie zum Testen der Lösung beispielsweise Folgendes echo -n "01:08:01" | ruby1.9 bcd.rb.

Um das Standardverhalten zu testen, führen Sie es mit aus ruby1.9 bcd.rbund geben Sie es ein ^D(dh einen wörtlichen EOF).

Ventero
quelle
Es gibt keine wörtliche EOF! :-)
JB
1
Sie können 4 Zeichen mit rasieren Time.now.to_s[11,8].
Lars Haugseth
@Lars: Geändert, danke!
Ventero
3

Windows PowerShell, 81

Da ich beim Schreiben der Aufgabe keine Implementierung erstellt habe, fühle ich mich auch von Anfang an berechtigt, Golf zu spielen :-)

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

Geschichte:

  • 2011-02-26 23:50 (119) Erster Versuch.
  • 2011-02-26 23:55 (108) Inlining Spaß.
  • 2011-02-27 00:03 (102) Die Auswahl der ersten Zeile wurde optimiert. [Math]::Floorist waaaayy zu lang. Ich hasse, dass.
  • 2011-02-27 02:22 (101) Ich brauche nicht :für die erste Zeile.
  • 2011-02-27 02:53    (95) Optimierte Eingabe oder aktuelle Zeit.
  • 2011-03-04 20:36    (88) Es bleibt nur ein einziger Join übrig. Indizieren aller benötigten Zeichen (einschließlich des Zeilenumbruchs) aus einer einzelnen Zeichenfolge.
  • 2011-03-04 20:39    (83) Verwenden von 58anstelle der :automatischen Umwandlung in eine Ganzzahl - keine $_Anführungszeichen mehr erforderlich :-)
  • 2011-03-04 20:42    (81) Die Klammern nach dem -joinsind nicht mehr erforderlich.
Joey
quelle
2

Ruby - 124 Zeichen

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
quelle
2

C #

236 Zeichen

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

Lesbar:

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
quelle
1
Es gibt keine Notwendigkeit zu tun, - 48wenn Sie tun % 4, wie48 % 4 == 0
Dogbert
@ Dogbert: Genial, danke! Das gab mir auch die Idee, dass c/4-12kürzer ist als (c-48)/4... :)
Timwi
2

Golfscript (+ Ruby), 63

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

Noch ein Anfänger mit Golfscript. Schlag mich nicht.

Joey
quelle
Es gibt ein paar Dinge zu verkürzen (siehe meine Antwort). Speziell für das, was Sie im Moment haben, das nicht in meiner Antwort enthalten ist - Klammern können in Ruby-Funktionsaufrufen weggelassen werden, ""zwingen zu false, damit Sie sie entfernen können ,\.
Nabb
@Nabb: Danke. Nun, Ventero hat mir bereits gesagt, dass er es auf 63 reduziert hat, obwohl ich ihn nicht dazu bringen konnte, mir zu sagen, wie ;-). Trotzdem fühlt sich das Ziehen von Ruby durch die String-Interpolation irgendwie wie Betrug an. Ich denke, ich werde bei meiner bevorzugten Sprache unten bleiben und einfach versuchen, Ruby zu schlagen :-)
Joey
Nun,
@ Gnibbler: Ich weiß. Trotzdem ist es das einzige wirklich unportable Feature von Golfscript und ich mag es aus diesem Grund nicht besonders ;-)
Joey
2

Perl (84)

#! perl -pl
$ _ || = Ortszeit; y /: // d; / \ d {6} /; $ _ = $ &; y / 0-9 / .... '' /; $ _. = "\ n $ & "; y / 0-9 /. ':.': ./
chinesisches perl goth
quelle
Sie können einen Charakter speichern, indem Sie "\n$&"zu $/.$&- üblicher Perl-Golf-Trick :)
Timwi
@ Timwi Ich könnte dort eine echte Newline verwenden :)
Perl Goth
2

Python 3, 136 Zeichen

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
quelle
Ich bekomme 137, wenn ich a mache wc -c. Gute Arbeit tho. +1
Kazark
1

Python - 201 172 Zeichen

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
quelle
Wie wäre es mit: t=raw_input().replace(':','')/ if not t:t=strftime('%H%M%S')- spart Ihnen 5 Zeichen :)
Timwi
@ Timwi Danke dafür!
Juan
1

Lua - 163 160 Zeichen

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
quelle
1

VBA (Excel), 150 148 132 Bytes

Verwenden von Sofortfenster und Zelle [A1]als Eingabe.

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
quelle
Die Zeit wird entweder über die Befehlszeile oder über stdin angegeben. Beides scheint hier nicht zu funktionieren.
Joey
Tut mir leid, was meinen Sie?
Remoel
Es ist eine ältere Aufgabe mit einer ziemlich strengen Eingabebeschränkung, und VBA kann Eingaben wahrscheinlich nicht wie angegeben verarbeiten. In Bezug auf die gegebene Aufgabe löst diese Antwort sie nicht, da sie einen Teil der Anforderungen ignoriert.
Joey
1
@remoel, Sie können diese Antwort verbessern, indem Sie die IfAnweisung in die [..]Notation einfügen und ein nicht unterbrechendes Leerzeichen anstelle eines regulären Leerzeichens in der geteilten Anweisung (Alt + 255) verwenden und dann anstelle der Zeichenfolgenverkettung die Zeichenfolgenaddition verwenden. Sollte so aussehen 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, wo das erste Zeichen in der Split-Anweisung das nicht unterbrechende Leerzeichen ist
Taylor Scott
1
coole Tricks von ununterbrochenem Raum für splitFunktion. Wieder neue Dinge gelernt XD Schön! Und danke! : 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)))}}
Benutzer unbekannt
quelle
0

VimScript, 143 Zeichen

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
quelle