एक पाई चार्ट बनाएं


14

चुनौती सरल है:

कई इनपुट मूल्यों के आधार पर पाई-चार्ट बनाएं।

इनपुट सकारात्मक संख्याओं, दशमलव या पूर्णांकों की एक सूची होगी, और आउटपुट एक पाई-चार्ट होगा जहां प्रत्येक इनपुट मानों को अलग-अलग रंगों द्वारा दर्शाया जाता है, और प्रत्येक क्षेत्रों के बाहर प्रतिशत मूल्य।

नियम:

  • रंग नेत्रहीन अलग-अलग होने चाहिए (सटीक रंग वैकल्पिक हैं)
  • कम से कम दो, और अधिकतम 10 इनपुट मान होंगे
  • सर्कल की त्रिज्या रेंज [100 300]पिक्सल में होनी चाहिए
    • वेक्टर ग्राफिक्स ठीक हैं जब तक कि डिफ़ॉल्ट आउटपुट [100, 300]पिक्सेल का एक त्रिज्या देता है
  • प्रतिशत मान पूर्णांक होंगे
    • यह कहते हुए कोई सख्त नियम नहीं है कि प्रतिशत मूल्य कहाँ रखा जाएगा, लेकिन यह आसानी से देखा जाना चाहिए कि यह किस क्षेत्र से संबंधित है
    • निकटतम चरित्र और सर्कल के बाहरी किनारे के बीच की दूरी सीमा [5, 40]पिक्सेल में होनी चाहिए
    • फ़ॉन्ट वैकल्पिक है
  • इस भूखंड में प्रत्येक क्षेत्र को अलग करने वाली काली रेखाएँ हो सकती हैं या नहीं हो सकती हैं
  • पाई चार्ट बनाने के लिए किए गए कार्य, उदाहरण के लिए, MATLAB:, piePython: matplotlib.pyplot.pieऔर Mathematica: PieChartकी अनुमति नहीं है
  • सामान्य गोलाई के नियम (यदि यह (1.00, 0.5]नीचे है तो ऊपर है (0.5, 0.00))
  • यदि किसी स्लाइस का प्रतिशत मान 0.5%आउटपुट से छोटा है 0%। स्लाइस को अभी भी प्लॉट में शामिल किया जाना चाहिए।
  • कृपया परीक्षा के लिए भूखंड प्रदान करें (या दुभाषिया के लिए एक कड़ी)। यह केवल 10 इनपुट मानों के साथ प्लॉट दिखाने के लिए पर्याप्त है (बहुत लंबे उत्तरों से बचने के लिए)

उदाहरण

कृपया नीचे दिए गए उदाहरण मानों का उपयोग करें। आप संख्यात्मक सूची कनवर्टर का उपयोग करके सूचियों को एक उपयुक्त प्रारूप में बदल सकते हैं , उदाहरण के लिए इस 27 बाइट को एक jimmy23013 द्वारा ।

x = [0.3, 1.2] 

यहाँ छवि विवरण दर्ज करें

x = [3, 6, 2, 10]

यहाँ छवि विवरण दर्ज करें

x = [0.4387, 0.3816, 0.7655, 0.7952, 0.1869, 0.4898, 0.4456, 0.6463, 0.7094, 0.7547]

यहाँ छवि विवरण दर्ज करें


"सर्कल की त्रिज्या सीमा [100 300] पिक्सेल में होनी चाहिए।" क्या वेक्टर ग्राफिक्स की भी अनुमति है?
मार्टिन एंडर

@ मार्टिनबटनर, हाँ। यह ठीक है, जब तक कि प्रोग्राम से आउटपुट ऐसा लगता है कि यह डिफ़ॉल्ट रूप से [100, 300] के बीच है। क्या यह पर्याप्त उत्तर है?
स्टीवी ग्रिफ़िन

राउंड 0.5 से 0. क्या यह एक समस्या है?
मैस्किन्स

0.5डिफ़ॉल्ट होने पर शून्य से गोल करना ठीक है । लेकिन 0.500011 को गोल होना चाहिए
स्टीवी ग्रिफ़िन

जवाबों:


12

गणितज्ञ, 186 183 164 बाइट्स

