Vẽ đồng hồ nhị phân BCD


10

Tạo đồng hồ nhị phân BCD trong ASCII. Theo ngụ ý, nó sẽ hiển thị thời gian trong sáu cột dấu chấm:

Đồng hồ nhị phân
(nguồn: Wikimedia Commons )

Mỗi cột là một chữ số được mã hóa nhị phân, đọc giờ, phút và giây từ trái sang phải. Giờ được đưa ra trong định dạng 24 giờ.

Thời gian để hiển thị được đọc từ dòng lệnh hoặc từ stdin (tùy theo điều kiện nào phù hợp hơn). Nếu trống, thời gian hiện tại nên được sử dụng thay thế.

Kích thước đầu ra là một chút hạn chế ở đây và chúng tôi chỉ có thể phù hợp với hai dòng văn bản. Vì vậy, bạn được yêu cầu đặt các dấu chấm chỉ trong hai dòng. Các nhân vật ., :'có ích ở đây.

Đầu vào

Thời gian để hiển thị ở định dạng ISO-8601, tức là HH:MM:SSkhông có giây. Định dạng bắt buộc 24 giờ. Đầu vào có thể trống trong trường hợp thời gian hiện tại sẽ được sử dụng.

Đầu ra

Hai dòng đại diện cho đồng hồ nhị phân BCD như trong hình trên. Mỗi dòng dài chính xác sáu ký tự và các ký tự được phép duy nhất là không gian, dấu chấm, dấu hai chấm và dấu nháy đơn.

Người chiến thắng

Mã ngắn nhất bằng số byte thắng. Trong một tie, giải pháp đăng đầu tiên chiến thắng.

Mẫu đầu vào 1

 

(trống)

Sản lượng mẫu 1

     .
''. ::

Mẫu đầu vào 2

17:59:20

Sản lượng mẫu 2

 ..'  
.:..' 

Mẫu đầu vào 3

01:08:01

Sản lượng mẫu 3

   '  
 .   .

Câu trả lời:


5

Golfscript (+ ruby ​​/ ngày) - 46 ký tự

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

Bạn có thể thay thế `date`bằng Time.nownếu cần thiết (+2 ký tự).


Tôi biết rằng thật vô vọng khi thử chơi Golfscripting ;-)
Joey

5

Hồng ngọc 107 103 99 94 90 ký tự

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

Lưu ý rằng đầu vào không nên chứa ngắt dòng, vì vậy để kiểm tra giải pháp sử dụng một cái gì đó như echo -n "01:08:01" | ruby1.9 bcd.rb.

Để kiểm tra hành vi mặc định, hãy chạy nó ruby1.9 bcd.rbvà nhập ^D(tức là EOF theo nghĩa đen).


Không có thứ gọi là EOF theo nghĩa đen! :-)
JB

1
Bạn có thể cạo 4 ký tự với Time.now.to_s[11,8].
Lars Haugseth

@Lars: Thay đổi nó, cảm ơn!
Ventero

3

Windows PowerShell, 81

Vì tôi đã không tạo ra một triển khai khi viết tác vụ, tôi cảm thấy bản thân đủ điều kiện để chơi nó ngay từ đầu :-)

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

Lịch sử:

  • 2011 / 02-26 23:50 (119) Nỗ lực đầu tiên.
  • 2011 / 02-26 23:55 (108) Vui chơi nội tuyến.
  • 2011 / 02-27 00:03 (102) Tối ưu hóa chọn dòng đầu tiên. [Math]::FloorLà waaaayy quá lâu. Tôi ghét điều đó.
  • 2011 / 02-27 02:22 (101) Tôi không cần :cho dòng đầu tiên.
  • 2011 / 02-27 02:53    (95) Tối ưu hóa nhận đầu vào hoặc thời gian hiện tại.
  • 2011/03/04 20:36    (88) Chỉ còn một lần tham gia. Lập chỉ mục cho mỗi ký tự cần thiết (bao gồm cả ngắt dòng) từ một chuỗi.
  • 2011/03/04 20:39    (83) Sử dụng 58thay vì :tự động chuyển thành số nguyên - không cần thêm $_vào dấu ngoặc kép :-)
  • 2011/03/04 20:42    (81) Dấu ngoặc sau -joinkhông còn cần thiết.

