codegolf.com: Oszczędzanie czasu

11

From codegolf.com (nie ładuje się od 15 września 2011 r.), Doprowadziło mnie do szału. Wydrukuj do STDOUT zegar o wymagającej formie, odczytuj czas ze STDIN i zaznaczaj hgodzinę i mminutę (w zaokrągleniu do wielokrotności 5), a xjeśli się pokrywają, nieużywane tyknięcia są oznaczone znakiem o, dzięki czemu

echo "23:13" | perl script.pl

daje

        o
    h       o

 o             m

o               o

 o             o

    o       o
        o

Mój jest:

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

dla 136 znaków, używając Perla. Chciałbym móc wejść na stronę, ale wydaje mi się, że pamiętam, że liderzy mieli mniej niż 100 lat, również używali Perla. Czy ktoś inny może to pokonać?

Joel Berger
źródło
Fascynująca lektura :)
JB
@Peter, to kopalnia złota! Dzięki, że to odkryłem. Zastanawiam się, czy moje mogą dostosować swoje techniki?
Joel Berger,
1
Czy istnieje poważny powód, aby używać czegoś w takim kształcie cytryny zamiast koła?
użytkownik nieznany
1
@userunknown: Oryginalne zadanie zostało prawdopodobnie zaprojektowane przy użyciu szerszej czcionki.
hammar

Odpowiedzi:

3

Golfscript, 75 bajtów

Inspirowany artykułem połączonym w komentarzach .

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

XXXXXXXXXXXXCzęść stanowi 12 bajtów danych drukować tylko niektóre z nich, powinny być zastąpiona w sekwencji bajtów 120 47 253 22 194 9 183 44 196 55 125 246.

Dla wygody oto wersja zakodowana w standardzie base64:

JzonL3t+fS81LzptOzEyJTpoOyJ4L/0Wwgm3LMQ3ffYiey4uMzE4XCU5LycgJypAMTIlLmg9Mipc
bT0rJ29taHgnPUA4NS9uKn0l

Przykładowy przebieg:

$ 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
źródło
2

C, 259 244 163 znaków

Zamieniony argument wiersza poleceń na stdin (w razie potrzeby również jest krótszy).
Usunięto wsparcie dla minut powyżej 59 - marnotrawstwo 3 znaków.
Kod jest wyświetlany z podziałem wierszy i wcięciem, ale znaki zostały policzone bez nich.

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

Starsza próba (przy użyciu kodów specjalnych ANSI), 244 znaki:

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
źródło
1

Python, 175 znaków

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

Nie bije twojego kodu Perla, ale być może bardziej zwięzły język z wbudowanymi liczbami zespolonymi (lub funkcjami wyzwalacza) mógłby wykorzystać ten pomysł, aby zrobić coś lepszego.

Keith Randall
źródło
1

Python, 226 znaków

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

Sposób użycia: uruchom „python script.py”, a następnie wpisz wymagany czas. (Przykład: 09:45)

Wynik:

        o
    o       o

 o             o

x               o

 o             o

    o       o
        o
David Sousa
źródło
0

Moje rozwiązanie perla:

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 bajtów

Moje rozwiązanie 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 bajtów

smeez e
źródło
1
szybka sugestia na temat Perla: nie potrzebujesz posix, możesz po prostu czytać ze standardowego wejścia <>i nie sądzę, że potrzebujesz printfsposobu, w jaki go używasz, printzadziała :)
Joel Berger
0

Scala 327 znaków

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

w użyciu z odpowiednim kształtem koła, a nie z cytryną-XXXX:

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

  o                 o

o                    o

  m                 o

     o           h
           o

bez golfa:

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

Używa kodu Ansi dla danych wyjściowych w pozycji pos (y, x). Ponieważ potrzebujemy tylko 5 minut dokładności, wstępnie obliczone wartości xiy wydają się być krótsze niż obsługa funkcji sin i cos z ich importem.

nieznany użytkownik
źródło
0

Python, 176 znaków

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
źródło
0

Perl 131 znaków

<>=~/:/;$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
źródło