Graphics[{Hue@#,Disk[{0,0},{1,1},a=2Pi{##}],Black,Text[ToString@Round[100(#2-#)]<>"%",5Through@{Cos,Sin}@Mean@a/4]}&@@@Partition[Accumulate[#/Tr@#]~Prepend~0,2,1]]&

आगे गोल्फ हो सकता है। वर्तमान में एक Graphicsवस्तु उत्पन्न करता है। परीक्षण के मामलों:




7

जावास्क्रिप्ट (ईएस 6), 311 310 302 298 बाइट्स

a=>{with(Math)document.write(`<svg height=300>`+a.map(n=>`<path fill=#${(p*4e3|0).toString(16)} d=M135,150L${c(o=100,v=0)}A${[o,o,0,(v=n/=s)+.5|0,0,c(o)]}Z /><text x=${(z=c(135,v/=2))[0]} y=${z[p+=n,1]}>${n*o+.5|0}%</text>`,c=r=>[sin(d=PI*2*(v+p))*r+135,cos(d)*r+150],p=s=0,a.map(n=>s+=n)).join``)}

@Neil की मदद से एक बाइट को बचाया!

व्याख्या

वर्तमान पृष्ठ के HTML में कुछ SVG लिखता है। केंद्र 135 x 150से त्रिज्या 100pxऔर पाठ के केंद्र बिंदु के साथ चार्ट बनाता 135pxहै।

var solution =

a=>{
  with(Math)
  document.write(       // write to HTML body
    `<svg height=300>`+ // create 300px x 300px SVG canvas (width defaults to 300px)
    a.map(n=>           // for each number
      
      // Get the hex colour by multiplying the current position by (roughly) 0xfff
      `<path fill=#${(p*4e3|0).toString(16)
      
      // Calculate the path of the pie slice
      } d=M135,150L${c(o=100,v=0)}A${[o,o,0,(v=n/=s)+.5|0,0,c(o)]
      
      // Text
      }Z /><text x=${(z=c(135,v/=2))[0]} y=${z[p+=n,1]}>${n*o+.5|0}%</text>`,
      
      // Returns [ x, y ] for a certain radius at position v around the pie
      c=r=>[sin(d=PI*2*(v+p))*r+135,cos(d)*r+150],
      p=s=0,             // p = current position around pie (0 - 1)
      a.map(n=>s+=n)     // s = sum of all numbers
    ).join``
    
    +`</svg>` // <- this is just here for the test, so multiple charts can be displayed
  )
}

// Test
;[
  [0.3, 1.2],
  [3, 6, 2, 10],
  [0.4387, 0.3816, 0.7655, 0.7952, 0.1869, 0.4898, 0.4456, 0.6463, 0.7094, 0.7547]
].map(c=>solution(c));


मुझे लगता है कि आप कुछ बाइट्स का उपयोग करके बचा सकते हैं with(Math)c=r=>[sin(d=PI*2*(v+p))*r+135,cos(d)*r+150]
नील

हम्म, आपको लिखना होगा with(Math)var solution = a=>आदि
नील

हम्म, वास्तव में मैं उपयोग कर सकता हूं with। मुझे लगता है कि जब मैं आखिरी कोशिश कर रहा था तो मैं सख्त मोड में था ...
user81655

@ नील वहाँ में मिल गया, धन्यवाद। मुझे पूरा यकीन है कि इस पर कुछ और किया जा सकता है, क्योंकि जब मैंने इसे लिखा था, तब से मैं थोड़ा भाग रहा था।
user81655

केवल 1 बाइट बचाई गई? मुझे लगता है कि यह एक शुरुआत है ...
नील

6

पायथन + पीआईएल, 365 355

from math import*;from random import*
from PIL import Image,ImageDraw
L,a,r=256,0,0.8;l,p,c=L/2,L/6,(L,L,L);I=Image.new('RGB',(L,L),c);D=ImageDraw.Draw(I)
x=input()
for i in x:b=a+ceil(360.0*i/sum(x));D.pieslice((p,p,L-p,L-p),int(a),int(b),tuple(map(randrange,c)));t=(a+b)*0.00872;D.text((l+cos(t)*l*r,l+sin(t)*l*r),str(int((b-a)/3.6))+'%',0);a=b
I.show()

यहाँ छवि विवरण दर्ज करें

सबसे बड़ी उदाहरण सूची के लिए परिणाम:

यहाँ छवि विवरण दर्ज करें


पायथन 2 में, eval(raw_input())पायथन 2 के बराबर नहीं है input()?
बिल्ली

@cat हाँ यह है!
आहार विशेषज्ञ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.