codegolf.com: Tiết kiệm thời gian


11

Từ codegolf.com (không tải vào ngày 15 tháng 9 năm 2011) là một điều khiến tôi phát điên. In sang STDOUT đồng hồ có dạng chính xác, thời gian đọc từ STDIN và đánh dấu hvào giờ và mphút (làm tròn xuống bội số 5) và xnếu chúng trùng nhau, các dấu tick không sử dụng được đánh dấu bằng o, do đó

echo "23:13" | perl script.pl

sản lượng

        o
    h       o

 o             m

o               o

 o             o

    o       o
        o

Của tôi là:

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

cho 136 ký tự, sử dụng Perl. Tôi ước tôi có thể vào trang này, nhưng tôi dường như nhớ lại rằng các nhà lãnh đạo dưới 100 tuổi, cũng đang sử dụng Perl. Người khác có thể đánh bại nó?



Một cuốn sách hấp dẫn :)
JB

@Peter, đó là mỏ vàng! Cảm ơn vì đã tìm ra điều đó, tôi tự hỏi liệu tôi có thể thích nghi với kỹ thuật của họ không?
Joel Berger

1
Có một lý do nghiêm trọng tại sao để sử dụng một cái gì đó trong hình dạng chanh như vậy, thay vì một vòng tròn?
người dùng không xác định

1
@userunknown: Tác vụ ban đầu có thể được thiết kế bằng phông chữ rộng hơn.
hammar

Câu trả lời:


3

Golf, 75 byte

Lấy cảm hứng từ bài viết liên kết trong các ý kiến .

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

Phần XXXXXXXXXXXXđại diện cho 12 byte dữ liệu, một số trong số chúng không thể in được và nên được thay thế bằng chuỗi byte 120 47 253 22 194 9 183 44 196 55 125 246.

Để thuận tiện, đây là phiên bản được mã hóa base64:

JzonL3t+fS81LzptOzEyJTpoOyJ4L/0Wwgm3LMQ3ffYiey4uMzE4XCU5LycgJypAMTIlLmg9Mipc
bT0rJ29taHgnPUA4NS9uKn0l

Chạy ví dụ:

$ 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 ký tự

Thay thế đối số dòng lệnh bằng stdin (theo yêu cầu, cũng kết thúc ngắn hơn).
Đã xóa hỗ trợ cho phút trên 59 - lãng phí 3 ký tự.
Mã được hiển thị với ngắt dòng và thụt dòng, nhưng các ký tự được tính mà không có chúng.

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

Cố gắng cũ hơn (sử dụng mã thoát ANSI), 244 ký tự:

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 ký tự

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

Không đánh bại mã Perl của bạn, nhưng có lẽ một ngôn ngữ ngắn gọn hơn với các số phức (hoặc hàm trig) được xây dựng có thể sử dụng ý tưởng này để làm tốt hơn.


1

Python, 226 ký tự

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

Cách sử dụng: chạy 'python script.py' sau đó nhập thời gian cần thiết. (Ví dụ: 09:45)

Đầu ra:

        o
    o       o

 o             o

x               o

 o             o

    o       o
        o

0

Giải pháp perl của tôi:

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

Giải pháp C của tôi:

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


1
một gợi ý nhanh về Perl: bạn không cần posix, bạn có thể đọc từ stdin một cách đơn giản <>và tôi không nghĩ bạn cần printfcách bạn đang sử dụng nó, printsẽ hoạt động :)
Joel Berger

0

Scala 327 ký tự

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

được sử dụng với hình dạng vòng tròn phù hợp, không phải chanh-XXXX của bạn:

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

  o                 o

o                    o

  m                 o

     o           h
           o

vô dụng:

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

Sử dụng Ansi-Code cho đầu ra tại pos (y, x). Vì chúng ta chỉ cần độ chính xác 5 phút, các giá trị được tính toán trước cho x và y dường như ngắn hơn so với xử lý các hàm sin và cos khi nhập.


0

Con trăn, 176 ký tự

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 ký tự

<>=~/:/;$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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.