Gráfico circular de arte Ascii

16

Su objetivo es generar un gráfico circular ASCII. Este es el código de golf, por lo que gana el programa más corto (contando los bytes del código fuente, no los caracteres).

No se permiten softwares externos o API. Solo los nativos de cada idioma.

El ángulo inicial y la dirección (en sentido horario / antihorario) del círculo no son importantes. La salida puede verse ovalada porque la altura de un personaje siempre es superior a su ancho.

El "fondo" (caracteres a la izquierda o a la derecha del pastel) deben ser espacios.

Como entrada, tiene tres variables (publique el código para inicializarlo. La inicialización de estas variables no se cuenta en su puntaje):

  • k: Matriz de personajes. Cada personaje es el que debe usarse en el gráfico circular
  • v: Matriz de carrozas. Es el porcentaje de cada personaje. La longitud de ves igual a la longitud de k. La suma de sus elementos es siempre 1.0
  • r : Entero> 1. Es el radio del gráfico circular.

(yo=1El |vEl |vyo)<1

sebcap26
fuente

Respuestas:

6

Python: 255 caracteres - 20% = 204

from math import*
def s(k,v,a):
 if not v:return ' '
 if a<v[0]:return k[0]
 return s(k[1:],v[1:],a-v[0])
def p(k,v,r):
 d=range(-r,r)
 for y in d:
  t=""
  for x in d:
   if x*x+y*y<r*r:
    a=atan2(y,x)/pi/2+.5
    t=t+s(k,v,a)
   else:t=t+" "
  print t

Ejemplos:

>>> pie.p("ABCD", [0.25,0.125,0.125,0.125],8)

     AAABBBB    
   AAAAABBBBBB  
  AAAAAABBBBBCC
  AAAAAABBBBCCC
 AAAAAAABBBCCCCC
 AAAAAAABBCCCCCC
 AAAAAAABCCCCCCC
        DDDDDDDD
          DDDDDD
           DDDDD
            DDDD
             DD
              D


>>>


>>> pie.p(".$!@", [0.3,0.3,0.3,0.1],6)

   .....$$  
  ......$$$
 ......$$$$$
 ......$$$$$
 ......$$$$$
 @@@@@$$$$$$
 @@@@!!!$$$$
 @@@!!!!!$$$
 @!!!!!!!!!$
  !!!!!!!!!
   !!!!!!!  
>>>
intx13
fuente
Esto se puede reducir a 231 bytes reemplazando las funciones s con una lambda s=lambda k,v,a:' 'if not v else k[0]if a<v[0]else s(k[1:],v[1:],a-v[0])y usando un punto y coma para colocar la instrucción if en una líneaif x*x+y*y<r*r:a=atan2(y,x)/pi/2+.5;t=t+s(k,v,a)
anónimo sin Lifer el
7

JavaScript, 259

d=r*2;M=Math;R=M.round;p=[];for(y=0;y<d;y++){p[y]=[];for(x=0;x<d;x++)p[y][x]=" "}t=0;i=-1;for(f=0;f<1;f+=1/(r*20)){if(f>t)t+=v[++i];a=M.PI*2*f;for(j=0;j<r;j++)p[R(M.sin(a)*j)+r][R(M.cos(a)*j)+r]=k[i]}s="";for(y=0;y<d;y++){for(x=0;x<d;x++)s+=p[y][x];s+="\n";}s

Funciona en el bloc de notas de Firefox.

Primer ejemplo

Entrada:

var k = ["#", "+",  "$",  "X"];
var v = [0.2, 0.4, 0.15, 0.25];
var r = 10;

Salida:

       $$$XXXX      
     $$$$$XXXXXX    
    $$$$$$XXXXXXX   
   $$$$$$$XXXXXXXX  
  +$$$$$$$XXXXXXXXX 
  ++$$$$$$XXXXXXXXX 
 +++++$$$$XXXXXXXXXX
 ++++++$$$XXXXXXXXXX
 +++++++$$XXXXXXXXXX
 +++++++++XXXXXXXXXX
 ++++++++++#########
 +++++++++++########
 +++++++++++########
  ++++++++++####### 
  +++++++++++###### 
   ++++++++++#####  
    +++++++++####   
     ++++++++###    
       +++++++      

Segundo ejemplo

Entrada:

var k = ["A",  "B", "C" ];
var v = [0.5, 0.25, 0.25];
var r = 5;

Salida:

   BBCCC  
  BBBCCCC 
 BBBBCCCCC
 BBBBCCCCC
 BBBBCCCCC
 AAAAAAAAA
 AAAAAAAAA
  AAAAAAA 
   AAAAA  
sebcap26
fuente