codegolf.com: ประหยัดเวลา


11

จาก codegolf.com (ไม่โหลด ณ วันที่ 15 กันยายน 2011) เป็นสิ่งที่ทำให้ฉันบ้า พิมพ์ไปที่ STDOUT นาฬิกาของแบบฟอร์มที่มีความแม่นยำเวลาอ่านจาก STDIN และทำเครื่องหมายhที่ชั่วโมงและmนาที (ปัดเศษลงเป็นหลาย ๆ 5) และxถ้าพวกเขาทับซ้อนกันเห็บที่ไม่ได้ใช้จะถูกทำเครื่องหมายด้วยoเพื่อให้

echo "23:13" | perl script.pl

อัตราผลตอบแทน

        o
    h       o

 o             m

o               o

 o             o

    o       o
        o

ของฉันคือ:

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

สำหรับ 136 ตัวอักษรโดยใช้ Perl ฉันหวังว่าฉันจะได้รับในเว็บไซต์ แต่ฉันดูเหมือนจะจำได้ว่าผู้นำอยู่ภายใต้ 100, ยังใช้ Perl คนอื่นสามารถเอาชนะได้หรือไม่



การอ่านที่น่าทึ่ง :)
JB

@ Peter มันเป็น goldmine! ขอบคุณสำหรับการค้นหาที่ฉันสงสัยว่าฉันสามารถปรับเทคนิคของพวกเขา?
Joel Berger

1
มีเหตุผลร้ายแรงไหมทำไมต้องใช้บางอย่างในรูปมะนาวเช่นแทนที่จะเป็นวงกลม?
ผู้ใช้ที่ไม่รู้จัก

1
@userunknown: งานต้นฉบับอาจได้รับการออกแบบโดยใช้แบบอักษรที่กว้างขึ้น
hammar

คำตอบ:


3

Golfscript, 75 ไบต์

แรงบันดาลใจจากบทความที่เชื่อมโยงในการแสดงความคิดเห็น

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

XXXXXXXXXXXXส่วนหนึ่งแสดงให้เห็นถึง 12 120 47 253 22 194 9 183 44 196 55 125 246ไบต์ของข้อมูลบางส่วนของพวกเขาไม่สามารถพิมพ์และควรถูกแทนที่ด้วยลำดับไบต์

เพื่อความสะดวกนี่คือรุ่นที่เข้ารหัส base64:

JzonL3t+fS81LzptOzEyJTpoOyJ4L/0Wwgm3LMQ3ffYiey4uMzE4XCU5LycgJypAMTIlLmg9Mipc
bT0rJ29taHgnPUA4NS9uKn0l

ตัวอย่างการเรียกใช้:

$ 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 ตัวอักษร

แทนที่อาร์กิวเมนต์บรรทัดคำสั่งด้วย stdin (ตามต้องการและสิ้นสุดลงด้วยเช่นกัน)
นำการสนับสนุนออกไปเป็นเวลากว่า 59 นาทีขึ้นไป - เสีย 3 ตัวอักษร
รหัสจะแสดงพร้อมกับตัวแบ่งบรรทัดและการเยื้อง แต่นับอักขระได้โดยไม่ต้อง

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

ความพยายามที่เก่ากว่า (ใช้รหัสหลบหนี ANSI), 244 ตัวอักษร:

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 ตัวอักษร

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

ไม่ได้เอาชนะโค้ด Perl ของคุณ แต่อาจเป็นภาษาที่กระชับกว่าด้วยตัวเลขที่ซับซ้อน (หรือฟังก์ชั่นตรีโกณมิติ) ที่สามารถใช้ความคิดนี้เพื่อทำให้ดีขึ้น


1

Python 226 ตัวอักษร

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

การใช้งาน: เรียกใช้ 'python script.py' จากนั้นพิมพ์เวลาที่ต้องการ (เช่น 09:45)

เอาท์พุท:

        o
    o       o

 o             o

x               o

 o             o

    o       o
        o

0

โซลูชัน 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 ไบต์

โซลูชัน 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 ไบต์


1
คำแนะนำสั้น ๆ เกี่ยวกับ Perl: คุณไม่จำเป็นต้องมี posix คุณสามารถอ่านจาก stdin ได้อย่างง่ายดาย<>และฉันไม่คิดว่าคุณต้องการprintfวิธีการใช้งานของคุณจะใช้printงานได้ :)
Joel Berger

0

สกาล่า 327 ตัวอักษร

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

ใช้กับรูปร่างวงกลมที่เหมาะสมไม่ใช่ Lemon-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')
  }
}

ใช้ Ansi-Code สำหรับเอาต์พุตที่ pos (y, x) เนื่องจากเราต้องการความแม่นยำเพียง 5 นาทีค่าที่กำหนดล่วงหน้าสำหรับ x และ y จึงสั้นกว่าการจัดการฟังก์ชัน sin และ cos ด้วยการนำเข้า



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.