Narysuj zegar binarny BCD

10

Utwórz zegar binarny BCD w ASCII. Zgodnie z domniemaniem wyświetla czas w sześciu kolumnach kropek:

Zegar binarny
(źródło: Wikimedia Commons )

Każda kolumna jest cyfrą kodowaną binarnie, odczytuje godziny, minuty i sekundy od lewej do prawej. Godziny podane są w formacie 24-godzinnym.

Czas na wyświetlenie jest odczytywany z wiersza poleceń lub ze standardowego wejścia (w zależności od tego, co bardziej pasuje). Jeśli pusty, zamiast tego należy użyć aktualnego czasu.

Rozmiar wyjściowy jest tutaj nieco ograniczony i możemy zmieścić tylko dwa wiersze tekstu. Musisz więc umieścić kropki tylko w dwóch liniach. Znaki ., :i 'się przydać tutaj.

Wejście

Czas wyświetlania w formacie ISO-8601, tzn. HH:MM:SSBez ułamków sekund. Obowiązkowy format 24-godzinny. Dane wejściowe mogą być puste, w którym to przypadku zostanie wykorzystany aktualny czas.

Wynik

Dwie linie z przedstawiają zegar binarny BCD, jak na powyższym obrazku. Każda linia ma dokładnie sześć znaków, a jedynymi dozwolonymi znakami są spacja, kropka, dwukropek i apostrof.

Zwycięzca

Wygrywa najkrótszy kod bajtowy. W remisie rozwiązanie, które jako pierwsze wygrywa.

Przykładowe dane wejściowe 1

 

(pusty)

Próbka wyjściowa 1

     .
''. ::

Przykładowe wejście 2

17:59:20

Próbka wyjściowa 2

 ..'  
.:..' 

Przykładowe dane wejściowe 3

01:08:01

Próbka wyjściowa 3

   '  
 .   .
Joey
źródło

Odpowiedzi:

5

Golfscript (+ ruby ​​/ date) - 46 znaków

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

Można wymienić `date`z Time.nowrazie potrzeby (+2 znaków).

Nabb
źródło
Wiedziałem, że próba gry w golfa była beznadziejna ;-)
Joey
5

Rubin, 107 103 99 94 90 znaków

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

Zauważ, że dane wejściowe nie powinny zawierać podziału linii, więc aby przetestować rozwiązanie, użyj czegoś takiego echo -n "01:08:01" | ruby1.9 bcd.rb.

Aby przetestować domyślne zachowanie, uruchom je za pomocą ruby1.9 bcd.rbi wprowadź ^D(tj. Dosłowny EOF).

Ventero
źródło
Nie ma czegoś takiego jak dosłowny EOF! :-)
JB
1
Możesz ogolić 4 postacie za pomocą Time.now.to_s[11,8].
Lars Haugseth
@ Lars: Zmieniłem to, dzięki!
Ventero
3

Windows PowerShell, 81

Ponieważ nie stworzyłem implementacji pisząc zadanie, od samego początku czuję, że mogę go zagrać w golfa :-)

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

Historia:

  • 2011-02-26 23:50 (119) Pierwsza próba.
  • 2011-02-26 23:55 (108) Podniecająca zabawa.
  • 2011-02-27 00:03 (102) Zoptymalizowany wybór pierwszego wiersza. [Math]::Floorjest za długie. Nienawidzę tego.
  • 2011-02-27 02:22 (101) Nie potrzebuję :pierwszej linii.
  • 2011-02-27 02:53    (95) Zoptymalizowane pobieranie danych wejściowych lub bieżący czas.
  • 2011-03-04 20:36    (88) Pozostało tylko jedno połączenie. Indeksowanie każdego potrzebnego znaku (w tym podział wiersza) od jednego ciągu.
  • 2011-03-04 20:39    (83) Używanie 58zamiast :automatycznego rzutowania również na liczby całkowite - nie trzeba już dołączać $_cudzysłowów :-)
  • 2011-03-04 20:42    (81) Nawiasy po nawiasach -joinnie są już potrzebne.