2

Ruby - 124 ký tự

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 ký tự

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

Có thể đọc được

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
Không cần phải làm gì - 48khi bạn đang làm % 4, như48 % 4 == 0
Dogbert

@Dogbert: Rực rỡ, cảm ơn bạn! Điều đó cũng cho tôi ý tưởng c/4-12ngắn hơn (c-48)/4... :)
Timwi

2

Golf (+ Ruby), 63

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

Vẫn là người mới bắt đầu với Golfscript. Đừng đánh tôi.


Có một vài điều cần rút ngắn (xem câu trả lời của tôi). Cụ thể với những gì bạn có tại thời điểm không có trong câu trả lời của tôi - dấu ngoặc có thể được bỏ qua khỏi các lệnh gọi hàm ruby, ""ép buộc thành sai để bạn có thể xóa ,\.
Nabb

@Nabb: Cảm ơn. Chà, Ventero đã nói với tôi rằng anh ta đã giảm xuống còn 63, mặc dù tôi không thể mang anh ta đến cho tôi biết làm thế nào ;-). Tuy nhiên, việc kéo Ruby vào điều này thông qua phép nội suy chuỗi có cảm giác như gian lận, bằng cách nào đó. Tôi nghĩ rằng tôi sẽ ở lại với ngôn ngữ ưa thích của mình bên dưới và chỉ cần cố gắng đánh bại Ruby :-)
Joey

tốt vì câu hỏi yêu cầu quyền truy cập vào thời điểm hiện tại, dù sao đi nữa cũng không thể dùng đến ruby
gnibbler

@gnibbler: Tôi biết. Tuy nhiên, đây là tính năng thực sự không thể phát hiện được của Golfscript và tôi không đặc biệt thích sử dụng nó vì điều đó ;-)
Joey

2

Perl (84)

#! perl -pl
$ _ || = giờ địa phương; y /: // d; / \ d {6} /; $ _ = $ &; y / 0-9 / .... '' /; $ _. = "\ n $ & "; y / 0-9 /. ':.': ./

Bạn có thể lưu một nhân vật bằng cách thay đổi "\n$&"thành $/.$&- trò lừa Perl-golf thông thường :)
Timwi

@Timwi Tôi có thể sử dụng một dòng mới thực sự ở đó :)
tiếng Trung Quốc perl goth

2

Python 3, 136 ký tự

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

Tôi nhận được 137 khi tôi làm a wc -c. Làm tốt tho. +1
Kazark

1

Python - 201 172 ký tự

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)

Làm thế nào về: t=raw_input().replace(':','') / if not t:t=strftime('%H%M%S')- tiết kiệm cho bạn 5 ký tự :)
Timwi

@Timwi Cảm ơn vì điều đó!
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 byte

Sử dụng ngay lập tức Window và Cell [A1]làm đầu vào.

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

Thời gian được đưa ra hoặc từ dòng lệnh hoặc từ stdin. Không có vẻ làm việc ở đây.
Joey

Tôi xin lỗi, ý bạn là gì?
lại

Đây là một nhiệm vụ cũ hơn với một hạn chế đầu vào khá nghiêm ngặt và VBA có thể không thể xử lý đầu vào như được chỉ định. Về mặt nhiệm vụ được đưa ra, câu trả lời này không giải quyết được vì nó chọn bỏ qua một phần của các yêu cầu.
Joey

1
@remoel, Bạn có thể cải thiện câu trả lời này bằng cách đưa Ifcâu lệnh vào [..]ký hiệu và sử dụng khoảng trắng không phá vỡ thay vì khoảng trắng thông thường trong câu lệnh phân tách (Alt + 255), sau đó bằng cách sử dụng phép cộng chuỗi thay vì nối chuỗi. Sẽ giống như 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, trong đó nhân vật đầu tiên trong tuyên bố chia tách là không gian không phá vỡ
Taylor Scott

1
thủ thuật mát mẻ của không gian phá vỡ cho splitchức năng. Đã học những điều mới một lần nữa XD Đẹp! Và cảm ơn! : D
làm lại

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 ký tự

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.