codegolf.com: Menghemat Waktu

11

Dari codegolf.com (tidak memuat pada 15 September 2011) adalah salah satu yang membuatku gila. Mencetak ke STDOUT jam dari bentuk yang tepat, waktu membaca dari STDIN dan menandai hjam dan mmenit (dibulatkan ke kelipatan 5) dan xjika mereka tumpang tindih, tanda centang yang tidak digunakan ditandai dengan tanda o, sehingga

echo "23:13" | perl script.pl

hasil panen

        o
    h       o

 o             m

o               o

 o             o

    o       o
        o

Punya saya:

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

untuk 136 karakter, menggunakan Perl. Saya berharap saya bisa mendapatkan di situs, tetapi saya ingat bahwa para pemimpin di bawah 100, juga menggunakan Perl. Bisakah orang lain mengalahkannya?

Joel Berger
sumber
Bacaan yang menarik :)
JB
@ Peter, ini tambang emas! Terima kasih telah menemukan itu, saya ingin tahu apakah teknik saya dapat diadaptasi?
Joel Berger
1
Apakah ada alasan serius mengapa menggunakan sesuatu dalam bentuk lemon, bukannya lingkaran?
pengguna tidak diketahui
1
@userunknown: Tugas asli mungkin dirancang menggunakan font yang lebih luas.
hammar

Jawaban:

3

Golfscript, 75 byte

Terinspirasi oleh artikel yang terhubung dalam komentar .

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

Bagian tersebut XXXXXXXXXXXXmewakili 12 byte data, beberapa di antaranya tidak dapat dicetak, dan harus diganti dengan urutan byte 120 47 253 22 194 9 183 44 196 55 125 246.

Untuk kenyamanan, berikut adalah versi yang disandikan base64:

JzonL3t+fS81LzptOzEyJTpoOyJ4L/0Wwgm3LMQ3ffYiey4uMzE4XCU5LycgJypAMTIlLmg9Mipc
bT0rJ29taHgnPUA4NS9uKn0l

Contoh dijalankan:

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

C, 259 244 163 karakter

Argumen baris perintah yang diganti dengan stdin (sesuai kebutuhan, juga berakhir lebih pendek).
Dukungan yang dihapus untuk menit di atas 59 - buang-buang 3 karakter.
Kode ditampilkan dengan jeda baris dan lekukan, tetapi karakter dihitung tanpa mereka.

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

Upaya yang lebih lama (menggunakan kode pelarian ANSI), 244 karakter:

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

Python, 175 karakter

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

Tidak mengalahkan kode Perl Anda, tetapi mungkin bahasa yang lebih ringkas dengan bilangan kompleks (atau fungsi trigonometri) dapat menggunakan ide ini untuk melakukan yang lebih baik.

Keith Randall
sumber
1

Python, 226 karakter

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

Penggunaan: jalankan 'python script.py' lalu ketikkan waktu yang diperlukan. (Kel: 09:45)

Keluaran:

        o
    o       o

 o             o

x               o

 o             o

    o       o
        o
David Sousa
sumber
0

Solusi perl saya:

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 byte

Solusi C saya:

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 byte

ya ampun e
sumber
1
saran cepat pada Perl: Anda tidak perlu posix, Anda dapat membaca dari stdin dengan sederhana <>dan saya tidak berpikir Anda perlu printfcara Anda menggunakannya, printakan bekerja :)
Joel Berger
0

Scala 327 karakter

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

digunakan dengan bentuk lingkaran yang tepat, bukan lemon-XXXX Anda:

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

Menggunakan Ansi-Code untuk output pada pos (y, x). Karena kita hanya membutuhkan akurasi 5 menit, nilai yang dihitung sebelumnya untuk x dan y tampaknya lebih pendek daripada menangani fungsi sin dan cos dengan impornya.

Pengguna tidak diketahui
sumber
0

Python, 176 karakter

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

Perl 131 karakter

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