codegolf.com: gagner du temps

11

De codegolf.com (non en cours de chargement au 15 septembre 2011) était celui qui me rendait fou. Imprimez dans STDOUT une horloge d'une forme exacte, lisant l'heure de STDIN et marquant un hà l'heure et mà la minute (arrondi à un multiple de 5) et un xs'ils se chevauchent, les graduations inutilisées sont marquées d'un o, de sorte que

echo "23:13" | perl script.pl

les rendements

        o
    h       o

 o             m

o               o

 o             o

    o       o
        o

Le mien est:

$/=':';($h,$m)=<>;printf'%9s
%5s%8s

%2s%14s

%s%16s

%2s%14s

%5s%8s
%9s',map{qw'o h m x'[2*($_==int$m/5)^$_==$h%12]}map{$_,11-$_}0..5

pour 136 caractères, en utilisant Perl. J'aimerais pouvoir accéder au site, mais il me semble que les dirigeants avaient moins de 100 ans, utilisant également Perl. Quelqu'un d'autre peut-il le battre?

Joel Berger
la source
Une lecture fascinante :)
JB
@Peter, c'est la mine d'or! Merci d'avoir trouvé ça, je me demande si les miennes peuvent adapter leurs techniques?
Joel Berger
1
Y a-t-il une raison sérieuse pour utiliser quelque chose en forme de citron au lieu d'un cercle?
utilisateur inconnu
1
@userunknown: la tâche d'origine a probablement été conçue à l'aide d'une police plus large.
hammar

Réponses:

3

Golfscript, 75 octets

Inspiré par l'article lié dans les commentaires .

':'/{~}/5/:m;12%:h;"XXXXXXXXXXXX"{..318\%9/' '*@12%.h=2*\m=+'omhx'=@85/n*}%

La XXXXXXXXXXXXpartie représente 12 octets de données, certaines non imprimables, et doit être remplacée par la séquence d'octets 120 47 253 22 194 9 183 44 196 55 125 246.

Pour plus de commodité, voici une version encodée en base64:

JzonL3t+fS81LzptOzEyJTpoOyJ4L/0Wwgm3LMQ3ffYiey4uMzE4XCU5LycgJypAMTIlLmg9Mipc
bT0rJ29taHgnPUA4NS9uKn0l

Exemple d'exécution:

$ echo -n "JzonL3t+fS81LzptOzEyJTpoOyJ4L/0Wwgm3LMQ3ffYiey4uMzE4XCU5LycgJypAMTIlLmg9MipcbT0rJ29taHgnPUA4NS9uKn0l" | base64 -d > saving-time.gs
$ ls -l saving-time.gs 
-rw-r--r-- 1 ahammar ahammar 75 2012-01-29 17:31 saving-time.gs
$ ruby golfscript.rb saving-time.gs <<< "15:37"
        o
    o       o

 o             o

o               h

 o             o

    m       o
        o
hammar
la source
2

C, 259 244 163 caractères

Argument de ligne de commande remplacé par stdin (au besoin, finit également plus court).
Suppression du support pour les minutes au-dessus de 59 - un gaspillage de 3 caractères.
Le code est affiché avec des sauts de ligne et un retrait, mais les caractères ont été comptés sans eux.

main(i,h,m,x){
    scanf("%d:%d",&h,&m);
    for(i=0;i<12;
        printf("%*c","IEHBNAPBNEHI"[i++]-64,"ohmx"[(x==h%12)+2*(x==m/5)]))
        x=i%2?puts("\n"+(i%10==1)),11-i/2:i/2;
    puts("");
}

