गैस्केट बुन - एक Sierpi knski गाँठ ड्रा


33

एक पूर्णांक N> = 2 को देखते हुए, डिग्री N की एक Sierpi knski गाँठ दिखाने वाली छवि का उत्पादन करें।

उदाहरण के लिए, यहाँ डिग्री 2, 3, 4 और 5 के समुद्री मील हैं:

उपाधि २ डिग्री 3 डिग्री 4 डिग्री 5

पूर्ण आकार देखने के लिए छवियों पर क्लिक करें (उच्च डिग्री जितनी बड़ी छवि)।

विशिष्टता

  1. डिग्री एन के एक Sierpi Sski गाँठ गाइड अंक के रूप में डिग्री N के Sierpiński त्रिकोण के कोने का उपयोग करके तैयार किया गया है। डिग्री N का एक Sierpiierski त्रिभुज डिग्री N-1 का तीन Sierpi triski त्रिकोण है जो एक बड़े त्रिकोण में व्यवस्थित होता है। डिग्री 0 का एक Sierpiilski त्रिकोण एक समभुज त्रिभुज है।
  2. सबसे छोटे घटक त्रिकोण की लंबाई 64 है, जिससे Sierpi triangleski त्रिभुज बनता है, जिस पर गाँठ एक समग्र पक्ष लंबाई आधारित होती है 64 * 2 ^ N
  3. बाहरी त्रिकोण का केंद्र छवि के केंद्र में स्थित है। यह ऊपर और नीचे बराबर सफेद स्थान नहीं देता है।
  4. आउटपुट साइड लंबाई की एक वर्गाकार छवि है छत (64 * 2 ^ N * 2 / ROOT3)जहाँछत (एक्स) है ceiling(x), x से अधिक या उसके बराबर सबसे छोटा पूर्णांक है। यह अंतर्निहित Sierpi triangleski त्रिकोण के शीर्ष शीर्ष के लिए बस इतना बड़ा है कि छवि के भीतर समाहित किया जाए जब त्रिकोण का केंद्र छवि के केंद्र में हो।
  5. एकल वक्र को कड़ाई से बारी-बारी से गुजरना चाहिए। समाधान के तहत या फिर के तहत फिर से चुन सकते हैं।
  6. उदाहरण चित्र काले अग्रभूमि और सफेद पृष्ठभूमि दिखाते हैं। आप किसी भी दो आसानी से प्रतिष्ठित रंगों का चयन कर सकते हैं। एंटी-अलियासिंग की अनुमति है लेकिन आवश्यक नहीं है।
  7. ऐसे अंतराल नहीं होने चाहिए जहां दो आर्क मिलते हैं या जहां वक्र अपने आप से गुजरता है।
  8. आउटपुट किसी भी रेखापुंज प्रारूप छवि फ़ाइल, या किसी भी वेक्टर प्रारूप छवि फ़ाइल के लिए हो सकता है जिसमें एक सही डिफ़ॉल्ट प्रदर्शन आकार शामिल है। यदि आप सीधे स्क्रीन पर प्रदर्शित करते हैं, तो यह एक ऐसे रूप में होना चाहिए जो स्क्रीन से बड़ा होने पर पूर्ण छवि को स्क्रॉल करने की अनुमति देता है।

चाप केंद्र, त्रिज्या और मोटाई का निर्धारण

  1. गाँठ का निर्माण परिपत्र चापों की एक श्रृंखला के रूप में किया जाता है जो उन बिंदुओं पर मिलते हैं जहां उनके स्पर्शरेखा समानांतर होते हैं, एक सहज जुड़ाव देने के लिए। इन आर्क को कुंडलाकार क्षेत्रों (मोटाई के साथ चाप) के रूप में प्रदर्शित किया जाता है।
  2. इन चापों के केंद्र सबसे छोटे उल्टे त्रिकोण के कोने हैं। इस तरह का प्रत्येक शीर्ष बिल्कुल एक चाप का केंद्र है।
  3. प्रत्येक चाप की त्रिज्या होती है 64 * ROOT3 / 2
  4. अपवाद यह है कि तीन सबसे बाहरी त्रिभुजों में (बड़े त्रिभुज के कोनों पर) एक केंद्र होता है जो दो निकटवर्ती आंतरिक कोने का मध्य बिंदु होता है, और इस तरह इसका एक दायरा होता है 64 * (ROOT3 / 2-1 / 2)
  5. प्रत्येक चाप को कुल मोटाई (आंतरिक त्रिज्या और बाहरी त्रिज्या के बीच का अंतर) के साथ दर्शाया जाता है 64 * (ROOT3 / 2) / 4और इस की काली सीमाओं में प्रत्येक की मोटाई होती 64 * (ROOT3 / 2) / 16है इन सीमाओं की सीमा होनी चाहिए, और न केवल एक ठोस पट्टी होना चाहिए।

