Biểu đồ bánh nghệ thuật


16

Mục tiêu của bạn là đưa ra một biểu đồ nghệ thuật ASCII. Đây là môn đánh gôn, vì vậy chương trình ngắn nhất (tính số byte của mã nguồn, không phải ký tự) sẽ thắng.

Không cho phép phần mềm hoặc API bên ngoài. Chỉ những người bản địa của mỗi ngôn ngữ.

Góc bắt đầu và hướng (chiều kim đồng hồ / ngược chiều kim đồng hồ) của vòng tròn không quan trọng. Đầu ra có thể trông hình bầu dục vì chiều cao của một nhân vật luôn vượt trội so với chiều rộng của nó.

"Nền" (ký tự ở bên trái hoặc bên phải của chiếc bánh) phải là khoảng trắng.

Là đầu vào, bạn có ba biến (vui lòng đăng mã để khởi tạo nó. Việc khởi tạo các biến này không được tính vào điểm số của bạn):

  • k: Mảng ký tự. Mỗi nhân vật là một nhân vật phải được sử dụng trên biểu đồ hình tròn
  • v: Mảng phao. Đó là tỷ lệ phần trăm của mỗi nhân vật. Độ dài vbằng với chiều dài của k. Tổng các phần tử của nó luôn là 1,0
  • r : Số nguyên> 1. Đó là bán kính của biểu đồ hình tròn.

Bonus: Trừ 20% điểm số của bạn nếu có thể sản lượng của bạn một chiếc bánh không đầy đủ (trong trường hợp (i=1|v|vi)<1 ).

Câu trả lời:


6

Python: 255 ký tự - 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

Ví dụ:

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

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

Điều này có thể được giảm xuống còn 230 byte bằng cách thay thế hàm s bằng 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])và sử dụng dấu chấm phẩy để đặt câu lệnh if trên một dòngif 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

Hoạt động trong Firefox Scratchpad.

Ví dụ đầu tiên

Đầu vào :

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

Đầu ra:

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

Ví dụ thứ hai:

Đầu vào :

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

Đầu ra:

   BBCCC  
  BBBCCCC 
 BBBBCCCCC
 BBBBCCCCC
 BBBBCCCCC
 AAAAAAAAA
 AAAAAAAAA
  AAAAAAA 
   AAAAA  
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.