Bagan pai seni Ascii

16

Tujuan Anda adalah untuk menghasilkan bagan pai seni ASCII. Ini adalah kode-golf, sehingga program terpendek (menghitung byte dari kode sumber, bukan karakter) menang.

Perangkat lunak eksternal atau API tidak diizinkan. Hanya yang asli dari setiap bahasa.

Sudut awal dan arah (searah jarum jam / berlawanan arah jarum jam) dari lingkaran tidak penting. Outputnya bisa terlihat oval karena ketinggian karakter selalu lebih tinggi dari lebarnya.

"Latar belakang" (karakter di sebelah kiri atau kanan pai) harus spasi.

Sebagai input, Anda memiliki tiga variabel (silakan kirim kode untuk menginisialisasi. Inisialisasi variabel-variabel ini tidak dihitung dalam skor Anda):

  • k: Array karakter. Setiap karakter adalah karakter yang harus digunakan pada diagram lingkaran
  • v: Array mengapung. Ini persentase dari setiap karakter. Panjangnya vsama dengan panjang k. Jumlah elemen itu selalu 1.0
  • r : Integer> 1. Ini adalah jari-jari diagram lingkaran.

Bonus: Kurangi 20% dari skor Anda jika bisa output pai lengkap (dalam kasus (saya=1|v|vsaya)<1 ).

sebcap26
sumber

Jawaban:

6

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

Contoh:

>>> 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
sumber
Ini dapat direduksi menjadi 231 byte dengan mengganti fungsi s dengan 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])dan menggunakan tanda titik dua untuk meletakkan pernyataan if pada satu barisif 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

Bekerja di Firefox scratchpad.

Contoh pertama

Memasukkan :

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

Keluaran:

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

Contoh kedua:

Memasukkan :

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

Keluaran:

   BBCCC  
  BBBCCCC 
 BBBBCCCCC
 BBBBCCCCC
 BBBBCCCCC
 AAAAAAAAA
 AAAAAAAAA
  AAAAAAA 
   AAAAA  
sebcap26
sumber