Wykres kołowy sztuki ASCII

16

Twoim celem jest wygenerowanie graficznego wykresu kołowego ASCII. To jest golf golfowy, więc wygrywa najkrótszy program (liczący bajty kodu źródłowego, a nie znaki).

Żadne zewnętrzne oprogramowanie ani interfejsy API są niedozwolone. Tylko rodzime dla każdego języka.

Kąt początkowy i kierunek koła (zgodnie z ruchem wskazówek zegara / przeciwnie do ruchu wskazówek zegara) nie są ważne. Wynik może wyglądać owalnie, ponieważ wysokość znaku jest zawsze większa niż jego szerokość.

„Tło” (znaki po lewej lub po prawej stronie ciasta) muszą być spacjami.

Jako dane wejściowe masz trzy zmienne (proszę podać kod inicjujący. Inicjalizacja tych zmiennych nie jest liczona w wyniku):

  • k: Tablica znaków. Każda postać jest tą, która musi być użyta na wykresie kołowym
  • v: Tablica pływaków. To procent każdej postaci. Długość vjest równa długości k. Suma jego elementów wynosi zawsze 1,0
  • r : Liczba całkowita> 1. Jest to promień wykresu kołowego.

(ja=1|v|vja)<1

sebcap26
źródło

Odpowiedzi:

6

Python: 255 znaków - 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

Przykłady:

>>> 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
źródło
Można to zmniejszyć do 231 bajtów, zastępując funkcję s 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])i używając średnika, aby umieścić instrukcję if w jednym wierszuif x*x+y*y<r*r:a=atan2(y,x)/pi/2+.5;t=t+s(k,v,a)
Anonymous 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

Działa w scratchpad Firefox.

Pierwszy przykład

Wejście :

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

Wynik :

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

Drugi przykład:

Wejście :

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

Wynik :

   BBCCC  
  BBBCCCC 
 BBBBCCCCC
 BBBBCCCCC
 BBBBCCCCC
 AAAAAAAAA
 AAAAAAAAA
  AAAAAAA 
   AAAAA  
sebcap26
źródło