Ascii Kunst Kreisdiagramm

16

Ihr Ziel ist es, ein ASCII-Art-Kreisdiagramm auszugeben. Dies ist Code-Golf, also gewinnt das kürzeste Programm (das die Bytes des Quellcodes zählt, nicht die Zeichen).

Externe Software oder APIs sind nicht zulässig. Nur die Muttersprachler jeder Sprache.

Der Startwinkel und die Richtung (im / gegen den Uhrzeigersinn) des Kreises sind nicht wichtig. Die Ausgabe kann oval aussehen, da die Höhe eines Zeichens immer größer ist als seine Breite.

Der "Hintergrund" (Zeichen links oder rechts vom Kreis) muss ein Leerzeichen sein.

Als Eingabe haben Sie drei Variablen (bitte geben Sie den Code für die Initialisierung an. Die Initialisierung dieser Variablen wird in Ihrer Punktzahl nicht berücksichtigt):

  • k: Array von Zeichen. Jedes Zeichen muss im Kreisdiagramm verwendet werden
  • v: Array von Schwimmern. Es ist der Prozentsatz jedes Zeichens. Die Länge von vist gleich der Länge von k. Die Summe seiner Elemente ist immer 1.0
  • r : Integer> 1. Dies ist der Radius des Kreisdiagramms.

Bonus: Subtrahieren Sie 20% Ihrer Punktzahl, wenn Sie einen unvollständigen Kuchen ausgeben können (für den Fall, dass ).(ich=1|v|vich)<1

sebcap26
quelle

Antworten:

6

Python: 255 Zeichen - 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

Beispiele:

>>> 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
quelle
Dies kann auf 231 Byte reduziert werden, indem die Funktion s durch ein Lambda ersetzt s=lambda k,v,a:' 'if not v else k[0]if a<v[0]else s(k[1:],v[1:],a-v[0])und die if-Anweisung mit einem if x*x+y*y<r*r:a=atan2(y,x)/pi/2+.5;t=t+s(k,v,a)
Semikolon
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

Funktioniert in Firefox Scratchpad.

Erstes Beispiel

Eingabe:

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

Ausgabe :

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

Zweites Beispiel:

Eingabe:

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

Ausgabe :

   BBCCC  
  BBBCCCC 
 BBBBCCCCC
 BBBBCCCCC
 BBBBCCCCC
 AAAAAAAAA
 AAAAAAAAA
  AAAAAAA 
   AAAAA  
sebcap26
quelle