Tentative antérieure (en utilisant les codes d'échappement ANSI), 244 caractères:

f(x,y)char*y;{printf("\033[%d%c",x>0?x:-x,y[x<0]);}
main(i,h,m,x){
    char*v="HIJJJJIGFFFFPKJHFDCCDFHJ";
    f(i=f(scanf("%d:%d",&h,&m),"J")*0,v);
    for(;i<12;i++)
        (x=v[i+12]-72)&&f(x,"CD"),
        f(v[i]-72,"BA"),
        putchar("omhx"[2*(i==h%12)+(i==m%60/5)]);
    f(i,"B");
}
ugoren
la source
1

Python, 175 caractères

h,m=map(int,raw_input().split(':'))
S=([' ']*17+['\n'])*11
for i in range(12):p=1j**(i/3.);S[98+int(8.5*p.imag)-18*int(5*p.real)]='ohmx'[2*(i==m/5)+(i==h%12)]
print''.join(S),

Ne bat pas votre code Perl, mais peut-être qu'un langage plus concis avec des nombres complexes intégrés (ou des fonctions trigonométriques) pourrait utiliser cette idée pour faire mieux.

Keith Randall
la source
1

Python, 226 caractères

h,p,s=raw_input().split(':'),['o']*12,[0,11,1,10,2,9,3,8,4,7,5,6]
a,b=int(h[0])%12,int(h[1])/5
p[a],p[b]='h','m' if a!=b else 'x'
print '%9s\n%5s%8s\n\n %s%14s\n\n%s%16s\n\n %s%14s\n\n%5s%8s\n%9s'%tuple([p[i] for i in s])

Utilisation: exécutez 'python script.py' puis saisissez l'heure requise. (Ex: 09:45)

Production:

        o
    o       o

 o             o

x               o

 o             o

    o       o
        o
David Sousa
la source
0

Ma solution Perl:

use POSIX;$/=':';@ss=(8,4,1,0,1,4,8);@sn=(0,7,13,15,13,7,0);$h=<stdin>;
$m=<stdin>;if($h>12){$h=$h-12;}$m=floor($m/5);
for($c=0;$c<7;$c++){for($s=0;$s<$ss[$c];$s++){printf(" ");}
$ac='o';if($h>5&&$h-6==6-$c){$ac='h';}if((($m>5)&&$m-6==6-$c)||($m==$c)&&($c==0)){
if($h>5&&$h-6==6-$c){$ac='x';}else{$ac='m';}}
print($ac);for($s=0;$s<$sn[$c];$s++){printf(" ");}$bc='o';if($h<6&&$h==$c){$bc='h';}
if($m<6&&$m==$c){if($h<6&&$h==$c){$bc='x';}else{$bc='m';}}
if($sn[$c]){print($bc);}printf("\n");if($c&&($c!=5)){printf("\n");}}

527 octets

Ma solution C:

main(){int x[]={8,4,1,0,1,4,8},y[]={0,7,13,15,13,7,0}
,h,m,z,c,s;scanf("%d:%d",&h,&m);h>12?h-=12:h;m/=5;
for(c=0;c<7;c++){for(s=0;s<x[c];s++){printf(" ");}z='o';
if(h>5&h-6==6-c){z='h';}if((m>5&m-6==6-c)|(m==c)&!c){
z='m';if(h>5&h-6==6-c){z='x';}}printf("%c",z);
for(s=0;s<y[c];s++){printf(" ");}z='o';if(h<6&h==c){
z='h';}if(m<6&m==c){z='m';if(h<6&h==c){z='x';}}
if(y[c]){printf("%c",z);}printf("\n");if(c&&(c!=5)){printf("\n");}}}

440 octets

smeez e
la source
1
une brève suggestion sur le Perl: vous n'avez pas besoin de posix, vous pouvez lire à partir de stdin avec simplement <>et je ne pense pas que vous ayez besoin de printfla façon dont vous l'utilisez, printcela fonctionnera :)
Joel Berger
0

Scala 327 caractères

object C extends App{
val R=List(2,4,6,8,10)
val r=1::R:::11::R.reverse
val C=List(3,6,12,18,21)
val c=1::C:::21::C.reverse
def p(n:Int,i:Char){
val z=r(n)
val s=c((n+3)%12)
printf("[%d;%dH"+i,z,s)}
val t=readLine.split(":")
val h=t(0).toInt%12
val m=t(1).toInt/5
(0 to 11).map(x=>p(x,'o'))
p(h,'h')
p(m,'m')
if(h==m)p(h,'x')}

utilisé avec une forme de cercle appropriée, pas votre citron-XXXX:

clear  && echo 5:43 | scala C 
           o
     o           o

  o                 o

o                    o

  m                 o

     o           h
           o

non golfé:

object Clock {
 val R = List (2,4,6,8,10)
 val r = 1 :: R ::: 11 :: R.reverse
 val C = List (3,6,12,18,21)
 val c = 1 :: C ::: 22 :: C.reverse

 def pos (n: Int, i: Char)={
   val z = r (n) 
   val s = c ((n+3) % 12) 
   printf ("[%d;%dH" + i, z, s)
 }

 def main (args: Array [String]) {
   val t = args (0).split (":")
   val h = t (0).toInt % 12
   val m = t (1).toInt /  5
   (0 to 11).map (x=> pos (x, 'o'))
   pos (h, 'h') 
   pos (m, 'm')
   if (h == m) pos (h, 'x')
  }
}

Utilise Ansi-Code pour la sortie à pos (y, x). Comme nous n'avons besoin que d'une précision de 5 minutes, les valeurs précalculées pour x et y semblent être plus courtes que la gestion des fonctions sin et cos avec leur importation.

Utilisateur inconnu
la source
0

Python, 176 caractères

o=map(ord,' .@Set~lWC2&!/0ABTUfgu')
h,m=map(int,raw_input().split(':'))
print''.join([' ',['\n','ohmx'[2*(i==o[m/5])+(i==o[h%12])]][i in o[:12]]][i in o]for i in range(24,127))
Arvind Singh
la source
0

Perl 131 caractères

<>=~/:/;$h=$`%12;$m=$'/5;printf'%9s
%12$5s%8s

%11$2s%14s

%10$s%16s

%9$2s%14s

%8$5s%8s
%9s',map$_^$h?$_^$m?o:'m':$h^$m?h:x,0..11
Toto
la source