Dessiner une horloge binaire BCD

10

Créez une horloge binaire BCD en ASCII. Comme implicite, il affichera l'heure sur six colonnes de points:

Horloge binaire
(source: Wikimedia Commons )

Chaque colonne est un chiffre codé en binaire, lisant les heures, les minutes et les secondes de gauche à droite. Les heures sont données au format 24 heures.

Le temps d'affichage est lu à partir de la ligne de commande ou de stdin (celui qui convient le mieux). S'il est vide, l'heure actuelle doit être utilisée à la place.

La taille de sortie est un peu contrainte ici et nous ne pouvons ajuster que deux lignes de texte. Vous devez donc mettre les points en seulement deux lignes. Les personnages ., :et 'sont utiles ici.

Contribution

Temps d'affichage au format ISO-8601, c'est-à-dire HH:MM:SSsans fraction de seconde. Format obligatoire de 24 heures. L'entrée peut être vide, auquel cas l'heure actuelle sera utilisée.

Production

Deux lignes avec représentent l'horloge binaire BCD comme dans l'image ci-dessus. Chaque ligne comporte exactement six caractères et les seuls caractères autorisés sont l'espace, le point, les deux-points et l'apostrophe.

Gagnant

Le code le plus court par nombre d'octets gagne. En cas d'égalité, la solution a affiché ses premières victoires.

Exemple d'entrée 1

 

(vide)

Exemple de sortie 1

     .
''. ::

Exemple d'entrée 2

17:59:20

Exemple de sortie 2

 ..'  
.:..' 

Exemple d'entrée 3

01:08:01

Exemple de sortie 3

   '  
 .   .
Joey
la source

Réponses:

5

Golfscript (+ rubis / date) - 46 caractères

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

Vous pouvez remplacer `date`par Time.nowsi nécessaire (+2 caractères).

Nabb
la source
Je savais qu'il était désespéré d'essayer même Golfscripting ;-)
Joey
5

Rubis, 107 103 99 94 90 caractères

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

Notez que l'entrée ne doit pas contenir de saut de ligne, donc pour tester la solution, utilisez quelque chose comme echo -n "01:08:01" | ruby1.9 bcd.rb.

Pour tester le comportement par défaut, exécutez-le avec ruby1.9 bcd.rbet entrez ^D(c'est-à-dire un EOF littéral).

Ventero
la source
Il n'y a rien de tel qu'un EOF littéral! :-)
JB
1
Vous pouvez raser 4 caractères avec Time.now.to_s[11,8].
Lars Haugseth
@Lars: Changé, merci!
Ventero
3

Windows PowerShell, 81

Comme je n'ai pas créé d'implémentation lors de l'écriture de la tâche, je me sens moi-même éligible à la jouer dès le départ :-)

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

Histoire:

  • 2011-02-26 23:50 (119) Première tentative.
  • 2011-02-26 23:55 (108) Amusement en ligne.
  • 2011-02-27 00:03 (102) Optimisation de la sélection de la première ligne. [Math]::Floorest waaaayy trop long. Je déteste ça.
  • 2011-02-27 02:22 (101) Je n'ai pas besoin :de la première ligne.
  • 2011-02-27 02:53    (95) Optimisation de l'entrée ou de l'heure actuelle.
  • 04/03/2011 20:36    (88) Il ne reste qu'une seule jointure. Indexation de chaque caractère nécessaire (y compris le saut de ligne) à partir d'une seule chaîne.
  • 2011-03-04 20:39    (83) Utiliser à la 58place des :transtypages automatiques en nombres entiers également - plus besoin de mettre $_entre guillemets :-)
  • 2011-03-04 20:42    (81) Les parenthèses après le -joinne sont plus nécessaires.
Joey
la source
2

Rubis - 124 caractères

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
la source
2

C #

236 caractères

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

Lisible:

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
la source
1
Il n'y a pas besoin de faire - 48quand vous le faites % 4, comme48 % 4 == 0
Dogbert
@Dogbert: Brillant, merci! Cela m'a aussi donné l'idée qui c/4-12est plus courte que (c-48)/4... :)
Timwi
2

Golfscript (+ Ruby), 63

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

Encore débutant avec Golfscript. Ne me frappe pas.

Joey
la source
Il y a quelques choses à raccourcir (voir ma réponse). Spécifique à ce que vous avez actuellement qui ne figure pas dans ma réponse - les crochets peuvent être omis des appels de fonction ruby, ""coercés à faux afin que vous puissiez les supprimer ,\.
Nabb
@Nabb: Merci. Eh bien, Ventero m'a déjà dit qu'il était descendu à 63, même si je ne pouvais pas l'amener à me dire comment ;-). Pourtant, faire glisser Ruby dans cela à travers l'interpolation de chaîne ressemble à de la triche, d'une manière ou d'une autre. Je pense que je vais rester avec ma langue préférée ci-dessous et juste essayer de battre Ruby :-)
Joey
eh bien puisque la question nécessitait l'accès à l'heure actuelle, ce n'est pas vraiment possible sans avoir recours à rubis de toute façon
gnibbler
@gnibbler: Je sais. Pourtant, c'est la seule fonctionnalité vraiment non transférable de Golfscript et je n'aime pas particulièrement l'utiliser à cause de cela ;-)
Joey
2

Perl (84)

#! perl -pl
$ _ || = heure locale; y /: // d; / \ d {6} /; $ _ = $ &; y / 0-9 / .... '' /; $ _. = "\ n $ & "; y / 0-9 /. ':.': ./
perl chinois goth
la source
Vous pouvez enregistrer un personnage en changeant "\n$&"en $/.$&- astuce Perl-golf commune :)
Timwi
@Timwi Je pourrais y utiliser une vraie nouvelle ligne :)
perl goth chinois
2

Python 3, 136 caractères

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
la source
J'en reçois 137 quand je fais un wc -c. Bon travail. +1
Kazark
1

Python - 201 172 caractères

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
la source
Que diriez-vous: t=raw_input().replace(':','')/ if not t:t=strftime('%H%M%S')- vous enregistre 5 caractères :)
Timwi
@Timwi Merci pour ça!
Juan
1

Lua - 163 160 caractères

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
la source
1

VBA (Excel), 150 148 132 octets

Utilisation de la fenêtre et de la cellule immédiates [A1]comme entrée.

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
la source
L'heure est donnée à partir de la ligne de commande ou de stdin. Aucun ne semble fonctionner ici.
Joey
? Je suis désolé, que voulez-vous dire
remoel
C'est une tâche plus ancienne avec une restriction d'entrée assez stricte et VBA ne peut probablement pas gérer l'entrée comme spécifié. En termes de tâche donnée, cette réponse ne la résout pas car elle choisit d'ignorer une partie des exigences.
Joey
1
@remoel, vous pouvez améliorer cette réponse en plaçant l' Ifinstruction dans la [..]notation et en utilisant un espace insécable au lieu d'un espace normal dans l'instruction fractionnée (Alt + 255), puis en utilisant l'ajout de chaîne au lieu de la concaténation de chaîne. Devrait ressembler 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, où le premier personnage de la déclaration partagée est l'espace insécable
Taylor Scott
1
astuces cool d'espace insécable pour la splitfonction. J'ai encore appris de nouvelles choses XD Nice! Et merci! : 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)))}}
Utilisateur inconnu
la source
0

VimScript, 143 caractères

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