25 Stimmen

Code Golf: ascii art stars zeichnen

Da diese Woche noch niemand eine Code-Golf-Herausforderung gepostet hat, versuche ich es mal damit. Ich mache das, damit ihr während der langen Kompilierungszyklen etwas anderes tun könnt, als mit Schwertern zu spielen.

Die Herausforderung:

Zeichnen von ASCII-Sternen mit drei Zahlen auf der Standardeingabe (Anzahl der Zacken, Art des Sterns (der Stern wird gezeichnet, indem man Scheitelpunkte verbindet, die n Scheitelpunkte voneinander entfernt sind) und Durchmesser des Sterns). Beispiele:

Input:                        Input:                       Input:

5 2 20                        7 2 20                       7 3 20

Output:                       Output:                      Output:

             x                        x                        x
            xx                        xx                       x
            xx                       x  xx   xx                xx      x
           x x                       x   xxxx x                xx     xx
  xx      x  x                      xxxxx  x  x                x x  xxx
   xxxx   x  x                   xxxx       x x                x x x  x
   x   xxx   x                 xx  x         xx         xxx    x  x  x
    x   x xxxx                 x   x          xx         x xxxxx xx  x
     x  x    xxx                x x           x x         xx   xxxxxx
     x x     x  xxx             x x           x  x          x xx   xxxxxx
      x      x     xx            x            x   x          x x   x     xxx
     x x     x  xxx              x            x  x          x xx   xxxxxx
     x x     xxx                x x           x x         xx   xxxxxx
    x   x xxxx                  x x           xx         x xxxxx xx  x
   x   xxx   x                 xx  x         xx         xxx    x  x  x
   xxxx   x  x                   xxxx       x x                x x x  x
  xx      x  x                      xxxxx  x  x                x x  xxx
           x x                      x    xxxx x                xx     xx
            xx                       x  xx   xx                xx      x
            xx                       x x                       x
             x                        x                        x

Da die korrekte Rasterung der Linien für eine Code-Golf-Herausforderung eine PITA sein kann, werde ich etwas Spielraum lassen, aber nicht zu viel. Mehr Beispiele:

Das ist gut genug:

    x           x                   x       x
     xx       xx                    x       x
       x     x                       x     x
     x  xx xx  x                      x   x
          x                            x x
         x x                            x
      xxx   xxx                      x     x
      x       x               xxxxxxxxxxxxxxxxxxxxx
     x         x                xx    x   x    xx
   xx  x     x  xx                xx x     x xx
  x               x                 xxx   xxx
xxxxxxxxxxxxxxxxxxxxx                 xxxxx
        x   x                      x  xx xx  x
                                  x xx     xx x
                                 xxx         xxx
         x x                    xx     x x     xx

          x
                                        x

Das reicht nicht aus:

            x                  xx               xx
            xx                   x             x
            xx                    x           x
           x x                     xx       xx
 xx       x  x                       x     x
  xxxx   x   x                     x  xx xx  x
  x   xxxx   x                          x
   x    xxxx x                         x x
    x  x    xxx                     xxx   xxx
     xx      x xxxxxx               x       x
     xx      x xxxxxx              x         x
     xx     xxx                  xx  x     x  xx
    x  x xxx x                  x               x
    x xxx    x                xxxxxxxxxxxxxxxxxxxxx
   xxx  x    x                        x   x
 xx      x   x
          x  x
          x  x                         x x
           x x
            xx
                                        x

 Lack of precission              Lack of clipping

Viel Spaß!

1voto

sje397 Punkte 40297

Javascript (auf der Grundlage der Python-Lösung von Isc), 598 591 586 559 Bytes (verwendet mit rhino shell: speichern als 'stars.js', ausführen mit 'rhino stars.js 7 2 20'):

