BCD 이진 시계 그리기


10

ASCII 로 BCD 이진 시계 를 만듭니다 . 묵시적으로, 그것은 6 개의 열로 된 시간으로 표시되어야한다 :

이진 시계
(출처 : Wikimedia Commons )

각 열은 왼쪽에서 오른쪽으로 시간, 분 및 초를 읽는 이진 코드 숫자입니다. 시간은 24 시간 형식으로 제공됩니다.

표시 할 시간은 명령 행 또는 stdin (둘 중 더 적합한 것)에서 읽습니다. 비어 있으면 현재 시간을 대신 사용해야합니다.

출력 크기는 여기에 약간 제한되어 있으며 두 줄의 텍스트에만 적합합니다. 따라서 점을 두 줄에만 배치해야합니다. 문자는 ., :그리고 '여기에 편리.

입력

ISO-8601 형식으로 표시하는 시간, 즉 HH:MM:SS소수 초없이 표시됩니다 . 필수 24 시간 형식. 입력이 비어 있으면 현재 시간이 사용됩니다.

산출

위의 이미지에서와 같이 두 줄은 BCD 이진 시계를 나타냅니다. 각 줄은 정확히 6 자이며 공백, 마침표, 콜론 및 아포스트로피 만 허용됩니다.

우승자

바이트 수로 가장 짧은 코드가 이깁니다. 동점으로 솔루션이 첫 승리를 거두었습니다.

샘플 입력 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 Haugseth

@Lars : 고마워요!
Ventero

3

윈도우 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

씨#

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때 할 필요가 없습니다% 448 % 4 == 0
Dogbert

@Dogbert : 훌륭합니다, 감사합니다! 그것은 또한 나 c/4-12보다 짧은 생각을 주었다 (c-48)/4... :)
Timwi

2

골프 스크립트 (+ Ruby), 63

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

아직 Golfscript 초보자입니다. 날 때리지 마


단축해야 할 것이 몇 가지 있습니다 (제 답변 참조). 내 대답에없는 순간에 괄호를 루비 함수 호출에서 생략 ""하고 false로 강제 변환하여 제거 할 수 있습니다 ,\.
Nabb

@ Nabb : 감사합니다. 글쎄, Ventero는 이미 63 세로 줄었다 고 말했지만 어떻게 그에게 ;-) 방법을 알려줄 수는 없었습니다. 그럼에도 불구하고 문자열 보간을 통해 루비를 이것으로 드래그하는 것은 어떻게 든 부정 행위처럼 느껴집니다. 나는 내가 선호하는 언어를 아래에 유지하면서 루비를 이길 것이라고 생각합니다. :-)
Joey

질문에 현재 시간에 대한 액세스가 필요했기 때문에 루비에 의지하지 않고는 실제로 불가능합니다
gnibbler

@gnibbler : 알고 있습니다. 아직도, 그것은 Golfscript의 유일한 이식 불가능한 기능이며 특히 그로 인해 그것을 사용하는 것을 좋아하지 않습니다. ;-)
Joey

2

펄 (84)

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

당신은 변경하여 하나 개의 문자를 저장할 수 "\n$&"$/.$&공통 펄 골프 트릭 : -
Timwi

@Timwi 나는 거기에 실제 줄 바꿈을 사용할 수 있습니다 :)
chinese 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
Kazark

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

@Timwi 감사합니다!
Juan

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 (엑셀) 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분할 문장의 첫 번째 문자가 줄 바꿈하지 않는 공간이고,
테일러 스콧

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.