BCDバイナリクロックを描画する


10

ASCIIでBCD バイナリクロックを作成します。暗黙のとおり、6列のドットで時間を表示します。

バイナリ時計
(出典:ウィキメディア・コモンズ

各列はバイナリコード化された数字で、左から右に時間、分、秒を読み取ります。時間は24時間形式で表示されます。

表示する時間は、コマンドラインまたはstdin(どちらか適切な方)から読み取られます。空の場合は、代わりに現在の時刻を使用する必要があります。

出力サイズはここで少し制限されており、2行のテキストしか収めることができません。したがって、ドットを2行だけに入れる必要があります。文字.:そして'ここに便利になります。

入力

ISO-8601形式で表示する時間HH:MM:SS。つまり、小数秒なし。必須の24時間形式。入力は空にすることができます。その場合、現在の時刻が使用されます。

出力

の2本の線は、上の画像のようにBCDバイナリクロックを表しています。各行は正確に6文字で、使用できる文字はスペース、ピリオド、コロン、アポストロフィのみです。

勝者

バイト数による最短コードが優先されます。引き分けに、ソリューションが最初に勝利しました。

入力例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 Haugseth、2011年

@Lars:変更しました、ありがとう!
Ventero、

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]::Floorwaaaayyが長すぎます。嫌いです。
  • 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

@Dogbert:素晴らしい、ありがとう!それはまた私に... c/4-12より短いアイデアを与えました(c-48)/4:)
Timwi

2

Golfscript(+ Ruby)、63

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

それでもGolfscriptの初心者。殴らないで。


短くすべきことがいくつかあります(私の答えを参照してください)。私の答えにない現時点での固有のもの-括弧はルビ関数呼び出しから省略でき、""false に強制できるので削除できます,\
Nabb

@Nabb:ありがとう。ええと、Venteroはすでに63まで持っていると言っていましたが、私は彼にどのように説明することはできませんでした;-)。それでも、文字列補間によってRubyをこれにドラッグすると、どういうわけか不正行為のように感じられます。私は以下の私の好みの言語にとどまり、Rubyを倒そうとするでしょう:-)
Joey

質問には現在時刻へのアクセスが必要だったので、とにかくルビーに頼らなければ実際には不可能です
ニブラー

@gnibbler:わかっています。それでも、これはGolfscriptの唯一の移植性のない機能であり、そのため特に使用したくありません;-)
Joey

2

パール(84)

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

次のように変更"\n$&"すると、1文字を保存できます$/.$&—一般的な
Perl-

@Timwiそこに実際の改行を使用できます:)
chinese 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文字節約できます:)
ティムウィ'26

@Timwiありがとうございます!
フアン

1

Lua- 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(エクセル)、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から指定されます。ここではどちらも機能しないようです。
Joey

すみません、どういう意味ですか?
remoel

これはかなり厳しい入力制限を持つ古いタスクであり、VBAはおそらく指定された入力を処理できません。与えられたタスクに関して、この回答は要件の一部を無視することを選択するため、それを解決しません。
Joey

1
@remoel、この回答を改善するには、Ifステートメントを[..]表記にして、分割ステートメントで通常のスペースの代わりに改行しないスペースを使用し(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になります。splitステートメントの最初の文字は改行しないスペースです
テイラースコット

1
split機能を壊さないスペースのクールなトリック。新しいことをもう一度学びましたXD Nice!ありがとう!: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文字

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.