Нарисуйте двоичные часы BCD


10

Создайте двоичные часы BCD в ASCII. Как предполагается, он должен отображать время в шести столбцах точек:

Двоичные часы
(источник: Wikimedia Commons )

Каждый столбец представляет собой двоичную цифру, считывающую часы, минуты и секунды слева направо. Часы указаны в 24-часовом формате.

Время для отображения читается из командной строки или из стандартного ввода (в зависимости от того, что подходит лучше). Если пусто, вместо этого следует использовать текущее время.

Размер вывода здесь немного ограничен, и мы можем разместить только две строки текста. Таким образом, вы должны поместить точки только в две строки. Символы ., :и 'пригодится здесь.

вход

Время для отображения в формате ISO-8601, т.е. HH:MM:SSбез дробных секунд. Обязательный 24-часовой формат. Ввод может быть пустым, в этом случае будет использовано текущее время.

Вывод

Две строки с представляют двоичные часы BCD, как на рисунке выше. Длина каждой строки ровно шесть символов, и единственными допустимыми символами являются пробел, точка, двоеточие и апостроф.

победитель

Самый короткий код по количеству байтов выигрывает. В галстуке решение размещено с первыми победами.

Пример ввода 1

 

(Пусто)

Пример вывода 1

     .
''. ::

Пример ввода 2

17:59:20

Пример вывода 2

 ..'  
.:..' 

Пример ввода 3

01:08:01

Пример вывода 3

   '  
 .   .

Ответы:


5

Golfscript (+ ruby ​​/ date) - 46 символов

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

Вы можете заменить `date`на Time.nowпри необходимости (+2 символа).


Я знал, что это было безнадежно даже попробовать Golfscripting ;-)
Joey

5

Рубин, 107 103 99 94 90 символов

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

Обратите внимание, что входные данные не должны содержать перенос строки, поэтому для тестирования решения используйте что-то вроде echo -n "01:08:01" | ruby1.9 bcd.rb.

Чтобы проверить поведение по умолчанию, запустите его с помощью ruby1.9 bcd.rbи введите ^D(т. Е. Литеральный EOF).


Там нет такого понятия, как буквальный EOF! :-)
JB

1
Вы можете сбрить 4 персонажа с помощью Time.now.to_s[11,8].
Ларс Хаугсет

@Lars: изменил, спасибо!
Вентеро

3

Windows PowerShell, 81

Так как я не создавал реализацию при написании задания, я чувствую, что с самого начала тоже могу его сыграть в гольф :-)

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

История:

  • 2011-02-26 23:50 (119) Первая попытка.
  • 2011-02-26 23:55 (108) Вдохновляющее веселье.
  • 2011-02-27 00:03 (102) Оптимизирован выбор первой строки. [Math]::Floorэто слишком долго. Я ненавижу это.
  • 2011-02-27 02:22 (101) Мне не нужна :первая строка.
  • 2011-02-27 02:53    (95) Оптимизировано получение ввода или текущего времени.
  • 2011-03-04 20:36    (88) Осталось только одно объединение. Индексирование каждого необходимого символа (включая разрыв строки) из одной строки.
  • 2011-03-04 20:39    (83) Использование 58вместо того, чтобы :автоматически $_приводить к целому числу - больше не нужно заключать в кавычки :-)
  • 2011-03-04 20:42    (81) Скобки после -joinних больше не нужны.

2

Рубин - 124 символа

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 символов

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

Удобочитаемый:

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
Там нет необходимости делать, - 48когда вы делаете % 4, как48 % 4 == 0
Догберт

@Dogbert: Отлично, спасибо! Это также дало мне идею, что c/4-12короче, чем (c-48)/4... :)
Тимви

2

Golfscript (+ Ruby), 63

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

Еще новичок в Golfscript. Не бей меня.


Есть несколько вещей, которые можно сократить (см. Мой ответ). В зависимости от того, что у вас есть в данный момент, это не входит в мой ответ - скобки могут быть опущены при вызовах функций ruby, ""приводят к ложному, так что вы можете удалить ,\.
Набб

@Nabb: Спасибо. Ну, Вентеро уже сказал мне, что у него до 63, хотя я не мог заставить его рассказать мне, как ;-). Тем не менее, перетаскивание Руби в эту строку через интерполяцию строк кажется чем-то обманным. Я думаю, что я останусь со своим предпочтительным языком ниже и просто попробую обыграть Руби :-)
Джои

хорошо, так как вопрос требовал доступа к текущему времени, это действительно невозможно без обращения к ruby
gnibbler

@gnibbler: я знаю. Тем не менее, это единственная действительно непереносимая особенность Golfscript, и мне не особенно нравится использовать ее из-за этого ;-)
Joey

2

Perl (84)

#! perl -pl
$ _ || = местное время; y /: // d; / \ d {6} /; $ _ = $ &; y / 0-9 / .... '' /; $ _. = "\ n $ & "; y / 0-9 /. ':.': ./

Вы можете сохранить одного персонажа, перейдя "\n$&"на $/.$&- обычный трюк с Perl-гольфом :)
Timwi

@Timwi Я мог бы использовать настоящую новую строку там :)
китайский Perl Goth

2

Python 3, 136 символов

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

Я получаю 137, когда я делаю wc -c. Хорошая работа, хотя. +1
Казарк

1

Python - 201 172 символа

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)

Как насчет: t=raw_input().replace(':','')/ if not t:t=strftime('%H%M%S')- спасает вас 5 символов :)
Тимви

@ Тимви Спасибо за это!
Хуан

1

Луа - 163 160 символов

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 байта

Использование Immediate Window и Cell в [A1]качестве входных данных.

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

Время указывается либо из командной строки, либо из стандартного ввода. Ни то, ни другое здесь не работает.
Джои

Извините, что вы имеете в виду?
перематывать

Это более старая задача с довольно строгим ограничением ввода, и VBA, вероятно, не может обрабатывать ввод, как указано. С точки зрения поставленной задачи этот ответ не решает ее, поскольку он предпочитает игнорировать часть требований.
Джои

1
@remoel, Вы можете улучшить этот ответ, перенеся Ifоператор в [..]нотацию и используя неразрывный пробел вместо обычного пробела в операторе split (Alt + 255), а затем с помощью добавления строк вместо конкатенации строк. Должно выглядеть 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, где первый символ в разделенном утверждении - неразрывный пробел
Тейлор Скотт

1
крутые трюки неразрывного пространства для splitфункции. Узнал новое снова XD Nice! И спасибо! : D
remoel


0

VimScript, 143 символа

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.