画一个BCD二进制时钟


10

用ASCII 创建一个BCD 二进制时钟。如所暗示的,它将以六点点显示时间:

二进制时钟
(来源:Wikimedia Commons

每列都是二进制编码的数字,从左到右读取小时,分钟和秒。小时以24小时格式给出。

显示时间是从命令行或从stdin(以更合适的为准)中读取的。如果为空,则应使用当前时间。

这里的输出大小受到一些限制,我们只能容纳两行文本。因此,您需要将点仅放入两行。字符.:'在方便的来到这里。

输入值

以ISO-8601格式显示的时间,即HH:MM:SS无小数秒。强制性的24小时制。输入可以为空,在这种情况下将使用当前时间。

输出量

上图的两行代表BCD二进制时钟。每行正好是六个字符长,并且只能使用空格,句点,冒号和撇号。

优胜者

以字节数为单位的最短代码获胜。在平局中,解决方案取得了第一个胜利。

样品输入1

 

(空)

样品输出1

     .
''. ::

样品输入2

17:59:20

样品输出2

 ..'  
.:..' 

样品输入3

01:08:01

样品输出3

   '  
 .   .

Answers:


5

Golfscript(+红宝石/日期)-46个字符

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

您可以根据需要替换`date`Time.now(+2个字符)。


我知道即使尝试Golfscripting也无济于事;-)
Joey

5

红宝石, 1071039994 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:更改了,谢谢!
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(+红宝石),63岁

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

还是Golfscript的初学者。别打我


有几件事要缩短(请参阅我的答案)。具体到您目前无法回答的内容-红宝石函数调用中可以省略括号,将其""强制转换为false即可删除,\
Nabb 2011年

@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$&"$/.$&-常见的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
Kazark

1

Python- 201172个字符

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

@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中给出的。似乎都没有在这里工作。
乔伊,

对不起,你是什么意思?
取消

这是一项比较严格的输入限制的较旧任务,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,split语句中的第一个字符是不间断空格
Taylor Scott

1
split功能不间断的绝妙技巧。再次学到新东西XD不错!谢谢!:D
删除

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.