मापन की इकाई

  1. सभी दूरी पिक्सल में हैं (1 2 आसन्न पिक्सल के बीच क्षैतिज या ऊर्ध्वाधर दूरी है)।
  2. 3 का वर्गमूल 7 महत्वपूर्ण आंकड़ों के लिए सटीक होना चाहिए। यही है, आपकी गणना एक ROOT3 का उपयोग करने के बराबर होनी चाहिए1.7320505 <= ROOT3 < 1.7320515

स्कोरिंग

बाइट्स में सबसे छोटा कोड जीतता है।


सोच रहे लोगों के लिए, एन = 0 और एन = 1 शामिल नहीं हैं क्योंकि वे एक सर्कल और ट्रेफ़िल के अनुरूप हैं, जो एन> = 2 के लिए लागू होने वाले पैटर्न से काफी मेल नहीं खाते हैं। मैं उम्मीद करूंगा कि इस चुनौती के अधिकांश दृष्टिकोणों को 0 और 1 के लिए विशेष केस कोड जोड़ने की आवश्यकता होगी, इसलिए मैंने उन्हें छोड़ने का फैसला किया।


1
क्या यह दिखाने के लिए आरेख बनाने में मदद करेगा कि सभी संख्याएँ किससे संबंधित हैं?
ट्राइकोप्लाक्स

इससे पहले कि मैं अपना उत्तर / कोनों को जोड़ूं, क्या 7 महत्वपूर्ण आंकड़े छोटे विवरण के लिए आवश्यक हैं जैसे लाइन की मोटाई, आदि? "7 महत्वपूर्ण आंकड़े या 1 पिक्सेल, जो भी बड़ा हो" जैसी सटीकता अधिक उपयुक्त लगती है।
लेवल रिवर सेंट

@LevelRiverSt इनपुट के साथ छवि के आकार के बाद से, यहां तक ​​कि 7 महत्वपूर्ण आंकड़े बड़े एन के लिए 1 पिक्सेल सटीकता के लिए अपर्याप्त हैं। मैंने चैट में कुछ चर्चा के बाद 7 महत्वपूर्ण आंकड़ों पर समझौता किया है, ताकि सभी उत्तर एक ही हो मानक।
ट्राइकोप्लाक्स

हाँ यह बड़े आकार के चित्र के स्केलिंग के लिए आवश्यक है। 1000000 x 1000000 छवि पर 7 महत्वपूर्ण आंकड़े 0.1 पिक्सेल से मेल खाते हैं, लेकिन मध्यवर्ती गणना के साथ यह इससे भी बदतर हो सकता है। मुझे लगता है कि stroke-width:3.464102इसी तरह से थोड़ा अधिक है अगर विचार 1 पिक्सेल सटीकता प्राप्त करना था। मैं आगे बढ़ूंगा और इसे उस तरह से शामिल करूंगा, हालांकि, अगर वह सत्तारूढ़ है।
लेवल रिवर सेंट

जवाबों:


27

रूबी, 1168 932

पिछली रात से एक गलती को ठीक कर दिया, और स्पष्ट करने के बाद अधिक गोल्फिंग करना।

यह (वर्तमान में) एक पूर्ण कार्यक्रम है जो स्टड से एक संख्या को स्वीकार करता है और एक svgफाइल को स्टडआउट के लिए आउटपुट करता है । मैंने svg को चुना क्योंकि मुझे पता था कि प्रश्न की सभी आवश्यकताओं को पूरा करना संभव था, लेकिन इसमें कुछ मुद्दे थे। विशेष रूप से एसवीजी केवल pathऑब्जेक्ट के हिस्से के रूप में हलकों के आर्क्स का समर्थन करता है, और उन्हें उनके केंद्र के संदर्भ में परिभाषित नहीं करता है, बल्कि दो समापन बिंदुओं के रूप में।