Joey
źródło
2

Rubin - 124 znaki

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
źródło
2

DO#

236 znaków

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

Czytelny:

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
źródło
1
Nie musisz tego robić, - 48kiedy to robisz % 4, ponieważ48 % 4 == 0
Dogbert
@Dogbert: Genialnie, dziękuję! To dało mi również pomysł, który c/4-12jest krótszy niż (c-48)/4... :)
Timwi
2

Golfscript (+ Ruby), 63

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

Nadal początkujący z Golfscript. Nie bij mnie.

Joey
źródło
Jest kilka rzeczy do skrócenia (patrz moja odpowiedź). Specyficzne dla tego, co masz w tej chwili, czego nie ma w mojej odpowiedzi - nawiasów można pominąć w wywołaniach funkcji ruby, ""wymusza na false, abyś mógł je usunąć ,\.
Nabb
@Nabb: Dzięki. Cóż, Ventero powiedział mi już, że obniżył go do 63, choć nie mogłem go zmusić, żeby mi powiedział ;-). Mimo to przeciąganie Ruby do interpolacji łańcuchów wydaje się w pewien sposób oszustwem. Myślę, że pozostanę przy moim preferowanym języku poniżej i po prostu spróbuję pokonać Ruby :-)
Joey
no cóż, ponieważ pytanie wymagało dostępu do aktualnego czasu, tak naprawdę nie jest to możliwe bez uciekania się do ruby
gnibbler
@gnibbler: Wiem. Mimo to jest to jedyna naprawdę niemożliwa do przeniesienia funkcja Golfscript i dlatego nie lubię z tego powodu korzystać ;-)
Joey
2

Perl (84)

#! perl -pl
$ _ || = czas lokalny; y /: // d; / \ d {6} /; $ _ = $ &; y / 0-9 / .... '' /; $ _. = "\ n $ & "; y / 0-9 /. ':.': ./
goth perl chiński
źródło
Możesz uratować jedną postać, zmieniając "\n$&"na $/.$&- powszechną sztuczkę Perl-golf :)
Timwi
@Timwi Przydałaby mi się tam prawdziwa nowa linia :)
chiński perl got
2

Python 3, 136 znaków

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
źródło
Dostaję 137, gdy robię wc -c. Dobra robota. +1
Kazark,
1

Python - 201 172 znaków

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
źródło
A co powiesz na: t=raw_input().replace(':','')/ if not t:t=strftime('%H%M%S')- oszczędza ci 5 znaków :)
Timwi
@Timwi Dzięki za to!
Juan
1

Lua - 163 160 znaków

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
źródło
1

VBA (Excel), 150 148 132 bajtów

Używanie natychmiastowego okna i komórki [A1]jako danych wejściowych.

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
źródło
Czas podawany jest z wiersza polecenia lub ze standardowego wejścia. Wydaje się, że żadne z nich tutaj nie działa.
Joey,
Przepraszam, co masz na myśli?
remoel
Jest to starsze zadanie z dość rygorystycznymi ograniczeniami wejściowymi, a VBA prawdopodobnie nie może obsłużyć danych wejściowych tak, jak określono. Pod względem podanego zadania odpowiedź ta nie rozwiązuje problemu, ponieważ zignoruje część wymagań.
Joey,
1
@remoel, Możesz poprawić tę odpowiedź, wprowadzając Ifinstrukcję do [..]notacji i używając niełamliwej spacji zamiast zwykłej spacji w instrukcji split (Alt + 255), a następnie dodając ciąg zamiast konkatenacji ciągu. Powinno to wyglądać 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, gdzie pierwszą postacią w wyrażeniu podzielonym jest nieprzerwana przestrzeń
Taylor Scott
1
fajne sztuczki niezniszczalnej przestrzeni dla splitfunkcji. Ponownie nauczyłem się nowych rzeczy XD Nice! I dzięki! : 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)))}}
nieznany użytkownik
źródło
0

VimScript, 143 znaki

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
źródło