วาดนาฬิกา BCD Binary


10

สร้างนาฬิกาไบนารี BCD ใน ASCII โดยนัยแล้วมันจะแสดงเวลาในคอลัมน์หกจุด:

นาฬิกาไบนารี
(ที่มา: Wikimedia Commons )

แต่ละคอลัมน์เป็นตัวเลขไบนารีรหัสอ่านชั่วโมงนาทีและวินาทีจากซ้ายไปขวา ชั่วโมงถูกกำหนดในรูปแบบ 24 ชั่วโมง

เวลาในการแสดงถูกอ่านจากบรรทัดคำสั่งหรือจาก stdin (แล้วแต่ว่าจะดีกว่า) หากไม่มีข้อมูลควรใช้เวลาปัจจุบันแทน

ขนาดเอาต์พุตมีข้อ จำกัด เล็กน้อยที่นี่และเราสามารถใส่ข้อความสองบรรทัดเท่านั้น ดังนั้นคุณจะต้องใส่จุดลงในสองบรรทัดเท่านั้น ตัวละคร., :และ'เข้ามามีประโยชน์ที่นี่

อินพุต

เวลาที่จะแสดงในรูปแบบ 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]}]*""

โปรดทราบว่าการป้อนข้อมูลที่ไม่ควรมี LINEBREAK 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]ตัวอักษรด้วย
ลาร์ส Haugseth

@ ลาร์ส: เปลี่ยนไปแล้วขอบคุณ!
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

Ruby - 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

ค#

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... :)
##twwi Timwi

2

Golfscript (+ Ruby), 63

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

ยังเป็นผู้เริ่มต้นกับ Golfscript อย่าตีฉัน


มีบางสิ่งที่สั้นลง (ดูคำตอบของฉัน) เฉพาะสิ่งที่คุณมีในขณะนั้นที่ไม่อยู่ในคำตอบของฉัน - สามารถตัดวงเล็บออกจากการเรียกใช้ฟังก์ชัน ruby, ""coerces to false เพื่อให้คุณสามารถลบออก,\ได้
Nabb

@Nabb: ขอบคุณ Ventero ได้บอกฉันแล้วว่าเขาลดเหลือ 63 แต่ฉันไม่สามารถพาเขามาบอกฉันได้ว่า ;-) ถึงกระนั้นการลาก Ruby เข้าไปในสิ่งนี้ผ่านการสอดแทรกสตริงทำให้รู้สึกเหมือนมีการโกงอย่างใด ฉันคิดว่าฉันจะอยู่กับภาษาที่ฉันต้องการด้านล่างและลองเอาชนะ Ruby :-)
Joey

ดีเนื่องจากคำถามต้องมีการเข้าถึงเวลาปัจจุบันมันเป็นไปไม่ได้จริงๆโดยไม่ต้องหันไปใช้ทับทิมต่อไป
gnibbler

@gnibbler: ฉันรู้ ยังคงเป็นคุณสมบัติเดียวที่ไม่สามารถแปลได้จริงๆของ Golfscript และฉันไม่ชอบการใช้งานเป็นพิเศษเนื่องจากมัน ;-)
Joey

2

Perl (84)

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

คุณสามารถบันทึกตัวละครตัวหนึ่งโดยการเปลี่ยน"\n$&"ไป$/.$&- ทั่วไป Perl กอล์ฟเคล็ดลับ :)
Timwi

@Timwi ฉันสามารถใช้การขึ้นบรรทัดใหม่จริงมี :)
Perl จีนชาวเยอรมัน

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 - 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

@ Timwi ขอบคุณสำหรับสิ่งนั้น!
Juan

1

Lua - 163 160 Chars

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 ดูเหมือนว่าจะไม่ทำงานที่นี่
Joey

ฉันขอโทษคุณหมายถึงอะไร
remoel

เป็นงานเก่าที่มีข้อ จำกัด อินพุตค่อนข้างเข้มงวดและ VBA อาจไม่สามารถจัดการอินพุตได้ตามที่ระบุ ในแง่ของงานที่ได้รับคำตอบนี้ไม่ได้แก้มันเพราะมันเลือกที่จะไม่สนใจส่วนหนึ่งของข้อกำหนด
Joey

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นี้ซึ่งตัวอักษรตัวแรกในคำสั่งแยกเป็นช่องว่างที่ไม่แตก
Taylor Scott

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.