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?



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

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

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.


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

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


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.


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.