इस बहुभुज का क्षेत्रफल कितना है?


19

एक बहुभुज के क्षेत्र की गणना करें।

इस फावड़ा एल्गोरिथ्म वीडियो से प्रेरित है

कार्य

आपका काम एक प्रोग्राम या फ़ंक्शन बनाना है जो बहुभुज के क्षेत्र की गणना करता है। प्रोग्राम या फ़ंक्शन को मेटा में डिफ़ॉल्ट परिभाषा के अनुसार परिभाषित किया गया है।

इनपुट

आपको बहुभुज के प्रत्येक शीर्ष के एक्स और वाई निर्देशांक प्राप्त होंगे। आप इनपुट को ट्यूपल्स ( [[x1, y1], [x2, y2], etc]), मैट्रिक्स, या फ्लैट सूची ( [x1, y1, x2, y2, etc]) की सूची के रूप में ले सकते हैं । क्रमशः xऔर yसमन्वय वाली दो सूचियों की अनुमति है। कोने को वामावर्त के रूप में गिना जाता है और पहले शीर्ष को अंतिम शीर्ष के रूप में ही प्रदान किया जाता है, इस प्रकार बहुभुज को बंद कर देता है।

यदि आप चाहते हैं कि आप अंतिम शीर्ष के बिना इनपुट ले सकते हैं (इसलिए प्रत्येक समन्वय को केवल एक बार प्राप्त करें)।

आप मान सकते हैं कि बहुभुज के किनारों को काटना नहीं है। आप यह भी मान सकते हैं कि सभी कोने में पूर्णांक निर्देशांक हैं।

उत्पादन

बहुभुज का क्षेत्र। सभी मानक आउटपुट विधियों की अनुमति है। यदि आपकी भाषा फ्लोट डिवीजन के लिए अनुमति नहीं देती है और समाधान पूर्णांक नहीं होगा, तो आपको एक अंश वापस करने की अनुमति होगी। अंश का सरलीकरण आवश्यक नहीं है, इसलिए लौटने 2/4की अनुमति होगी।

मानदंड जीतना

सबसे छोटा कोड जीतता है!

परीक्षण के मामलों

[[4,4],[0,1],[-2,5],[-6,0],[-1,-4],[5,-2],[4,4]]
55

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

[[1,1],[0,1],[1,0],[1,1]]
0.5
1/2

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


इनपुट की [x1, x2, x3], [y1, y2, y3]अनुमति है?
प्रोग्रामर

@ प्रोग्रामर 5000 और मार्टिन एंडर, हां, मैं इसे संपादित करूंगा :)
JAD

मैं सहमत हूं, फिर से मतदान किया।
प्रोग्रामर

1
@flawr मैंने बनाया है कि इस का एक ठग। यह वास्तव में अपने लक्ष्य का एक ठिकाना नहीं है, जो उसी विधि को लागू करने के लिए है जैसा कि यहां पुनरावर्ती रूप से उन बिंदुओं को खोजने की आवश्यकता होगी जो बिंदुओं को पार कर रहे हैं और इसके परिणामस्वरूप काउंटर-क्लॉकवाइज फैशन में परिणामी उप-ऑर्डर करने की आवश्यकता होगी - जो बहुत अधिक जटिल लगता है।
जोनाथन एलन

जवाबों:


13

जेली ,  8  6 बाइट्स

Emigna के लिए -1 बाइट (निरर्थक , ÆḊ2 की बाईं गहराई है)
-1 बाइट Emigna के लिए धन्यवाद, फिर से (आधा, Hचल रहा है, कोई ज़रूरत नहीं है ÷2)

ṡ2ÆḊSH

उदाहरणों के अनुसार काउंटर-क्लॉकवाइज फैशन में निर्देशांक के जोड़े की सूची लेने वाला एक विवादास्पद लिंक (एक दोहराने के साथ) और क्षेत्र लौट रहा है।

इसे ऑनलाइन आज़माएं!

कैसे?

Shoelace एल्गोरिथ्म को लागू करता है, जैसा कि वीडियो में वर्णित है (जो कि मैं दूसरे दिन भी देखता था!)

ṡ2ÆḊSH - Link: list of [x,y] coordinate pairs anticlockwise & wrapped, p
ṡ2     - all overlapping slices of length 2
  ÆḊ   - determinant (vectorises)
    S  - sum
     H - halve

