แผนภูมิวงกลมศิลปะ ASCII


16

เป้าหมายของคุณคือส่งออกแผนภูมิวงกลมของ ASCII นี่คือ code-golf ดังนั้นโปรแกรมที่สั้นที่สุด (นับจำนวนไบต์ของซอร์สโค้ดไม่ใช่ตัวอักษร) จะชนะ

ไม่อนุญาตให้มีซอฟต์แวร์หรือ API ภายนอก เฉพาะภาษาพื้นเมืองของแต่ละภาษา

มุมเริ่มต้นและทิศทาง (ตามเข็มนาฬิกา / ทวนเข็มนาฬิกา) ของวงกลมไม่สำคัญ ผลลัพธ์สามารถดูเป็นรูปไข่ได้เนื่องจากความสูงของอักขระจะเหนือกว่าความกว้างของอักขระเสมอ

"พื้นหลัง" (อักขระทางด้านซ้ายหรือด้านขวาของวงกลม) ต้องเป็นช่องว่าง

คุณมีตัวแปรสามตัว (โปรดโพสต์โค้ดเพื่อเริ่มต้นการเริ่มต้นตัวแปรเหล่านี้จะไม่ถูกนับในคะแนนของคุณ):

  • k: อาร์เรย์ของอักขระ อักขระแต่ละตัวเป็นอักขระที่ต้องใช้ในแผนภูมิวงกลม
  • v: อาร์เรย์ลอย เป็นเปอร์เซ็นต์ของตัวละครแต่ละตัว ความยาวของมีค่าเท่ากับความยาวของv kผลรวมขององค์ประกอบคือ 1.0 เสมอ
  • r : Integer> 1. มันคือรัศมีของแผนภูมิวงกลม

(Σผม=1|โวลต์|โวลต์ผม)<1

คำตอบ:


6

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

ตัวอย่าง:

>>> 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)

   .....$$  
  ......$$$
 ......$$$$$
 ......$$$$$
 ......$$$$$
 @@@@@$$$$$$
 @@@@!!!$$$$
 @@@!!!!!$$$
 @!!!!!!!!!$
  !!!!!!!!!
   !!!!!!!  
>>>

สิ่งนี้สามารถลดได้ถึง 231 ไบต์โดยแทนที่ฟังก์ชัน s ด้วยแลมบ์ดาs=lambda k,v,a:' 'if not v else k[0]if a<v[0]else s(k[1:],v[1:],a-v[0])และใช้เซมิโคลอนเพื่อวางคำสั่ง if บนหนึ่งบรรทัดif 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

ทำงานได้ใน Firefox scratchpad

ตัวอย่างแรก

อินพุต:

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

ผลผลิต:

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

ตัวอย่างที่สอง:

อินพุต:

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

ผลผลิต:

   BBCCC  
  BBBCCCC 
 BBBBCCCCC
 BBBBCCCCC
 BBBBCCCCC
 AAAAAAAAA
 AAAAAAAAA
  AAAAAAA 
   AAAAA  
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.