একটি স্নোফ্লেক আঁকুন


18

জো বাহামাসে থাকে। এটি শীতকালীন. তার বাচ্চারা হতাশ হ'ল বরফ নেই। জো তার বাচ্চাদের জন্য তুষার তৈরি করতে হবে। ভাগ্যক্রমে, তার একটি 3-ডি প্রিন্টার রয়েছে। তিনি এটি দিয়ে স্নোফ্লেকস তৈরির পরিকল্পনা করছেন। দুর্ভাগ্যক্রমে তার কোনও ধারণা নেই যে স্নোফ্লেক কেমন হবে। আসলে তিনি কখনও স্নোফ্লেক দেখেননি! আসুন আমরা তাকে এমন একটি প্রোগ্রাম তৈরি করে সহায়তা করি যা তার জন্য স্বয়ংক্রিয়ভাবে তার জন্য একটি তুষারপাতের 2 ডি-চিত্র তৈরি করে।

ইনপুট

চিত্রটির ব্যাস (পিক্সেলগুলিতে), চিত্রটির শতাংশ যেটি আসলে একটি স্নোফ্লেক।

আউটপুট

প্রয়োজনীয় ব্যাস সহ স্নোফ্লেকের একটি চিত্র। এটি কোনও ফাইলে সংরক্ষণ করা বা ব্যবহারকারীর কাছে প্রদর্শিত হতে পারে।

বিশেষ উল্লেখ

একটি ওয়েজ তৈরি করুন যার 30 ডিগ্রি কোণ রয়েছে। কীলকের পয়েন্টে প্রাথমিক বীজ সহ একটি ব্রাউনিয়ান ট্রি তৈরি করুন । বাকী চিত্রটি তৈরি করতে 12 বার চিত্রের কেন্দ্রের চারপাশে প্রতিচ্ছবি প্রতিবিম্বিত করুন। স্নোফ্লেকের রঙ সাদা has পটভূমিতে কালো রঙ রয়েছে।

স্কোরিং

ব্রাউনিয়ান ট্রি উত্পন্ন করার বিভিন্ন উপায় রয়েছে এই কারণে, স্কোরটি 10 ​​* সংখ্যার সংখ্যা - গল্ফ স্কোর।

গল্ফ স্কোর নিম্নলিখিত বোনাস সহ প্রোগ্রামের বাইট সংখ্যা হিসাবে সংজ্ঞায়িত করা হয়:

-20% স্নোফ্লেকের প্রতিসাম্য নির্বিচারে নির্দিষ্ট করতে পারে।

-50% স্নোফ্লেকের আকারটি নির্দিষ্ট করতে পারে। (কীলকগুলির পাশগুলির দৈর্ঘ্যের অনুপাত নির্দিষ্ট করতে সক্ষম হয়ে))

সর্বোচ্চ স্কোর জয়।

এখানে একটি চিত্র দেওয়া হয়েছে যা কপলের আকারটি প্রায় 2 অনুপাতের সাথে কী হবে:

কীলক

স্কোরবোর্ড:

মার্টিন বাটন: 10 * 14 - 409 = -269

নিমি: 10 * 1 - 733 * .5 = -356.5

অপ্টিমাইজার: 10 * 5 - 648 = -598

বিজয়ী স্কোর -269 সঙ্গে মার্টিন!



9
আমি বুঝতে পারি না, কেন আমরা যদি এমন কাউকে সাহায্য করতে পারি যে, যিনি কখনও স্নোফ্লেক দেখেননি তারা কেমন দেখতে জানে, আমাদের তাদেরকে অর্ডারের ঘূর্ণমান প্রতিসাম্য তৈরি করার কথা বলা হয়েছে we আমাদের কি এই দরিদ্র লোকটিকে ট্রল করা হচ্ছে?
পিটার টেলর

1
@ কনর "স্কোরটি 10 ​​* সংখ্যা - গল্ফস্কোরের সংখ্যা *" এই প্রোগ্রামটির স্কোর -300000000 হবে। এটা খুব কম।
TheNumberOne