दूसरा परीक्षण-मामला मेरे लिए `-0.5` देता है: o
JAD

ओह, मुझे इसकी जांच करनी होगी ...
जोनाथन एलन

ऐसा इसलिए है क्योंकि [x,y]निर्देशांक के रूप में उन्हें काउंटर-क्लॉकवाइज के बजाय क्लॉकवाइज दिया जाता है। की एक इनपुट [[1,1],[0,1],[1,0],[1,1]]एक वापस आ जाएगी 0.5
जोनाथन एलन

1
वाह, मैं इसे संपादित करूँगा: D
JAD

1
इसके अलावा, Hके बजाय÷2
Emigna

29

गणितज्ञ, १३ बाइट्स

Area@*Polygon

क्या यह अधिक तुच्छ हो सकता है?
श्री एक्सकोडर


o_O - मैं सचमुच
माइंडब्लाउन

3
वह तुम्हारे लिए गणितज्ञ है। हर बोधगम्य चीज भाषा में निर्मित होती है।
ब्रायन मिंटन


16

जावास्क्रिप्ट (ईएस 6), 69 67 47 बाइट्स

@ नोट के लिए धन्यवाद कि हम पूर्ण मूल्य की आवश्यकता नहीं है अगर वर्टिकल को वामावर्त क्रम में क्रमबद्ध करने की गारंटी दी जाती है और इनपुट के रूप में एक फ्लैट सूची लेने का सुझाव देने के लिए, 20 बाइट्स की बचत होती है!

अंतिम वर्टेक्स सहित, वर्टिकल की एक फ्लैट सूची के रूप में इनपुट लेता है।

f=([x,y,...a])=>1/a[0]?x*a[1]/2-y*a[0]/2+f(a):0

इसे ऑनलाइन आज़माएं!

कैसे?

n

area=|(x0y1y0x1)+(x1y2y1x2)++(xn1y0yn1x0)2|


बहुत प्रभावशाली! क्या आप बता सकते हैं कि यह कैसे काम करता है?
रगनिर

दूसरे परीक्षण मामले में खामियों को गलत तरीके से गलत तरीके से आदेश दिया गया था। एब्स जरूरी नहीं होना चाहिए
रिक

आप फ्लैट सूची में 7 बाइट्स को स्विच करने से भी बचा सकते हैं:a=>(g=([x,y,...a])=>1-a?0:x*a[1]-y*a[0]+g(a))(a)/2
रिक

@ सही है - पेट आवश्यक नहीं है। इसके बिना सूत्र हस्ताक्षरित क्षेत्र की गणना करता है, जो सकारात्मक है क्योंकि वर्टिकल वामावर्त क्रम में दिए गए हैं।
आंग्स

@ धन्यवाद! अद्यतित ... लगभग 10 महीने बाद: /
अरनुलद

7

आर, 54 52 बाइट्स

pryr::f({for(i in 2:nrow(x))F=F+det(x[i-1:0,]);F/2})

जो फ़ंक्शन का मूल्यांकन करता है:

function (x) 
{
    for (i in 2:nrow(x)) F = F + det(x[i - 1:0, ])
    F/2
}

पूर्वनिर्धारित का उपयोग करता है F = FALSE = 0। लिंक्ड वीडियो में थरथराहट एल्गोरिथ्म लागू करता है :)

-2 बाइट्स ग्यूसेप के लिए धन्यवाद


-1 i+-1:0सूचकांक के लिए बाइट
Giuseppe

@ गिउसेप नीस। मैं भी निकाल दूंगा +;)
JAD

6

पायथन 3 , 72 71 बाइट्स

from numpy import*
g=lambda x,y:(dot(x[:-1],y[1:])-dot(x[1:],y[:-1]))/2

दो सूचियों को लेता है, जैसा कि टिप्पणियों में अनुमति दी गई थी

x = [x0,x1,x2, ...]
y = [y0,y1,y2, ...] 

इसे ऑनलाइन आज़माएं!

यह मूल रूप से केवल फावड़ा-सूत्र का कार्यान्वयन है । क्या मुझे एक गोल्फ के लिए प्लस पॉइंट मिलेंगे जो आप वास्तव में उस तरह लागू करेंगे? : डी

-1, पीछे किसी स्थान की आवश्यकता नहीं है x,y:



