Bir BCD İkili saat çizin


10

ASCII'de bir BCD ikili saati oluşturun . Belirtildiği gibi, zamanı altı nokta sütununda görüntüler:

İkili Saat
(kaynak: Wikimedia Commons )

Her sütun ikili kodlu bir rakamdır, soldan sağa saat, dakika ve saniye olarak okunur. Saatler 24 saat formatında verilir.

Görüntülenme süresi komut satırından veya stdin'den (hangisi daha iyi uyarsa) okunur. Boşsa, bunun yerine geçerli saat kullanılmalıdır.

Çıktı boyutu burada biraz kısıtlıdır ve yalnızca iki satır metin sığdırabiliriz. Yani noktaları sadece iki satıra koymanız gerekiyor. Karakterler ., :ve 'burada kullanışlı.

Giriş

ISO-8601 biçiminde, yani HH:MM:SSkesirli saniye olmadan görüntülenme süresi . Zorunlu 24 saat biçimi. Giriş boş olabilir, bu durumda geçerli saat kullanılır.

Çıktı

İki çizgi yukarıdaki resimde olduğu gibi BCD ikili saatini temsil eder. Her satır tam olarak altı karakter uzunluğundadır ve izin verilen tek karakter boşluk, nokta, iki nokta üst üste ve kesme işaretidir.

kazanan

En kısa kod bayt sayısı kazanır. Beraberlikte, ilk gönderilen çözüm kazanır.

Örnek giriş 1

 

(boş)

Örnek çıktı 1

     .
''. ::

Örnek giriş 2

17:59:20

Örnek çıktı 2

 ..'  
.:..' 

Örnek giriş 3

01:08:01

Örnek çıktı 3

   '  
 .   .

Yanıtlar:


5

Golfscript (+ yakut / tarih) - 46 karakter

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

Sen yerini alabilir `date`ile Time.nowgerekirse (2 karakter).


Golfscripting ;-) denemenin umutsuz olduğunu biliyordum
Joey

5

Yakut, 107103 99 94 90 karakter

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

Girişin bir satır sonu içermemesi gerektiğini unutmayın, bu nedenle çözümü test etmek için benzer bir şey kullanın echo -n "01:08:01" | ruby1.9 bcd.rb.

Varsayılan davranışı test etmek için, ile çalıştırın ruby1.9 bcd.rbve girin ^D(örneğin bir değişmez EOF).


Gerçek EOF diye bir şey yoktur! :-)
JB

1
İle 4 karakter tıraş edebilirsiniz Time.now.to_s[11,8].
Lars Haugseth

@Lars: Değişti, teşekkürler!
Ventero

3

Windows PowerShell, 81

Görevi yazarken bir uygulama oluşturmadığım için kendimi de başlangıçtan itibaren golf oynamaya uygun hissediyorum :-)

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

Tarih:

  • 2011-02-26 23:50 (119) İlk deneme.
  • 2011-02-26 23:55 (108) Inlining eğlence.
  • 2011-02-27 00:03 (102) İlk satırı seçerek optimize edildi. [Math]::Floorçok uzun. Bundan nefret ediyorum.
  • 2011-02-27 02:22 (101): İlk satıra ihtiyacım yok .
  • 2011-02-27 02:53    (95) Optimize edilmiş giriş veya geçerli zaman alma.
  • 2011-03-04 20:36    (88) Sadece tek bir birleşim kaldı. Tek bir dizeden gereken her karakteri (satır sonu dahil) dizine ekleme.
  • 2011-03-04 20:39    (83) kullanılarak 58yerine :hangi tamsayıya otomatik kalıplar gibi - en fazla ihtiyaç kapatılması için $_tırnak :-)
  • 2011-03-04 20:42 (81) Sonrasında    parantez -joinartık gerekli değil.

2

Yakut - 124 karakter

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 karakter

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

Okunabilir:

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
- 48Yaparken gerek yok % 4, as48 % 4 == 0
Dogbert

@Dogbert: Harika, teşekkürler! Bu da bana c/4-12daha kısa bir fikir verdi (c-48)/4... :)
Timwi

2

Golf Yazıları (+ Ruby), 63

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

Hala Golfscript ile yeni başlayan. Bana vurma.


Kısaltmak için birkaç şey var (cevabımı görün). Şu anda cevabımda olmayanlara özel - köşeli parantezler yakut işlev çağrılarından çıkarılabilir "", kaldırabilmek için false olur, böylece kaldırabilirsiniz ,\.
Nabb

@ Nabb: Teşekkürler. Ventero zaten 63'e indirdiğini söylemişti, ancak bana nasıl ;-) anlatmasını getiremedim. Yine de, Ruby'yi dize enterpolasyonu içine sürüklemek bir şekilde hile gibi geliyor. Aşağıda tercih ettiğim dil ile kalacağım ve sadece Ruby'yi yenmeye çalışacağım :-)
Joey

soru şu anki saate erişim gerektirdiğinden, yine de yakut başvurmadan gerçekten mümkün değil
gnibbler

@gnibbler: Biliyorum. Yine de, Golfscript'in gerçekten gerçekten taşınmaz tek özelliği ve özellikle bu nedenle kullanmayı sevmiyorum ;-)
Joey

2

Perl (84)

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

Sen değiştirerek bir karakter kaydedebilirsiniz "\n$&"için $/.$&ortak Perl golf hile :) -
Timwi

@Timwi Orada gerçek bir satırsonu kullanabilirsiniz :)
Çin perl goth

2

Python 3, 136 karakter

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

Yaptığımda 137 olsun wc -c. İyi iş tho. +1
Kazark

1

Python - 201 172 karakter

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)

Nasıl olur: t=raw_input().replace(':','')/ if not t:t=strftime('%H%M%S')- size 5 karakter kazandırır :)
Timwi

@Timwi Bunun için teşekkürler!
Juan

1

Lua - 163 160 Karakter

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 bayt

Anlık Pencere ve Hücreyi [A1]giriş olarak kullanma .

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

Zaman, komut satırından veya stdin'den verilir. İkisi de burada işe yaramıyor.
Joey

Pardon, Neyi kastettiniz?
remoel

Oldukça katı bir giriş kısıtlaması olan eski bir görevdir ve VBA muhtemelen belirtildiği gibi girişi işleyemez. Verilen görev açısından, bu cevap, gereksinimlerin bir kısmını görmezden gelmeyi seçtiği için onu çözmez.
Joey

1
@remoel, Ififadeyi [..]gösterime getirerek ve split deyiminde (Alt + 255) normal boşluk yerine kırılmayan bir boşluk kullanarak ve sonra dize birleştirmesi yerine dize eklemesi kullanarak bu yanıtı geliştirebilirsiniz . 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:?fBölünmüş ifadedeki ilk karakterin kırılmaz alan olduğu gibi görünmeli
Taylor Scott

1
splitfonksiyon için kırılmaz alan serin hileler . Yine yeni şeyler öğrendim XD Nice! Ve teşekkürler! : 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 karakter

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.