পাই চার্ট তৈরি করুন


14

চ্যালেঞ্জটি সহজ:

বেশ কয়েকটি ইনপুট মানের উপর ভিত্তি করে পাই-চার্ট তৈরি করুন।

ইনপুটটি ইতিবাচক সংখ্যা, দশমিক বা পূর্ণসংখ্যার একটি তালিকা হবে এবং আউটপুটটি পাই-চার্ট হবে যেখানে প্রতিটি ইনপুট মান পৃথক রঙের দ্বারা প্রতিনিধিত্ব করা হয় এবং প্রতিটি অঞ্চলের বাইরে একটি শতাংশের মান থাকে।

নিয়মাবলী:

  • রঙগুলি অবশ্যই চাক্ষুষভাবে পৃথক হতে হবে (সঠিক রঙগুলি alচ্ছিক)
  • কমপক্ষে দুটি এবং সর্বোচ্চ 10 ইনপুট মান থাকবে
  • বৃত্তের ব্যাসার্ধ অবশ্যই [100 300]পিক্সেলের ব্যাপ্তিতে থাকতে হবে
    • ভেক্টর গ্রাফিকগুলি ততক্ষণ ঠিক আছে যতক্ষণ না ডিফল্ট আউটপুট [100, 300]পিক্সেলের ব্যাসার্ধ দেয়
  • শতাংশের মানগুলি পূর্ণসংখ্যা হবে
    • শতাংশের মানটি কোথায় রাখা হবে সে সম্পর্কে কোনও কঠোর নিয়ম নেই, তবে এটি কোন অঞ্চলের অন্তর্গত তা সহজেই দেখতে হবে
    • সবচেয়ে কাছের অক্ষর এবং বৃত্তের বাইরের প্রান্তের মধ্যবর্তী দূরত্ব অবশ্যই [5, 40]পিক্সেলের মধ্যে হতে হবে
    • হরফ alচ্ছিক
  • প্লটটিতে প্রতিটি অঞ্চল পৃথক করে কালো রেখা থাকতে পারে এবং নাও থাকতে পারে
  • পাই চার্ট তৈরির জন্য তৈরি কার্যাদি, উদাহরণস্বরূপ, ম্যাটল্যাব: pieপাইথন: matplotlib.pyplot.pieএবং ম্যাথমেটিকা: PieChartঅনুমোদিত নয়
  • সাধারণ বৃত্তাকারী বিধিগুলি (এটি (1.00, 0.5]যদি থাকে তবে তা নিচে থাকলে (0.5, 0.00))
  • যদি কোনও স্লাইসের শতাংশের মান এর চেয়ে কম হয় তবে 0.5%আউটপুট 0%। স্লাইসটি এখনও প্লটের মধ্যে অন্তর্ভুক্ত করা উচিত।
  • দয়া করে পরীক্ষার জন্য প্লট সরবরাহ করুন (বা কোনও দোভাষীর একটি লিঙ্ক)। এটি কেবলমাত্র 10 ইনপুট মান সহ প্লট দেখানোর জন্য যথেষ্ট (খুব দীর্ঘ উত্তর এড়াতে)

উদাহরণ

নীচের উদাহরণ মান ব্যবহার করুন। আপনি সংখ্যার তালিকার রূপান্তরকারীটি ব্যবহার করে তালিকাগুলিকে একটি উপযুক্ত বিন্যাসে রূপান্তর করতে পারেন , উদাহরণস্বরূপ জিমি 23013 দ্বারা এই 27 বাইটকে

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.50001অবশ্যই গোল করতে হবে 1
স্টিভি গ্রিফিন

উত্তর:


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

জাভাস্ক্রিপ্ট (ES6), 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``)}

@ নীলের সহায়তায় একটি বাইট সংরক্ষণ করেছেন!

ব্যাখ্যা

বর্তমান পৃষ্ঠার এইচটিএমএলে কিছু এসভিজি লিখেছেন। কেন্দ্র 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

@ নীল এটি সেখানে পেয়েছেন, ধন্যবাদ। আমি যথেষ্ট নিশ্চিত যে আরও কিছুটা গল্ফিং করা যেতে পারে যা এটি করা যায়, যেহেতু আমি যখন এটি লিখেছিলাম তখন কিছুটা ছুটে এসেছি।
ব্যবহারকারী81655

শুধুমাত্র 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()?
বিড়াল

@ কেট হ্যাঁ এটা!
ডাইটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.