दो सूचियाँ लेना भी प्रश्न के शरीर में उल्लिखित है :) :)
JAD

@JarkoDubbeldam उह, मैंने अभी देखा, कि इसे क्षेत्र का उत्पादन करना है। यह समाधान वर्तमान में केवल क्षेत्र लौटाता है। क्या इसकी अनुमति है या इसे मुद्रित किया जाएगा?
पी। सेहर

मान लौटाने वाला फ़ंक्शन आउटपुट के रूप में गिना जाता है :)
JAD

मुझे लगता है कि अजगर के साथ आपको फ़ंक्शन का नाम भी नहीं देना है, इसलिए अभी शुरू करना lambda x,y:ठीक है।
JAD

@JarkoDubbeldam क्या प्रत्येक भाषा के लिए कहीं भी नियम हैं?
पी। सेहर


4

जेएस (ईएस 6), 98 95 94 93 88 86 82 81 77 73 बाइट्स

(X,Y)=>{for(i in X){a+=(X[i]+X[i-1])*(Y[i]-Y[i-1]);if(!+i)a=0}return a/2}

इनपुट की तरह लेता है [x1, x2, x3], [y1, y2, y3], और दोहराया समन्वय जोड़ी को छोड़ देता है।

-3 बाइट्स @JarkoDubbeldam की बदौलत

-4 बाइट्स @JarkoDubbeldam की बदौलत

-1 बाइट @ZacharyT को धन्यवाद

-4 बाइट्स @ZacharyT को धन्यवाद

-4 बाइट्स @Rick की बदौलत


3

जे, 12 बाइट्स

इनपुट मानकर 2 तत्व सूचियों की सूची है (यानी, एक तालिका)

-:+/-/ .*2[\
  • 2[\ - इसे शॉलेज़ एक्सएस में तोड़ दिया जाता है, अर्थात, 4 एल्म्स के ओवरलैपिंग स्क्वायर
  • -/ .* - प्रत्येक का निर्धारक
  • +/ - यह राशि
  • -: - 2 से भाग दें

यदि हमें एकल सूची के रूप में इनपुट मिलता है, तो हमें पहले एक तालिका में बदलने की जरूरत है, जिससे हमें 20 बाइट्स मिलें:

-:+/-/ .*2[\ _2&(,\)

1
"इनपुट की मानें तो 2 एलिमेंट लिस्ट (यानी, टेबल) की एक सूची है" यह अनुमति है :)
JAD

3

MS-SQL, 66 बाइट्स

SELECT geometry::STPolyFromText('POLYGON('+p+')',0).STArea()FROM g

एमएस SQL ​​2008 और उच्च समर्थन ओपन जियोस्पेशियल कंसोर्टियम (ओजीसी) -समान स्थानिक डेटा / फ़ंक्शंस, जिसका मैं यहां लाभ उठा रहा हूं।

इनपुट डेटा हमारे इनपुट मानकों के अनुसार , पहले से मौजूद टेबल जी के क्षेत्र पी में संग्रहित है ।

इनपुट एक पाठ क्षेत्र है जिसमें निम्न प्रारूप में दिए गए जोड़े हैं: (4 4,0 1,-2 5,-6 0,-1 -4,5 -2,4 4)

अब केवल मनोरंजन के लिए, यदि आपने मेरी इनपुट तालिका को ओपन जियोस्पेशियल कंसोर्टियम-स्टैंडर्ड ज्योमेट्री ऑब्जेक्ट्स (केवल टेक्स्ट डेटा के बजाय) रखने की अनुमति दी है , तो यह लगभग तुच्छ हो जाता है:

--Create and populate input table, not counted in byte total
CREATE TABLE g (p geometry)
INSERT g VALUES (geometry::STPolyFromText('POLYGON((5 5, 10 5, 10 10, 5 5))', 0))

--23 bytes!
SELECT p.STArea()FROM g


0

पर्ल 5 -pa , 62 बाइट्स

map$\+=$F[$i]*($a[($i+1)%@a]-$a[$i++-1]),@a=eval<>}{$\=abs$\/2

इसे ऑनलाइन आज़माएं!

X की सूची के रूप में इनपुट लेता है पहली पंक्ति पर निर्देशांक और उसके बाद Y निर्देशांक की एक सूची है।

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