Graphique circulaire Ascii Art

16

Votre objectif est de générer un graphique circulaire ASCII. Il s'agit de code-golf, donc le programme le plus court (en comptant les octets du code source, pas les caractères) gagne.

Aucun logiciel ou API externe n'est autorisé. Seulement les natifs de chaque langue.

L'angle de départ et la direction (dans le sens horaire / antihoraire) du cercle ne sont pas importants. La sortie peut sembler ovale car la hauteur d'un caractère est toujours supérieure à sa largeur.

Le "fond" (caractères à gauche ou à droite de la tarte) doit être un espace.

En entrée, vous avez trois variables (veuillez poster le code pour l'initialiser. L'initialisation de ces variables n'est pas prise en compte dans votre score):

  • k: Tableau de personnages. Chaque caractère est celui qui doit être utilisé sur le graphique à secteurs
  • v: Tableau de flotteurs. C'est le pourcentage de chaque personnage. La longueur de vest égale à la longueur de k. La somme de ses éléments est toujours de 1,0
  • r : Entier> 1. C'est le rayon du graphique à secteurs.

(je=1|v|vje)<1

sebcap26
la source

Réponses:

6

Python: 255 caractères - 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

Exemples:

>>> 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
la source
Cela peut être réduit à 231 octets en remplaçant la fonction s par un 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])et en utilisant un point-virgule pour mettre l'instruction if sur une seule ligneif x*x+y*y<r*r:a=atan2(y,x)/pi/2+.5;t=t+s(k,v,a)
Anonyme No Lifer
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

Fonctionne dans le bloc-notes de Firefox.

Premier exemple

Contribution :

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

Production :

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

Deuxième exemple:

Contribution :

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

Production :

   BBCCC  
  BBBCCCC 
 BBBBCCCCC
 BBBBCCCCC
 BBBBCCCCC
 AAAAAAAAA
 AAAAAAAAA
  AAAAAAA 
   AAAAA  
sebcap26
la source