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

   '  
 .   .

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 .


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


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.

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]}*''}

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

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.


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 /. ':.': ./

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

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)

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

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.