कोड

n=gets.to_i
r=64*w=0.75**0.5
m=1<<n-2
z=128*m/w
a=(s="<path style='fill:none;stroke:black;stroke-width:3.464102' transform='translate(%f %f)'
")%[0,r-r*m*8/3]+"d='M18.11943,-2A#{b=r-6*w-32} #{b} 0 0,0 #{-b} 0#{k='A%f %f 0 0 '%([58*w]*2)}0 0,38.71692
M28.58980,1.968882#{l='A%f %f 0 0 '%([70*w]*2)}0 #{c=r+6*w-32} 0A#{c} #{c} 0 0,0 #{-c} 0#{l}0 -9 44.65423'/>"
p=2
m.times{|i|(i*2+1).times{|j|(p>>j)%8%3==2&&a<<s%[128*(j-i),r*3+r*i*4-r*m*8/3]+
"d='M-55,44.65423#{k}0 11.5,25.11473#{l}1 35.41020,1.968882
M-64,51.48786#{l}0 20.5,30.31089#{k}1 36.82830,13.17993
M-82.17170,-2.408529#{l}1 -11.5,25.11473#{k}0 0,38.71692
M-81.52984 8.35435#{k}1 -20.5,30.31089#{l}0 -9,44.65423
M9,44.65423#{k}0 81.52984,8.35435
M0,51.48786#{l}0 91.17169,13.17993'/>"}
p^=p*4}
puts "<svg xmlns='http://www.w3.org/2000/svg' viewBox='#{-z} #{-z} #{e=2*z+1} #{e}' width='#{e}px' height='#{e}px'>"+
"<g transform='rotate(%d)'>#{a}</g>"*3%[0,120,240]+"</svg>"

आउटपुट N = 4

स्टैक एक्सचेंज द्वारा rescaled। मूल के रूप में बहुत बेहतर लगता है।

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

सबसे पहले मैंने http://euler.nmt.edu/~jstarret/sierpinski.html जैसा कुछ माना, जहां त्रिभुज तीन अलग-अलग रंगों के स्ट्रैंड में टूट जाता है, जिनमें से प्रत्येक एक कोने से दूसरे कोने तक एक रास्ता बनाता है। अधूरे हलकों को वहां अधूरे हेक्सागोन्स के रूप में दिखाया गया है। हेक्सागोन्स के अंदर हलकों का वर्णन करने से पता चलता है कि सर्कल त्रिज्या होना चाहिएsqrt(3)/2 साइडलेंग्थ का गुना । किस्में को फिर से दिखाए जाने के अनुसार बनाया जा सकता है, लेकिन एक अतिरिक्त जटिलता है क्योंकि कोनों को गोल करने की आवश्यकता है और यह जानना मुश्किल है कि किस दिशा में वक्र करना है, इसलिए मैंने इस दृष्टिकोण का उपयोग नहीं किया।

मैंने जो किया वह निम्नलिखित था।

नीचे दी गई छवि में आप देख सकते हैं कि एन = 2 इकाइयों (हरे रंग में) से संबंधित क्षैतिज ट्विस्ट हैं, जो सियरपिंस्की त्रिकोण और अतिरिक्त ब्रिजिंग ट्विस्ट (नीले रंग में) में व्यवस्थित हैं।

यह सामान्य ज्ञान है कि पास्कल के त्रिकोण पर विषम संख्याएं एक सिरिंस्की त्रिकोण बनती हैं। बाइनरी अंकों का एक सीरपिन्स्की त्रिकोण को एक समरूप तरीके से संख्या के साथ शुरू करके p=1और इसके साथ पुनरावृत्ति से प्राप्त किया जा सकता है p<<1

मैंने इस दृष्टिकोण को संशोधित किया, पर शुरू किया p=2और इसके साथ पुनरावृत्ति किया p*4। यह शून्य के स्तंभों के साथ एक सियरपिन्स्की त्रिभुज को वैकल्पिक रूप से देता है।

अब हम पी का अधिकार कर सकते हैं और अंतिम तीन बिट्स का उपयोग कर निरीक्षण कर सकते हैं %8। यदि वे हैं 010तो हमें एन = 2 इकाई से संबंधित एक हरे रंग की मोड़ को खींचना होगा। यदि वे हैं 101तो हमें एक नीली, शानदार मोड़ खींचना होगा। इन दोनों नंबरों के लिए एक साथ परीक्षण करने के लिए हमें मोडुलो मिल जाता है %3और अगर यह 2 है तो हमें ट्विस्ट खींचने की आवश्यकता है।

अंत में, क्षैतिज घुमाव के अतिरिक्त, हम विकर्ण ट्विस्ट खींचने और चित्र को पूरा करने के लिए 120 और 240 डिग्री के माध्यम से घुमाए गए दो प्रतियां बनाते हैं। वह सब कुछ कोनों को जोड़ना है।

टिप्पणी कोड

n=gets.to_i

#r=vertical distance between rows 
r=64*w=0.75**0.5

#m=number of rows of horizontal twists
m=1<<n-2

#z=half the size of the viewport
z=128*m/w

#s=SVG common to all paths
s="<path style='fill:none;stroke:black;stroke-width:3.464102' transform='translate(%f %f)'
"

#initialize a with SVG to draw top corner loop. Set k and l to the SVG common to all arcs of 58*w and 70*w radius 
a=s%[0,r-r*m*8/3]+
"d='M18.11943,-2A#{b=r-6*w-32} #{b} 0 0,0 #{-b} 0#{k='A%f %f 0 0 '%([58*w]*2)}0 0,38.71692
M28.58980,1.968882#{l='A%f %f 0 0 '%([70*w]*2)}0 #{c=r+6*w-32} 0A#{c} #{c} 0 0,0 #{-c} 0#{l}0 -9 44.65423'/>"

#p is the pattern variable, top row of twists has one twist so set to binary 00000010
p=2

#loop vertically and horizontally
m.times{|i|
 (i*2+1).times{|j|

   #leftshift p. if 3 digits inspected are 010 or 101 
   (p>>j)%8%3==2&&

   #append to a, the common parts of a path...
   a<<s%[128*(j-i),r*3+r*i*4-r*m*8/3]+

   #...and the SVG for the front strand and left and right parts of the back strand (each strand has 2 borders)
"d='M-55,44.65423#{k}0 11.5,25.11473#{l}1 35.41020,1.968882
M-64,51.48786#{l}0 20.5,30.31089#{k}1 36.82830,13.17993
M-82.17170,-2.408529#{l}1 -11.5,25.11473#{k}0 0,38.71692
M-81.52984 8.35435#{k}1 -20.5,30.31089#{l}0 -9,44.65423
M9,44.65423#{k}0 81.52984,8.35435
M0,51.48786#{l}0 91.17169,13.17993'/>"}

#modify the pattern by xoring with 4 times itself for the next row
p^=p*4}

#output complete SVG of correct size with three copies of the finished pattern rotated through 0,120,240 degrees.
puts "<svg xmlns='http://www.w3.org/2000/svg' viewBox='#{-z} #{-z} #{e=2*z+1} #{e}' width='#{e}px' height='#{e}px'>"+
"<g transform='rotate(%d)'>#{a}</g>"*3%[0,120,240]+"</svg>"

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


जहां आप कहते हैं कि "मूल रूप में बहुत बेहतर लगता है" यह कुछ ऐसा जोड़ने के लायक हो सकता है "(पूर्ण आकार देखने के लिए छवि पर क्लिक करें)" किसी को भी जो महसूस नहीं करता है।
ट्राइकोप्लाक्स

@trichoplax ने मुझे छवि पर क्लिक करने के लिए प्रेरित नहीं किया। लेकिन वैसे भी, यह एक पीएनजी है, क्योंकि स्टैक एक्सचेंज svg छवियों को स्वीकार नहीं करता है, इसलिए किनारों को जानबूझकर धुंधला कर दिया जाता है। मेरी स्थानीय एसवीजी फ़ाइल में बहुत क्रिस्प किनारे हैं और यह बेहतर दिखता है।
स्तर नदी सेंट

@trichoplax किया छवि आकार पर त्वरित सुधार। एक और दिन गोल्फ करेंगे।
लेवल रिवर सेंट

1
+1 महान काम। मुझे विशेष रूप से रंग कोडित आरेख के साथ विस्तृत विवरण पसंद है।
ट्राइकोप्लाक्स

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