for(var a=Math,b=parseInt,c=a.floor,d=a.abs,e=arguments,f=b(e[0]),g=b(e[1]),h=b(e[2]),i=[],j=0;j<(h+1)*h;j++)i.push((j+1)%(h+1)?" ":"\n");function k(w,x){i[x*(h+1)+w]="x"}var l=(h-1)/2,m=[];for(j=0;j<f;j++)m.push([c(l*a.cos(a.PI*2/f*j)+h/2),c(l*a.sin(a.PI*2/f*j)+h/2)]);
for(j=0;j<f;j++){var n=m[j][0],o=m[j][1],p=m[(j+g)%f][0],q=m[(j+g)%f][1],r=void 0,s=void 0;if(r=d(q-o)>d(p-n)){s=n;n=o;o=s;s=p;p=q;q=s}if(n>p){s=n;n=p;p=s;s=o;o=q;q=s}for(var t=p-n,u=0,v=d(q-o)/t,y=o<q?1:-1,z=o,A=n;A<=p;A++){r?k(z,A):k(A,z);u+=v;if(u>=0.5){z+=y;u-=1}}}print(i.join(""));

Ausgabe:

           x       
           xx       
           xx       
          x x       
  xx     x  x       
   xxxx  x  x       
   x   xxx  x       
    x  x  xxx       
     x x    xxx     
     xx     x  xxx  
     xx     x     xx
     x x    x xxxx  
    x  x   xxx      
   x    xxx x       
   xxxxx x  x       
  xx     x  x       
          x x       
           xx       
           xx       
            x       

       x            
       xx           
      x  x   xxx    
      x  xxxx  x    
    xxxxx   x  x    
 xxx x       x x    
 x  x         xx    
  x x          x    
  x x          xxx  
   x           x  x 
   x           x   x
  x x          x xx 
  x x          xx   
 x  x          x    
 xxx x       xxx    
    xxxxx   x  x                                                                                                                                              
      x  xxxx  x                                                                                                                                              
      x  xx  xxx                                                                                                                                              
       xx                                                                                                                                                     
       x            

       x            
       x            
       xx      x    
       xx     xx    
       x x   xx     
 xx    x x xx x     
  xxxxxx  x  x      
   x   xxxx  x      
    xx xx xxxx      
      xx   xx xxxx  
      xx   xx    xxx
    xx xx  xxxxxx   
   x   xxxxxxx      
  x xxxx  x  x      
 xxx   x x xx x     
       x x   xx     
       xx     xx    
       xx      x    
       x            
       x            

Erweiterter Code:

var p = parseInt(arguments[0]),
    t = parseInt(arguments[1]),
    w = parseInt(arguments[2]);

var g = [];
for(var i = 0; i < (w + 1) * w; i++)
        g.push((i + 1) % (w + 1) ? ' ' : '\n');

function plot(x, y) { g[y * (w + 1) + x] = 'x';}
function line(x0, y0, x1, y1) {
        var steep = Math.abs(y1 - y0) > Math.abs(x1 - x0), temp;
        if(steep) {
                temp = x0; x0 = y0; y0 = temp;
                temp = x1; x1 = y1; y1 = temp;
        }
        if(x0 > x1) {
                temp = x0; x0 = x1; x1 = temp;
                temp = y0; y0 = y1; y1 = temp;
        }
        var deltax = x1 - x0;
        var deltay = Math.abs(y1 - y0);
        var error = 0;
        var deltaerr = deltay / deltax;
        var ystep
        var y = y0;
        if(y0 < y1) ystep = 1; else ystep = -1;
        for(var x = x0; x <= x1; x++) {
                if(steep) plot(y,x); else plot(x,y);
                error = error + deltaerr;
                if(error >= 0.5) {
                        y = y + ystep;
                        error = error - 1.0;
                }
        }
}

var r = (w-1)/2, points = [];
for(var i = 0; i < p; i++) {
    points.push([
        Math.floor(r * Math.cos(Math.PI * 2 / p * i) + w/2),
        Math.floor(r * Math.sin(Math.PI * 2 / p * i) + w/2)
    ]);
}

for(var i = 0; i < p; i++) {
    line(points[i][0], points[i][1], points[((i + t) % p)][0], points[((i + t) % p)][1]);
}

print(g.join(''));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X