Gambar Binary Binary clock

10

Buat jam biner BCD di ASCII. Seperti tersirat, itu akan menampilkan waktu dalam enam kolom titik:

Jam Biner
(sumber: Wikimedia Commons )

Setiap kolom adalah digit kode biner, jam baca, menit, dan detik dari kiri ke kanan. Jam diberikan dalam format 24 jam.

Waktu untuk menampilkan dibaca dari baris perintah atau dari stdin (mana yang lebih baik). Jika kosong, waktu saat ini seharusnya digunakan.

Ukuran output sedikit dibatasi di sini dan kami hanya dapat memuat dua baris teks. Jadi, Anda diminta untuk menempatkan titik-titik hanya dalam dua garis. Karakter ., :dan 'berguna di sini.

Memasukkan

Waktu untuk menampilkan dalam format ISO-8601, yaitu HH:MM:SStanpa pecahan detik. Wajib format 24 jam. Input dapat kosong dalam hal ini waktu saat ini akan digunakan.

Keluaran

Dua baris dengan mewakili jam biner BCD seperti pada gambar di atas. Setiap baris tepat enam karakter panjangnya dan satu-satunya karakter yang diizinkan adalah spasi, titik, titik dua dan tanda kutip.

Pemenang

Kode terpendek dengan jumlah byte menang. Dalam seri, solusi diposting kemenangan pertama.

Masukan sampel 1

 

(kosong)

Output sampel 1

     .
''. ::

Masukan sampel 2

17:59:20

Output sampel 2

 ..'  
.:..' 

Masukan sampel 3

01:08:01

Keluaran sampel 3

   '  
 .   .
Joey
sumber

Jawaban:

5

Golfscript (+ ruby ​​/ date) - 46 karakter

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

Anda dapat mengganti `date`dengan Time.nowjika perlu (+2 karakter).

Nabb
sumber
Saya tahu tidak ada gunanya untuk bahkan mencoba Golfscripting ;-)
Joey
5

Rubi, 107 103 99 94 90 karakter

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

Perhatikan bahwa input tidak boleh mengandung linebreak, jadi untuk menguji solusinya gunakan sesuatu seperti echo -n "01:08:01" | ruby1.9 bcd.rb.

Untuk menguji perilaku default, jalankan dengan ruby1.9 bcd.rbdan masukkan ^D(yaitu EOF literal).

Ventero
sumber
Tidak ada yang namanya EOF literal! :-)
JB
1
Anda dapat mencukur 4 karakter dengan Time.now.to_s[11,8].
Lars Haugseth
@ Lars: Mengubahnya, terima kasih!
Ventero
3

Windows PowerShell, 81

Karena saya tidak membuat implementasi saat menulis tugas, saya merasa diri saya memenuhi syarat untuk golf sejak awal, juga :-)

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

Sejarah:

  • 2011-02-26 23:50 (119) Upaya pertama.
  • 2011-02-26 23:55 (108) Menyenangkan menyenangkan.
  • 2011-02-27 00:03 (102) Dioptimalkan memilih baris pertama. [Math]::Floorwaaaayy terlalu lama. Aku benci itu.
  • 2011-02-27 02:22 (101) Saya tidak perlu :untuk baris pertama.
  • 2011-02-27 02:53    (95) Dioptimalkan mendapatkan input atau waktu saat ini.
  • 2011-03-04 20:36    (88) Hanya satu gabung yang tersisa. Mengindeks setiap karakter yang dibutuhkan (termasuk pemisah baris) dari satu string.
  • 2011-03-04 20:39    (83) Menggunakan 58alih-alih :auto-cast untuk integer juga - tidak perlu lagi menyertakan $_tanda kutip :-)
  • 2011-03-04 20:42    (81) Tanda kurung setelah -jointidak lagi diperlukan.
Joey
sumber
2

Ruby - 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]}*''}
Dogbert
sumber
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])));}}

Dapat dibaca:

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])));
    }
}
Timwi
sumber
1
Tidak perlu dilakukan - 48saat Anda melakukannya % 4, karena48 % 4 == 0
Dogbert
@Dogbert: Brilian, terima kasih! Itu juga memberi saya ide yang c/4-12lebih pendek dari (c-48)/4... :)
Timwi
2

Golfscript (+ Ruby), 63

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

Masih pemula dengan Golfscript. Jangan pukul aku.

Joey
sumber
Ada beberapa hal yang perlu dipersingkat (lihat jawaban saya). Khusus untuk apa yang Anda miliki saat ini yang tidak ada dalam jawaban saya - tanda kurung dapat dihilangkan dari panggilan fungsi ruby, ""dipaksa ke false sehingga Anda dapat menghapus ,\.
Nabb
@Nabb: Terima kasih. Yah, Ventero sudah bilang dia turun ke 63, meskipun saya tidak bisa membawanya untuk memberi tahu saya bagaimana ;-). Namun, menyeret Ruby ke dalam ini melalui interpolasi string terasa seperti curang, entah bagaimana. Saya pikir saya akan tetap dengan bahasa pilihan saya di bawah dan hanya mencoba untuk mengalahkan Ruby :-)
Joey
baik karena pertanyaan itu memerlukan akses ke waktu saat ini, itu tidak mungkin tanpa menggunakan ruby
gnibbler
@gnibbler: Saya tahu. Tetap saja, itu satu-satunya fitur Golfscript yang benar-benar tidak dapat digerakkan dan saya tidak terlalu suka menggunakannya karena itu ;-)
Joey
2

Perl (84)

#! perl -pl
$ _ || = localtime; y /: // d; / \ d {6} /; $ _ = $ &; y / 0-9 / .... '' /; $ _. = "\ n $ & "; y / 0-9 /. ':.': ./
perl Cina goth
sumber
Anda dapat menyimpan satu karakter dengan mengubah "\n$&"ke $/.$&- trik umum Perl-golf :)
Timwi
@Timwi Saya bisa menggunakan baris baru yang sebenarnya di sana :)
Chinese gothic
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'))]))
cemper93
sumber
Saya mendapatkan 137 ketika saya melakukan a wc -c. Kerja bagus ya. +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)
Juan
sumber
Bagaimana dengan: t=raw_input().replace(':','')/ if not t:t=strftime('%H%M%S')- menghemat 5 karakter :)
Timwi
@Timwi Terima kasih untuk itu!
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
jpjacobs
sumber
1

VBA (Excel), 150 148 132 byte

Menggunakan Jendela dan Sel Segera [A1]sebagai input.

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
remoel
sumber
Waktu diberikan baik dari baris perintah atau dari stdin. Tampaknya tidak ada yang berfungsi di sini.
Joey
Maaf, apa maksudmu
Remoel
Ini tugas yang lebih lama dengan batasan input yang cukup ketat dan VBA mungkin tidak dapat menangani input seperti yang ditentukan. Dalam hal tugas yang diberikan, jawaban ini tidak menyelesaikannya karena ia memilih untuk mengabaikan sebagian persyaratan.
Joey
1
@remoel, Anda dapat meningkatkan jawaban ini dengan membawa Ifpernyataan ke dalam [..]notasi, dan menggunakan ruang non-breaking alih-alih ruang biasa dalam pernyataan split (Alt + 255), dan kemudian dengan menggunakan penambahan string alih-alih penggabungan string. Seharusnya terlihat seperti 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, di mana karakter pertama dalam pernyataan split adalah ruang tanpa henti
Taylor Scott
1
trik keren ruang tanpa putus untuk splitfungsi. Belajar hal baru lagi XD Bagus! Dan terimakasih! : 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)))}}
Pengguna tidak diketahui
sumber
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
Kazark
sumber