पुनरावर्ती स्टेनर चेन


11

स्टीनर चेन एन सर्कल का एक सेट है, जहां प्रत्येक सर्कल 2 अन्य गैर-इंटरसेक्टिंग सर्कल के साथ-साथ श्रृंखला के पिछले और अगले सर्कल के अनुसार स्पर्श होता है, जैसा कि नीचे की छवियों में देखा गया है:

आदेश 3 आदेश 5 आदेश 7

इस चुनौती में, आप एक प्रोग्राम / फ़ंक्शन लिखेंगे, जो स्टीनर श्रृंखला को पुन: आरेखित करता है, अर्थात, एक दी गई श्रृंखला के वृत्त, श्रृंखलाओं के एक और पुनरावृत्ति के आधार वृत्त होंगे:

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

चुनौती

एक प्रोग्राम / फ़ंक्शन लिखें जो छवि आयामों और पूर्णांक की एक सूची को स्वीकार करता है जो श्रृंखला के प्रत्येक क्रमिक पुनरावृत्ति में मंडलियों के स्तर को दर्शाता है, और पुनरावर्ती स्टाइनर श्रृंखलाओं के साथ एक छवि को आउटपुट करता है।

इनपुट

आपका कार्यक्रम / समारोह 2 तर्क स्वीकार करेगा:

  • s - छवि की चौड़ाई और ऊंचाई
  • ls - श्रृंखला के प्रत्येक क्रमिक पुनरावृत्ति में मौजूद हलकों की संख्या को दर्शाने वाले सकारात्मक पूर्णांकों की सूची, सबसे ऊपरी श्रृंखला से लेकर नीचे-सबसे अधिक श्रृंखला तक का आदेश दिया गया

उत्पादन

आपका प्रोग्राम / फंक्शन पुनरावर्ती Steiner श्रृंखला को प्रदर्शित करने वाले आयाम sx की छवि को आउटपुट करेगा s

  • शीर्ष स्तर का आधार चक्र एक व्यास के साथ छवि जितना बड़ा होगा, छवि के sअंदर केंद्रित होगा
  • चीजों को आसान बनाने के लिए, एक स्टाइनर श्रृंखला के 2 आधार वृत्त संकेंद्रित होंगे, अर्थात, 2 आधारभूत मंडलियों के केंद्र बिंदु समान होंगे
  • एक बाहरी त्रिज्या, Rऔर एक श्रृंखला में हलकों की संख्या को देखते हुए, Nआंतरिक त्रिज्या के लिए सूत्र R'हैR' = (R-R*sin(pi/N))/(sin(pi/N)+1)
  • श्रृंखला के सर्किल और साथ ही आंतरिक बेस सर्कल चेन के अगले पुनरावृत्ति के बाहरी आधार सर्कल होंगे
  • श्रृंखला हलकों के माध्यम से पुनरावृत्ति करते समय, अगली श्रृंखला का क्रम अगले मूल्य के अनुरूप होना चाहिए ls
  • एक श्रृंखला के आंतरिक सर्कल के माध्यम से पुनरावृत्ति करते समय, आदेश अपने माता-पिता के आदेश के समान होना चाहिए (उदाहरण [5,2]):
  • आदेश 5.2
  • सभी श्रृंखलाओं की लंबाई की गहराई पर पुनरावृत्ति को समाप्त करना चाहिए ls
  • जंजीरों का घूमना मायने नहीं रखता:
  • रोटेशन १ रोटेशन 2
  • हालांकि, अपने माता-पिता के केंद्र बिंदु के सापेक्ष पुनरावर्ती श्रृंखलाओं का घुमाव समान होना चाहिए:
  • आदेश 5.2 अमान्य आदेश 5.2
  • सभी सर्कल को एक रूपरेखा या ठोस भरण के साथ तैयार किया जाना चाहिए
  • रंग पसंद को कार्यान्वयन के लिए छोड़ दिया गया है, खामियों के लिए बचाओ (उदाहरण के लिए, एक ही रंग के साथ सब कुछ भरना)

उदाहरण रन

निम्नलिखित उदाहरणों में, रंग द्वारा निर्धारित किया जाता है (depth of the recursion)^4

आप यहां स्रोत पा सकते हैं ।

chain(600,[5,4,3])

5.4.3

chain(600,[11,1,1,1,1,1,1])

11.1.1.1.1.1.1

chain(600,[5,6,7,8,9])

5.6.7.8.9


जवाबों:


4

जावास्क्रिप्ट ईएस 6, 379 बाइट्स

इस समाधान का उपयोग प्रश्न में उदाहरण रन बनाने के लिए किया गया था।

f=(s,ls)=>{with(V=document.createElement`canvas`)with(getContext`2d`)with(Math)return(width=height=s,translate(s/=2,s),(S=(o,d=0,n=ls[d],i=(o-o*sin(PI/n))/(sin(PI/n)+1),r=0)=>{fillStyle=`rgba(0,0,0,${pow(d/ls.length,4)})`;beginPath(),arc(0,0,o,-PI,PI),fill();if(d++<ls.length){S(i,d,n);for(;r<n;++r){save();translate(0,(o+i)/2);S((o-i)/2,d);restore();rotate((2*PI)/n);}}})(s),V)}

Ungolfed:

f=(s,ls)=>{                                        // define function that accepts image dimensions and a list of orders
 with(V=document.createElement`canvas`)            // create canvas to draw on, bring its functions into current scope chain
 with(getContext`2d`)                              // bring graphics functions into current scope chain
 with(Math)return(                                 // bring Math functions into current scope chain
  width=height=s,                                  // set width and height of image
  translate(s/=2,s),                               // center the transform on image
   (S=(o,d=0,                                      // define recursive function that accepts outer radius, depth, and optionally order
       n=ls[d],                                    // default chain order to corresponding order in input list
       i=(o-o*sin(PI/n))/(sin(PI/n)+1),            // calculate inner base circle radius
       r=0)=>{                                     // initialize for loop var
    fillStyle=`rgba(0,0,0,${pow(d/ls.length,4)})`; // fill based on depth
    beginPath(),arc(0,0,o,-PI,PI),fill();          // draw circle
    if(d++<ls.length){                             // if within recursion limit
     S(i,d,n);                                     //   recurse on inner circle
     for(;r<n;++r){                                //   loop through all circles of the chain
      save();                                      //   save transform
      translate(0,(o+i)/2);                        //   translate origin to middle of the 2 base circles
      S((o-i)/2,d);                                //   recurse on chain circle
      restore();                                   //   restore transform
      rotate((2*PI)/n);                            //   rotate transform to next circle in chain
   }}})(s),                                        // begin the recursion
 V)}                                               // return the canvas

नोट: fएक कैनवास लौटाता है।

उदाहरण रन (मान लिया गया है कि इसमें <body>संलग्न होना है):

document.body.appendChild(f(600,[13,7,11,5,3]))

निम्न छवि को पृष्ठ पर डंप करना चाहिए:

उत्पादन

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