1
6x60deg বিবাহের! @ পিটারটেলারের মন্তব্যের সময় এটি যা বলেছিল তার একটি উন্নতি, তবে আসলে আপনার প্রয়োজন 12x30deg ওয়েজস .. 6 দফার প্রত্যেকটির ডান হাতের জন্য এবং 6 প্রতি পয়েন্টের বাম দিকে 6 প্রতিচ্ছবি প্রতিবিম্বিত হওয়া। বিটিডাব্লু, আমি দ্বিতীয় বোনাস বুঝতে পারছি না
লেভেল রিভার সেন্ট

2
@ অপ্টিমাইজার হয়ে গেছে, এখন আরও পরিষ্কার হওয়া উচিত।
TheNumberOne

উত্তর:


16

গণিত, 409 বাইট

{n,p}=Input[];m=999;Clear@f;_~f~_=0;0~f~0=1;r=RandomInteger;For[i=0,i<m,++i,For[x=m;y=0,f[x+1,y]+f[x-1,y]+f[x,y+1]+f[x,y-1]<1,a=b=-m;While[x+a<0||y+b<0||(y+b)/(x+a)>Tan[Pi/6],a=-r@1;b=r@2-1];x+=a;y+=b];x~f~y=1];Graphics[{White,g=Point/@Join@@{c=Cases[Join@@Table[{i,j}-1,{i,m},{j,m}],{i_,j_}/;i~f~j>0],c.{{1,0},{0,-1}}},Array[Rotate[g,Pi#/3,{0,0}]&,6]},Background->Black,ImageSize->n*p,ImageMargins->n(1-p)/2]

Ungolfed:

{n,p}=Input[];
m = 999;
ClearAll@f;
_~f~_ = 0;
0~f~0 = 1;
r = RandomInteger;
For[i = 0, i < m, ++i,
  For[x = m; y = 0, 
   f[x + 1, y] + f[x - 1, y] + f[x, y + 1] + f[x, y - 1] < 1,
   a = b = -m;
   While[x + a < 0 || y + b < 0 || (y + b)/(x + a) > Tan[Pi/6],
    a = -r@1;
    b = r@2 - 1
    ];
   x += a;
   y += b
   ];
  x~f~y = 1
  ];
Graphics[
 {White, g = 
   Point /@ 
    Join @@ {c = 
       Cases[Join @@ Table[{i, j} - 1, {i, m}, {j, m}], {i_, j_} /;
          i~f~j > 0], c.{{1, 0}, {0, -1}}}, 
  Array[Rotate[g, Pi #/3, {0, 0}] &, 6]},
 Background -> Black,
 ImageSize -> n*p,
 ImageMargins -> n (1 - p)/2
 ]

এটি ইনপুটটি ফর্মটি প্রত্যাশা করে {n,p}যেখানে nপিক্সেলগুলিতে চিত্রের আকার রয়েছে এবং pএটি স্নোফ্লেক দ্বারা coveredাকা চিত্রের শতাংশ percentage

প্রদত্ত প্যারামিটারগুলির সাথে স্নোফ্লেক তৈরি করতে আধ মিনিটের মতো কিছু লাগে। আপনি মান পরিবর্তন করে এটিকে গতি বাড়াতে পারেন mথেকে 999থেকে 99, কিন্তু তারপর ফলাফলের একটু বিক্ষিপ্ত দেখায়। তেমনি, আপনি আরও বড় সংখ্যা ব্যবহার করে গুণমানটি ক্র্যাঙ্ক করতে পারেন তবে তারপরে এটি খুব বেশি সময় নিবে।

আমি ব্রোনিয়ান গাছটি একটি পূর্ণসংখ্যার জালিতে তৈরি করছি, এতে নতুন কণা রেখেছি {999, 0}এবং এলোমেলোভাবে বাম দিকে এবং উপরে বা নীচে (ডানদিকে নয়) সরাচ্ছি যতক্ষণ না তারা বিদ্যমান কণাগুলি আঘাত করে hit আমি 0 থেকে 30 ডিগ্রির মধ্যে জোরে মোশনকেও সীমাবদ্ধ করছি। অবশেষে, আমি সেই অক্ষটিকে এক্স-অক্ষে প্রতিবিম্বিত করি এবং এর 5 টি ঘূর্ণন দিয়ে প্রদর্শন করি।

এখানে কিছু ফলাফল (বৃহত সংস্করণের জন্য ক্লিক করুন):

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

এবং এখানে ব্রাউনিয়ান গাছের বর্ধনের দুটি অ্যানিমেশন রয়েছে (প্রতি ফ্রেমে প্রতি কিল 10 কণা):

এখানে চিত্র বর্ণনা লিখুনএখানে চিত্র বর্ণনা লিখুন


2
বাহ আমি পছন্দ করি ... তাদের সবকটিই আসলে। ফলাফল ভাল!
Sp3000

6

জাভাস্ক্রিপ্ট, ES6, 799 740 695 658 648

fবাইট গণনার অংশ হিসাবে আমি কেবল দুটি ক্যানভাস ট্যাগ এবং নীচের স্নিপেট থেকে ফাংশনটি গণনা করছি। বাকি জিনিস লাইভ ডেমো জন্য

এটি কার্যকরভাবে দেখার জন্য, কেবলমাত্র একটি সাম্প্রতিক ফায়ারফক্সে নীচের স্নিপেটটি ইনপুট বাক্সগুলির মাধ্যমে আকার এবং অনুপাত প্রদান করুন

নোট করুন যে আপনাকে ফলটি আড়াল করতে হবে তারপরে পরপর তুষারপাতের আগে আবার দেখাতে হবে

f=(N,P)=>{E.width=E.height=D.width=D.height=N
E.style.background="#000"
C=D.getContext("2d"),F=E.getContext("2d")
C.strokeStyle='#fff'
M=Math,r=M.random,I=0,n=N/2
C.beginPath()
C.rect(n,n,2,2)
C.fill()
B=_=>{x=n*P/100,y=0,w=[]
do{w.push([x,y])
do{X=2*((r()*2)|0)
Y=2*(((r()*3)|0)-1)
}while(x-X<0||y-Y<0||(y-Y)/(x-X)>.577)
x-=X,y-=Y}while(!C.isPointInPath(n+x,n+y))
I++
w=w.slice(-4)
x=w[0]
C.moveTo(x[0]+n,x[1]+n)
w.map(x=>C.lineTo(n+x[0],n+x[1]))
C.stroke()
E.width=E.height=N
for(i=0;i<12;i++){F.translate(n,n)
i||F.rotate(M.PI/6)
i-6?F.rotate(M.PI/3):F.scale(1,-1)
F.translate(-n,-n)
F.drawImage(D,0,0)}
I<(n*n*P*.22/100)&&setTimeout(B,15)}
B()}
<input placeholder="Input N" id=X /><input placeholder="Input percentage" id=Y /><button onclick="f(~~X.value,~~Y.value)">Create snowflake</button><br>
<canvas id=E><canvas id=D>

বিভিন্ন আকার এবং শতাংশের সাথে এখানে কয়েকটি উদাহরণ সরবরাহ করা হয় are সেরাটির নাম স্কালফ্লেক (তালিকার প্রথম)। চিত্রগুলি সম্পূর্ণ রেজোলিউশনে দেখতে ক্লিক করুন।

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

মার্টিন এবং গিথুব্যাগগোসাইট থেকে প্রচুর সহায়তা এবং ইনপুট।


ইনপুট হিসাবে পূর্ণ হওয়া চিত্রটির এটি শতাংশ নেয় না।
TheNumberOne

@ দ্য বেস্টওনে এটি এখন অ্যাকাউন্টে শতাংশ নেয়। নোট করুন যেহেতু এটি ব্রাউনিয়ান ট্রি ভিত্তিক স্নোফ্লেক, তাই এলোমেলো ভূমিকার ভূমিকা পালনের কারণে শতাংশের বা পালকের দৈর্ঘ্যের অনুপাতও সঠিক হতে পারে না।
অপ্টিমাইজার

এটি এখন যোগ্যতা অর্জন করে।
TheNumberOne

1

হাস্কেল, 781 733 বাইট

প্রোগ্রামটিতে "কিলের পাশের দৈর্ঘ্যের অনুপাত নির্দিষ্ট করুন" বিকল্পের বৈশিষ্ট্য রয়েছে, সুতরাং আপনাকে এটি তিনটি কমান্ড লাইনের যুক্তি দিয়ে কল করতে হবে:

./sf 150 50 40

আর্গুমেন্ট # 1 হ'ল চিত্রের আকার, পাগলের মধ্যে # 2% পিক্সেল এবং পাগলের সংক্ষিপ্ত দিকের দৈর্ঘ্য (%তে) # 3। চিত্রটি "o.png" নামক একটি ফাইলে সংরক্ষণ করা হয়েছে।

150-50-40: 150-50-40

আমার প্রোগ্রামটি কাট-অফ স্পাইকগুলি সহ স্নোফ্লেকগুলি তৈরি করে, কারণ নতুন পিক্সেলগুলি ওয়েজটির মাঝের অক্ষটি থেকে শুরু হয় (সবুজ বিন্দু, নীচে দেখুন) এবং সেখানে থাকার প্রবণতা রয়েছে, কারণ তারা সমানভাবে বাম দিকে উপরে বা নীচে চলে আসে। কূপের বাইরের পিক্সেলগুলি ফেলে দেওয়া হয়, সোজা লাইনগুলি কীলক (সবুজ তীর) এর সীমানায় প্রদর্শিত হয়। আমি খুব অলস পিক্সেলগুলির জন্য অন্য পাথ চেষ্টা করে দেখতে পেলাম।

150-50-40: 150-40-40e

যখন কীলক যথেষ্ট বড় হয় (তৃতীয় যুক্তি 100) মাঝারি অক্ষের স্পাইকগুলি বাড়তে পারে এবং তারপরে 12 টি থাকে।

150-40-100: 150-40-100

কয়েকটি পিক্সেল গোলাকার আকার তৈরি করে (বাম: 150-5-20; ডান 150-20-90)।

150-5-20 150-20-90

কার্যক্রম:

import System.Environment;import System.Random;import Graphics.GD
d=round;e=fromIntegral;h=concatMap;q=0.2588
j a(x,y)=[(x,y),(d$c*e x-s*e y,d$s*e x+c*e y)] where c=cos$pi/a;s=sin$pi/a
go s f w p@(x,y)((m,n):o)|x<1=go s f w(s,0)o|abs(e$y+n)>q*e x=go s f w p o|elem(x-m,y+n)f&&(v*z-z)*(b-q*z)-(-v*q*z-q*z)*(a-z)<0=p:go s(p:f)w(s,0)o|1<2=go s f w(x-m,y+n)o where z=e s;a=e x;b=e y;v=e w/100
main = do 
 k<-getArgs;g<-getStdGen;let(s:p:w:_)=map read k
 i<-newImage(2*s,2*s);let t=h(j 3)$h(\(x,y)->[(x,y),(d$0.866*e x+0.5*e y,d$0.5*e x-0.866*e y)])$take(s*d(q*e s)*p`div`100)$go s[(0,0)]w(s,0)$map(\r->((1+r)`mod`2,r))(randomRs(-1,1)g)
 mapM(\(x,y)->setPixel(x+s,y+s)(rgb 255 255 255)i)((h(j(-3/2))t)++(h(j(3/2))t));savePngFile "o.png" i

@ অপ্টিমাইজার: স্পাইকটি কীলকের মাঝের অক্ষে রয়েছে। পাগড়িটি X-axis এ 15 ডিগ্রি উপরে ও নীচে যায়। একটি *-*-100চিত্রে এর উভয় পক্ষই চিত্রের বাম সীমানায় পৌঁছেছে (পালকের অবস্থানের জন্য দ্বিতীয় চিত্রটি দেখুন)। পাশের প্রায় অর্ধেক অংশে পিক্সেল রয়েছে - অন্যান্য অংশগুলি খালি।
নিমি

1
এই কাউন্টারটি ব্যবহার করে আপনার প্রোগ্রামটির দৈর্ঘ্য 841 বাইট।
TheNumberOne

@ দ্য বেস্টঅন: ইনডেন্ট করার সময় ট্যাব বনাম স্পেস। অতিরিক্ত 4 টি স্পেস যুক্ত করার সময় আমি সেগুলি মিশ্রিত করেছি code style। আমি আমার পোস্ট সম্পাদনা করেছি এবং ট্যাব সেট করেছি, তবে তারা এখনও ফাঁকা স্থান হিসাবে উপস্থিত হয়। কেউ কি জানে কিভাবে ঠিক করতে হবে?
নিমি

@ নিমি সাইটে TheBestOne লিঙ্ক করেছে একটি সামান্য হ্যাশ #লিঙ্ক যা আপনি ক্লিক করতে পারেন। আপনি সেখানে আপনার ট্যাবড কোডটি পেস্ট করতে এবং এটি লিঙ্ক করতে পারেন।
Sp3000

আপনি সম্ভবত কোডটি একটি লিঙ্ক করতে পারে। আপনি ইনডেন্ট করার জন্য ট্যাবগুলির পরিবর্তে স্পেস ব্যবহার করতে পারেন। আপনি code styleপ্রতিটি লাইন 4 স্পেস ইনডেন্ট করে ম্যানুয়ালি পেতে পারেন ।
TheNumberOne

0

প্রসেসিং 2 - 575 টি অক্ষর

একটি ফাইল এফ নেবে যার প্রথম লাইনটি চিত্রের আকার এবং দ্বিতীয়টি ফ্লাক্স ব্যাসার্ধ ius প্রতিবার নতুন পয়েন্ট স্থাপন করা হলে এটি কেন্দ্রের চারদিকে 12 বার আবর্তিত হয়। এটি ঘোরানো ওয়েজ হিসাবে একটি খুব অনুরূপ প্রভাব তৈরি করে, তবে ঠিক একই নয়।

  int d,w,h,k,l,o,p,x,y;
  String n[] = loadStrings("f.txt");
  d=Integer.parseInt(n[0]);
  h=Integer.parseInt(n[1]);
  size(d,d);
  w=d/2;
  k=l=(int)random(d); 
  background(0);
  loadPixels();
  o=p=0;
  pixels[w*w*2+w]=color(255);
  while(true)
  {
    o=k+(int)random(-2,2);
    p=l+(int)random(-2,2);
    if(p*d+o>d*d-1 || p*d+o<0 || o<0 || o>d){
      k=l=(int)random(d);
    }
    else
    {
      if(pixels[p*d+o]==color(255))
      {
        p=l-w;
        o=k-w;
        if(o*o+p*p>h*h){break;}
        float s,c;
        for(int j=0;j<12;j++)
        {
          s=sin(PI*j/6);
          c=cos(PI*j/6);         
          x=(int)((o*c)-(p*s));
          y=(int)(((p*c)+(o*s)));
          pixels[(int)(d*y+x+w+(w*d))]=color(255);
        }
        k=l=(int)random(d);  
      }
      else
      {
        k=o;
        l=p;
      }
    }
  }
  updatePixels(); 

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

আপনি এখানে প্রক্রিয়াজাতকরণ পেতে পারেন


3
এটি নির্দিষ্টকরণের সাথে পুরোপুরি ফিট করে না। আপনি যদি কেন্দ্রটিকে ঘোরানোর পরিবর্তে কেন্দ্রের চারপাশটি প্রতিফলিত করেন তবে এটি যোগ্যতা অর্জন করবে।
TheNumberOne

color(255)color(-1)একটি বাইট সংরক্ষণ করতে পরিণত হতে পারে
ক্রিটিক্সী লিথোস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.