गणितज्ञ, 193 183 177 173 169 166 बाइट्स
याय, मैथ्स! मैं उस क्षेत्र की साजिश कर रहा हूं जो असमानताओं के एक निश्चित (बल्कि जटिल) सेट को संतुष्ट करता है:
e=RegionPlot[(1<Abs@y<3||c)&&{x,y+12}.(d=2{-5Sin@40°-6,m=5Cos@40°})*{x+15,y+1-2Sign@y}.d<0||c&&x<2m/.c->100<x^2+y^2<144,{x,-15,9},{y,-12,12},Frame->0>1,ImageSize->#]&
उपयोग है e[height]
, जैसे e[100]
:
या e[200]
:
आप देख सकते हैं, कि तेज किनारों को थोड़ा गोल किया गया है। ऐसा इसलिए है क्योंकि इस क्षेत्र को केवल अंतरिक्ष में बिंदुओं के नमूने द्वारा प्लॉट किया जा सकता है, और गणितज्ञ डिफ़ॉल्ट रूप से प्रत्येक पिक्सेल का नमूना नहीं लेता है। एक अन्य विकल्प PlotPoints->#
(जो प्रति पिक्सेल एक नमूना का उपयोग करता है) को जोड़कर नमूना रिज़ॉल्यूशन को बढ़ाया जा सकता है , जिसमें 14 वर्ण शामिल हैं । मैं इसे उस विकल्प के साथ चलाने की सलाह नहीं देता, क्योंकि यह रनटाइम को काफी बढ़ाता है और बमुश्किल दृश्य अपील को इससे आगे बढ़ाता #/4
है। इसलिए, (ओपी के अनुमोदन के बाद) यह स्कोर में शामिल नहीं है।
यहाँ एक थोड़ा ungolfed संस्करण है:
e[height_] := (
angle = 40°;
d = {-5 Sin[angle] - 6, 5 Cos[angle]};
RegionPlot[
(Abs[y] > .5 && Abs[y] < 1.5
||
r > 25 && r < 36)
&&
{x, y + 6}.d > 0
&&
{x + 7.5, y + .5 - Sign[y]}.d < 0
||
r > 25 && r < 36 && x < 5 Cos[angle]
/. r -> x^2 + y^2
,
{x, -7.5, 4.5},
{y, -6, 6},
Frame -> False,
ImageSize -> height
]
);
ध्यान दें कि गोल्फ संस्करण में, मैंने .5
एस से बचने के लिए समन्वित प्रणाली को 2 के एक कारक द्वारा बढ़ाया है , लेकिन यह पता चलता है कि वर्ण गणना वास्तव में समान है।
यहाँ कैसे सूत्र काम किया के लिए एक स्पष्टीकरण है। मैंने आकृति को दो क्षेत्रों में विभाजित किया है। एक अंगूठी और धारियों होता है और साथ सही करने के लिए काट दिया जाता है BCDE
ढलान और साथ बाईं ओर IJ
और GH
ढलानों (जो बाद में पर और अधिक)। दूसरे में एक ही वलय होता है, लेकिन बिंदु के x निर्देशांक पर बस काट दिया जाता है D
। दोनों क्षेत्रों के लिए शर्तें संयुक्त हैं ||
, जो यहां एक सेट संघ के रूप में कार्य करता है।
अंगूठी को केवल इस रूप में परिभाषित किया गया है 5 < r < 6
, जहां r
उत्पत्ति से दूरी है। r²
हालांकि बाहर काम करना आसान है ( x²+y²
), इसलिए मैं 25 < x² + y² < 36
रिंग में सभी बिंदुओं को प्राप्त करने के लिए उपयोग कर रहा हूं ।
धारियों के बीच ±.5
और हैं ±1.5
। हम दोनों धारियों को एक ही समय में, y के मापांक द्वारा संभाल सकते हैं , इसलिए धारियां (अनंत लंबाई की) बस पूरी होती हैं .5 < |y| < 1.5
। फिर, धारियों और अंगूठी के मिलन के लिए, मैं बस उपयोग कर रहा हूं ||
।
दिलचस्प बात शायद यह है कि "मास्क" कैसे प्राप्त करें। प्वाइंट D
का एक x समन्वय है 5 cos 40°
, इसलिए निचले किनारे की देखभाल करने वाला मास्क (केवल रिंग के साथ संयुक्त) है x < 5 cos 40°
। यह सेट चौराहे के माध्यम से लागू किया जा सकता है जो &&
तर्क में अनुवाद करता है।
अन्य मुखौटे वास्तव में मुश्किल हिस्सा हैं। पहले, चलो ढलान मिलता है BCDE
। हम क्रमशः और , क्रमशः C
और D
, के रूप में अंक बना सकते हैं । सदिश रेखा के साथ इंगित करता है तो बस । मास्क को दाईं ओर लगाने के लिए, मुझे केवल यह पता लगाने की ज़रूरत है कि कोई बिंदु उस रेखा के बाईं ओर या दाईं ओर स्थित है (चलो वेक्टर वेक्टर कहते हैं )। मैं से वेक्टर लेने के द्वारा यह पता लगा सकते हैं ब्याज की मेरी बात करने के लिए और एक वेक्टर पर इसे पेश सीधा करने के लिए । प्रक्षेपण का संकेत मुझे उस पक्ष को बताएगा जिस बिंदु पर है। 2 डी में लंबवत वेक्टर को प्राप्त करना बहुत सरल है: निर्देशांक फ्लिप करें और उनमें से एक के संकेत को उल्टा करें। मेरे कोड में वह चर है:(0, -6)
5 (cos 40°, sin 40°)
D - C = (5 cos 40°, 5 sin 40° + 6)
p
C
p
d
(-5 sin 40° - 6, 5 cos 40°)
। C
ब्याज के बिंदु से वेक्टर q = (x, y)
है q - C = (x, y + 6)
। प्रक्षेपण के बीच सिर्फ अदिश उत्पाद (या डॉट उत्पाद) है q
और d
। जिस तरह से मैंने चुना d
वह बाईं ओर इंगित करने के लिए होता है, इसलिए मैं चाहता हूं d.(q-C) > 0
। यह स्थिति दाएं हाथ के मास्क पर लागू होती है।
बाएं हाथ के मुखौटे के लिए मैं मूल रूप से एक ही विचार का उपयोग कर सकता हूं। ढलान समान है और इसलिए ऐसा है d
। मुझे बस अपनी बात को धारियों के निचले-बाएँ कोनों से ऑफसेट करने की आवश्यकता है C
। वे निर्देशांक (-7.5, 0.5)
(ऊपरी पट्टी) और (-7.5, -1.5)
(निचले पट्टी) हैं। तो यह दो धारियों के लिए दो स्वतंत्र नियमों के लिए कहेंगे। हालांकि, ध्यान दें कि निचले मास्क से प्रभावित सभी बिंदु निचली पट्टी में होते हैं और इसलिए नकारात्मक y होते हैं । और ऊपरी मास्क से प्रभावित सभी बिंदुओं में सकारात्मक वाई है । इसलिए मैं बस अपने ऑफसेट को स्विच कर सकता हूं, Sign[y]
जिसका उपयोग 1
सकारात्मक और -1
नकारात्मक के लिए है y
। तो मेरा ऑफसेट बिंदु बन जाता है(-7.5, -0.5 + Sign[y])
। अन्यथा मास्क दाएं हाथ के मास्क की तरह ही काम करता है। बेशक, इस बार प्रक्षेपण को नकारात्मक होना चाहिए। तो, भोलेपन जैसा कुछ होगा RH-projection > 0 && LH-projection < 0
(जो कि मूल रूप से कोड में भी था)। लेकिन हम इसे छोटा कर सकते हैं, क्योंकि एक सकारात्मक और एक नकारात्मक संख्या को गुणा करने पर एक नकारात्मक संख्या देनी होती है, इसलिए यह सिर्फ RH * LH < 0
(जहां RH
और LH
संबंधित अनुमान हैं)।
बस। इसे सभी को एक साथ रखकर निम्नलिखित तार्किक संरचना की ओर जाता है:
(
(is_in_circle || is_in_stripe)
&&
is_between_left_and_right_mask
)
||
(
is_in_circle && left_of_edge
)
बस स्पष्ट होने के लिए, मेरे स्पष्टीकरण में निर्देशांक चुनौती में दिए गए निर्माण आरेख को संदर्भित करते हैं। जैसा कि मेरे कोड के ऊपर उल्लेख किया गया है, वास्तव में उन सभी को गुणा करता है 2
- मैंने इसे बाइट्स को बचाने के लिए बदल दिया है, लेकिन बाइट की गिनती वास्तव में समान है, और मुझे फिर से परिवर्तन को वापस करने के लिए परेशान नहीं किया जा सकता है। इसके अलावा पूर्णांक अच्छे लगते हैं।