Намалюйте бінарний годинник BCD


10

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

Бінарний годинник
(джерело: Вікісховище )

Кожен стовпець - це двійкова кодована цифра, що читає години, хвилини та секунди зліва направо. Години надаються у форматі 24 години.

Час для відображення зчитується з командного рядка або з stdin (що краще підійде). Якщо порожній, замість цього слід використовувати поточний час.

Розмір виводу тут трохи обмежений, і ми можемо вмістити лише два рядки тексту. Тож вам потрібно поставити крапки лише в два рядки. Персонажі ., :і 'тут стане в нагоді.

Вхідні дані

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

Вихідні дані

Два рядки з позначають бінарний годинник BCD, як на зображенні вище. Кожен рядок має рівно шість символів, і єдині дозволені символи - пробіл, крапка, двокрапка та апостроф.

Переможець

Виграє найкоротший код за кількістю байтів. У поєдинку рішення, яке розміщено першими, виграє.

Зразок введення 1

 

(порожньо)

Вихід вибірки 1

     .
''. ::

Зразок введення 2

17:59:20

Вихід вибірки 2

 ..'  
.:..' 

Зразок введення 3

01:08:01

Вибірка зразка 3

   '  
 .   .

Відповіді:


5

Гольфскрипт (+ рубін / дата) - 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... :)
Timwi

2

Гольфскрипт (+ Рубі), 63

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

Ще початківець з Golfscript. Не вдари мене.


Є кілька речей, які слід скоротити (див. Мою відповідь). Характерно для того, що ви маєте на даний момент, що не відповідає моїй відповіді - дужки можуть бути пропущені під час виклику функцій рубіну, ""примусові до помилкових, щоб ви могли їх видалити ,\.
Набб

@Nabb: Дякую Ну, Вентеро вже сказав мені, що він його знизив до 63, хоча я не міг змусити його сказати, як мені ;-). Але все-таки затягуючи Рубі до цього через струнну інтерполяцію, якимось чином схоже на обман. Я думаю, що я буду дотримуватися моїх бажаних мов нижче і просто спробую перемогти Рубі :-)
Joey

ну оскільки питання вимагає доступу до поточного часу, то не можна реально не вдаватися до рубіну
gnibbler

@gnibbler: Я знаю. І все-таки це єдина справді непередавана функція Golfscript, і я не дуже люблю її використовувати через це ;-)
Joey

2

Perl (84)

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

Ви можете зберегти одного персонажа, перейшовши "\n$&"на $/.$&- загальний трюк Perl-golf :)
Тімві

@Timwi Я міг би використати справжній новий рядок там :)
китайський perl goth

2

Пітон 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

Пітон - 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 персонажів :)
Тімві

@Timwi Дякую за це!
Хуан

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

Використання негайного вікна та комірки [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

Час задається або з командного рядка, або з stdin. Здається, жодне тут не працює.
Джої

Вибачте, що ви маєте на увазі?
remoel

Це більш стара задача з досить жорстким обмеженням введення, і 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

Скала, 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 символи

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.