codegolf.com: Zeit sparen

11

Von codegolf.com (nicht geladen am 15. September 2011) war einer, der mich verrückt machte. Drucken Sie zu STDOUT eine Uhr mit einer genauen Form, lesen Sie die Zeit von STDIN ab und markieren Sie eine hzur Stunde und mzur Minute (abgerundet auf ein Vielfaches von 5). xWenn sie sich überlappen, werden nicht verwendete Häkchen mit einem markiert o, so dass

echo "23:13" | perl script.pl

ergibt

        o
    h       o

 o             m

o               o

 o             o

    o       o
        o

Meins ist:

$/=':';($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

für 136 Zeichen mit Perl. Ich wünschte, ich könnte auf die Website gelangen, aber ich erinnere mich, dass die Anführer unter 100 waren und auch Perl verwendeten. Kann jemand anderes es schlagen?

Joel Berger
quelle
Eine faszinierende Lektüre :)
JB
@ Peter, es ist die Goldmine! Vielen Dank, dass Sie das gefunden haben. Ich frage mich, ob meine ihre Techniken anpassen können.
Joel Berger
1
Gibt es einen ernsthaften Grund, etwas in einer solchen Zitronenform anstelle eines Kreises zu verwenden?
Benutzer unbekannt
1
@userunknown: Die ursprüngliche Aufgabe wurde wahrscheinlich mit einer breiteren Schriftart entworfen.
Hammar

Antworten:

3

Golfscript, 75 Bytes

Inspiriert von dem Artikel in den Kommentaren .

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

Der XXXXXXXXXXXXTeil repräsentiert 12 Datenbytes, von denen einige nicht druckbar sind, und sollte durch die Bytefolge ersetzt werden 120 47 253 22 194 9 183 44 196 55 125 246.

Der Einfachheit halber ist hier eine Base64-codierte Version:

JzonL3t+fS81LzptOzEyJTpoOyJ4L/0Wwgm3LMQ3ffYiey4uMzE4XCU5LycgJypAMTIlLmg9Mipc
bT0rJ29taHgnPUA4NS9uKn0l

Beispiellauf:

$ 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
quelle
2

C 259 244 163 Zeichen

Das Befehlszeilenargument wurde durch stdin ersetzt (wird bei Bedarf auch kürzer).
Unterstützung für Minuten über 59 entfernt - eine Verschwendung von 3 Zeichen.
Der Code wird mit Zeilenumbrüchen und Einrückungen angezeigt, aber die Zeichen wurden ohne sie gezählt.

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

Älterer Versuch (unter Verwendung von ANSI-Escape-Codes), 244 Zeichen:

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
quelle
1

Python, 175 Zeichen

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

Schlägt Ihren Perl-Code nicht, aber vielleicht könnte eine präzisere Sprache mit eingebauten komplexen Zahlen (oder Triggerfunktionen) diese Idee nutzen, um es besser zu machen.

Keith Randall
quelle
1

Python, 226 Zeichen

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

Verwendung: Führen Sie 'python script.py' aus und geben Sie die erforderliche Zeit ein. (Beispiel: 09:45)

Ausgabe:

        o
    o       o

 o             o

x               o

 o             o

    o       o
        o
David Sousa
quelle
0

Meine Perl-Lösung:

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 Bytes

Meine C-Lösung:

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 Bytes

smeez e
quelle
1
Ein kurzer Vorschlag zum Perl: Du brauchst kein Posix, du kannst mit einfach von stdin lesen <>und ich glaube nicht, dass du es so brauchst, printfwie du es benutzt, printwird funktionieren :)
Joel Berger
0

Scala 327 Zeichen

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

in Verwendung mit einer richtigen Kreisform, nicht Ihre Zitrone-XXXX:

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

  o                 o

o                    o

  m                 o

     o           h
           o

ungolfed:

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

Verwendet Ansi-Code für die Ausgabe an Position (y, x). Da wir nur eine Genauigkeit von 5 Minuten benötigen, scheinen vorberechnete Werte für x und y kürzer zu sein als die Behandlung von sin- und cos-Funktionen mit ihrem Import.

Benutzer unbekannt
quelle
0

Python, 176 Zeichen

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
quelle
0

Perl 131 Zeichen

<>=~/:/;$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
quelle