त्रिभुज का क्षेत्रफल


16

आपके लिए एक और आसान चुनौती।

आपका कार्य

एक प्रोग्राम या फ़ंक्शन लिखें जो इनपुट लेता है, जिसमें 3 जोड़े हैं- और y- निर्देशांक और उनके द्वारा गठित त्रिकोण के क्षेत्र की गणना करता है। उन लोगों के लिए जो इसे गणना करने का तरीका नहीं याद कर सकते हैं, आप इसे यहां पा सकते हैं ।

उदाहरण:

1,2,4,2,3,7       # input as x1,y1,x2,y2,x3,y3
7.5               # output

इसे वुल्फराम अल्फा में देखें

कुछ विचार:

  • इनपुट छह आधार 10 पॉजिटिव पूर्णांक होगा।
  • आप मान सकते हैं कि इनपुट किसी भी उचित प्रारूप में है
  • अंक हमेशा एक वैध त्रिकोण बनाएंगे।
  • आप मान सकते हैं कि इनपुट पहले से ही एक चर में संग्रहीत है जैसे कि t
  • बाइट्स में सबसे छोटा कोड जीतता है!

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

याद रखें कि आपके प्रोग्राम / फ़ंक्शन को एक मान्य क्षेत्र आउटपुट करना चाहिए, इसलिए यह आउटपुट के रूप में एक नकारात्मक संख्या नहीं दे सकता है


1
पुन: आपका संपादन इसका मतलब यह है कि मैं जोड़े की वास्तविक सरणी (जैसे [[1, 2], [4, 2], [3, 7]]) में हो सकता है T?
डेनिस

4
मैं अभी भी असमंजस में हूँ। पोस्ट अभी भी दोनों "3 जोड़े" और "छह ... पूर्णांक" कहती है। ध्यान दें कि किसी एक को हटाने से कुछ उत्तर अमान्य हो जाएंगे।
xnor

1
मुझे पोस्टिंग और उत्तर के बाद प्रश्न परिवर्तन देखना पसंद नहीं है। लेकिन इस बार मैं 2 और बाइट्स बचा सकता हूं, इसलिए यह सब ठीक है
edc65

1
यदि हम उन्हें तीन जोड़े के रूप में ले सकते हैं, तो क्या हम उन्हें एक बहुआयामी सरणी के रूप में ले सकते हैं? वह है, [1 2;4 2;3 7](जूलिया सिंटैक्स का उपयोग करके)?
ग्लेन ओ

2
@YiminRong एक त्रिकोण का क्षेत्र परिभाषा से नकारात्मक नहीं हो सकता है। इससे कोई फर्क नहीं पड़ता कि अंक किस क्रम में हैं।
रेनबोल्ट

जवाबों:


16

सीजेएम, 18 16 बाइट्स

T(f.-~(+.*:-z.5*

CJam दुभाषिया में इसे ऑनलाइन आज़माएं ।

विचार

जैसा कि विकिपीडिया पर उल्लेख किया गया है , त्रिकोण के क्षेत्र की [[0 0] [x y] [z w]]गणना इस प्रकार की जा सकती है |det([[x y] [z w]])| / 2 = |xw-yz| / 2

एक सामान्य त्रिकोण के लिए [[a b] [c d] [e f]], हम इसके पहले शीर्ष को मूल में अनुवाद कर सकते हैं, इस प्रकार त्रिभुज प्राप्त [[0 0] [c-a d-b] [e-a f-b]]कर सकते हैं, जिसका क्षेत्रफल उपरोक्त सूत्र द्वारा गणना की जा सकती है।

कोड

T                  e# Push T.
                   e# [[a b] [c d] [e f]]
   (               e# Shift out the first pair.
                   e# [[c d] [e f]] [a b]
    f.-            e# For [c d] and [e f], perform vectorized
                   e# subtraction with [a b].
                   e# [[c-a d-b] [e-a f-b]]
       ~           e# Dump the array on the stack.
                   e# [c-a d-b] [e-a f-b]
        (+         e# Shift and append. Rotates the second array.
                   e# [c-a d-b] [f-b e-a]
          .*       e# Vectorized product.
                   e# [(c-a)(f-b) (d-b)(e-a)]
            :-     e# Reduce by subtraction.
                   e# (c-a)(f-b) - (d-b)(e-a)
              z    e# Apply absolute value.
                   e# |(c-a)(f-b) - (d-b)(e-a)|
               .5* e# Multiply by 0.5.
                   e# |(c-a)(f-b) - (d-b)(e-a)| / 2

10

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

Area@Polygon@Partition[t,2]

17
मैं प्यार करता हूँ कि यह एक अंतर्निर्मित का उपयोग कैसे करता है और अभी भी cjam उत्तर से अधिक लंबा है।
कारजिनेट

2
@ वास्तविक समस्या है Partition[t,2], जो 2/CJam से मेल खाती है । ;)
मार्टिन एंडर

10

जावास्क्रिप्ट (ईएस 6) 42 .44।

संपादित इनपुट प्रारूप बदल गया है, मैं 2 बाइट्स बचा सकता हूं

एक अनाम फ़ंक्शन जो सरणी को पैरामीटर के रूप में लेता है और परिकलित मान लौटाता है।

(a,b,c,d,e,f)=>(a*(d-f)+c*(f-b)+e*(b-d))/2

एक EcmaScript 6 अनुरूप ब्राउज़र में नीचे स्निपेट का परीक्षण करें।

f=(a,b,c,d,e,f)=>(a*(d-f)+c*(f-b)+e*(b-d))/2

function test()
{
  var v=I.value.match(/\d+/g)
  I.value = v
  R.innerHTML=f(...v)
}
<input id=I onchange="test()"><button onclick="test()">-></button><span id=R></span>


1
क्या आप मानों को मानक मापदंडों के रूप में नहीं ले सकते थे और सरणी बनाने पर अपने आप को 2 वर्णों को बचा सकते थे?
Mwr247

@ Mwr247 चुनौती कहती हैThe input will be a vector with six base 10 positive integers.
edc65

अहा। मैंने शुरू में व्याख्या की थी कि अर्थ के रूप में प्रत्येक जोड़ी एक समन्वय वेक्टर (जैसे वोल्फ्राम उदाहरण) बनाती है, इनपुट के विपरीत एक सरणी तक सीमित होने के नाते, और जैसे कि अन्य प्रारूपों का उपयोग कर सकती है। अब अधिक समझ में आता है।
Mwr247

@ Mwr247 अब आप सही हैं
edc65

8

जूलिया, 32 बाइट्स

abs(det(t[1:2].-t[[3 5;4 6]]))/2

एक क्रॉस उत्पाद के उपयुक्त शब्दों की एक मैट्रिक्स का निर्माण करता detहै, जिसके परिणामस्वरूप मूल्य प्राप्त करने के लिए उपयोग करता है, नकारात्मक से निपटने के लिए पूर्ण मूल्य लेता है, और फिर 2 से विभाजित करता है क्योंकि यह एक त्रिकोण है और समांतर चतुर्भुज नहीं है।


7

मतलाब / ऑक्टेव, 26 बाइट्स

मैं इस बारे में अभी तक नहीं जानता था =)

polyarea(t(1:2:5),t(2:2:6))

6

जावा, 79 88 बाइट्स

float f(int[]a){return Math.abs(a[0]*(a[3]-a[5])+a[2]*(a[5]-a[1])+a[4]*(a[1]-a[3]))/2f;}

बस मूल सूत्र का उपयोग करता है, कुछ खास नहीं।

संपादित करें: पूर्ण मूल्य लेना भूल गया :(


आपको इसे चलाने योग्य बनाने की आवश्यकता नहीं है?
downrep_nation

3
उदाहरण सिर्फ एक फ़ंक्शन कॉल दिखाता है, और यह एक अपेक्षाकृत सामान्य डिफ़ॉल्ट है।
Geobits

2
प्रति प्रश्न, • आप मान सकते हैं कि इनपुट पहले से ही 't' जैसे एक चर में संग्रहीत है। तो, return(t[0]*(t[3]...पर्याप्त होना चाहिए, नहीं?
AdmBorkBork

@TimmyD इसे करते हुए छायादार महसूस करता है, लेकिन यह इसे 62 बाइट्स तक ले जाएगाहम्मम .... मैं इसे कम से कम अभी के लिए छोड़ने जा रहा हूं।
Geobits

5

मिंकोलंग 0.8 , 34 बाइट्स

ndndn0g-n1g-n0g-n0g-1R*1R*-$~2$:N.

किसी को कुछ अंडा चाहिए- n0g?

व्याख्या

बहुत सीधा है। सूत्र का उपयोग करता है |(x2-x1)(y3-y1) - (x3-x1)(y2-y1)|/2

nd      x1, x1
nd      x1, x1, y1, y1
n0g-    x1, y1, y1, x2-x1
n1g-    x1, y1, x2-x1, y2-y1
n0g-    y1, x2-x1, y2-y1, x3-x1
n0g-    x2-x1, y2-y1, x3-x1, y3-y1
1R*     y3-y1, x2-x1, (y2-y1)(x3-x1)
1R*     (y2-y1)(x3-x1), (y3-y1)(x2-x1)
-       (y2-y1)(x3-x1) - (y3-y1)(x2-x1)
$~      |(y2-y1)(x3-x1) - (y3-y1)(x2-x1)|
2$:     |(y2-y1)(x3-x1) - (y3-y1)(x2-x1)|/2 (float division)
N.      Output as integer and quit.

3

JayScript , 58 बाइट्स

एक अनाम फ़ंक्शन घोषित करता है:

function(a,b,c,d,e,f){return (a*(d-f)+c*(f-b)+e*(b-d))/2};

उदाहरण:

var nFunct = function(a,b,c,d,e,f){return (a*(d-f)+c*(f-b)+e*(b-d))/2};
print(nFunct(1,2,4,2,3,7));

जी क्या करता है
लेवल रिवर सेंट

@steveverrill कुछ नहीं, मैं सिर्फ एक बेवकूफ हूँ। फिक्सिंग ...
mınxomaτ


3

PHP - 68 88 89 बाइट्स

कुछ महान संकेत के लिए मार्टजिन का धन्यवाद!

<?=.5*abs(($t[1]-$t[5])*($t[4]-$t[2])-($t[1]-$t[3])*($t[6]-$t[2]))?>

इसका उपयोग करने के लिए, area.phpइस सामग्री के साथ एक फ़ाइल बनाएं , अतिरिक्त रेखा मानती है कि डेटाt ऐनक के एक चर भाग में सहेजा गया है , और अंत में car एक गाड़ी रिटर्न जोड़ता है ताकि आउटपुट अच्छा और अलग हो जाए:

<?php $t = $argv; ?>
<?=.5*abs(($t[1]-$t[5])*($t[4]-$t[2])-($t[1]-$t[3])*($t[6]-$t[2]))?>
␍

इसके बाद कमांड लाइन पर निर्देशांक प्रदान करें x₁ y₁ x₂ y₂ x₃ y₃, जैसे

$ php area.php 1 2 4 2 3 7
7.5

"आप मान सकते हैं कि इनपुट पहले से ही एक चर में संग्रहीत है जैसे कि t।" $a-> $t, $a=$argv;9 बाइट्स को हटा दें
Martijn

उसके बाद, आप बदल सकते हैं <?php echoके साथ <?=एक और 7 बाइट्स बचत,
मार्टिन

आप कह सकते हैं कि यह PHP4.1 है, register_globals=Onआपकी php.iniफ़ाइल (डिफ़ॉल्ट) के साथ। और अधिक पढ़ें php.net/manual/en/security.globals.php
Ismael Miguel


2

आर, 37 बाइट्स

cat(abs(det(rbind(matrix(t,2),1))/2))

निर्देशांक के वेक्टर को एक मैट्रिक्स में परिवर्तित करता है और 1 की एक पंक्ति पर tacks।
निर्धारक की गणना करता है और 2 से विभाजित करता है।
निरपेक्ष परिणाम लौटाता है। यदि आदेश हमेशा दक्षिणावर्त absहोता है , तो इसकी आवश्यकता नहीं होगी।

> t = c(1,2,4,2,3,7)
> cat(det(rbind(matrix(t,2),1))/2)
7.5

2

पायथन 2, 48 47 50 बाइट्स

बहुत आसान; मानक समीकरण इस प्रकार है:

lambda a,b,c,d,e,f:abs(a*(d-f)+c*(f-b)+e*(b-d))/2.

अन्य, इसी तरह सरल दृष्टिकोण लंबे समय तक हैं:

def a(a,b,c,d,e,f):return abs(a*(d-f)+c*(f-b)+e*(b-d))/2. # 57
lambda t:abs(t[0]*(t[3]-t[5])+t[2]*(t[5]-t[1])+t[4]*(t[1]-t[3]))/2. # 67
def a(t):return abs(t[0]*(t[3]-t[5])+t[2]*(t[5]-t[1])+t[4]*(t[1]-t[3]))/2. # 74

एक निर्धारित कार्य के लिए पायथन की पहुंच संख्यात्मक रूप से होती है

एक त्रुटि को पकड़ने के लिए 1 बाइट और xnor के लिए मैडीफ़िश का धन्यवाद ।


आप निकाल सकते हैं 0से 2.0छुट्टी करने के लिए2.
ब्लू

सच, @ muddyfish, धन्यवाद!
सेलेओ

क्या यह पायथन 2 या 3 है? डिवीजन संस्करण के आधार पर अलग-अलग काम करता है ...
mbomb007

स्पष्ट, @ mbomb007।
सेलेओ

1
absउत्तर को सकारात्मक बनाने के लिए आपको एक की आवश्यकता है ।
xnor

2

PHP, 77

@ यिमिन रॉन्ग के जवाब के आधार पर, मैंने महसूस किया कि मैं कुछ बाइट्स के list()बजाय सीधे अन्य $argvचर को संक्षिप्त करने के लिए उपयोग करके इसे बेहतर बना सकता हूं । भीecho एक अंतरिक्ष की जरूरत नहीं है, अगर वहाँ गूंज और बात के बीच सीमांकक गूँजती जा रहा है।

echo$variable;, echo(4+2);और, echo'some string';जबकि समान रूप से मान्य हैंechofunction($variable) भ्रमित पीएचपी।

दूसरी ओर, मैंने abs()गणितीय रूप से सटीक होने के लिए भी जोड़ा , क्योंकि कुछ संयोजनों के साथ "नकारात्मक क्षेत्र" निकलता है

list($t,$a,$b,$c,$d,$e,$f)=$argv;echo.5*abs(($a-$e)*($d-$b)-($a-$c)*($f-$b));

आप इसे सीएलआई के माध्यम से चला सकते हैं

php -r "list($t,$a,$b,$c,$d,$e,$f)=$argv;echo.5*abs(($a-$e)*($d-$b)-($a-$c)*($f-$b));" 1 2 4 2 3 7
7.5

2

AWK - 51 42 बाइट्स

AWK का कोई अंतर्निहित absउपयोग नहीं हैsqrt(x^2) स्थानापन्न करने।

{print sqrt((($1-$5)*($4-$2)-($1-$3)*($6-$2))^2)/2}

के रूप में सहेजें area.awkऔर के रूप में उपयोग करें echo x₁ y₁ x₂ y₂ x₃ y₃ | awk -f area.awk, जैसे

$ echo 1 2 4 2 3 7 | awk -f area.awk
7.5

1

पॉवरशेल, 70 बाइट्स

[math]::Abs(($t[0]-$t[4])*($t[3]-$t[1])-($t[0]-$t[2])*($t[5]-$t[1]))/2

अन्य समाधानों के समान मानक सूत्र का उपयोग करता है। प्रश्न के अनुसार, मान लेता है कि सरणी पूर्व-आबाद है, उदा $t=(1,2,4,2,3,7)। लेकिन ooof , $और []वाक्य रचना इस एक को मारता है ...


उपयोग करने से दंड के बारे में आपकी टिप्पणी $और []मुझे एक AWK समाधान की कोशिश करने के लिए प्रेरित किया, जो लंबाई से, अप्रतिस्पर्धी नहीं है!

1

डीसी , 52 बाइट्स

मान लिया गया इनपुट रजिस्टर में है t के रूप में: x1 y1 x2 y2 x3 y3के साथ x1के शीर्ष पर tके ढेर।

1kLtLtsaLtsbLtdscLtltrlalclbltla-*sd-*se-*leld++2/p

1 2 4 2 3 7stStStStStSt #puts coordinates into register t (closest thing dc has to variables) 1kLtLtsaLtsbLtdscLtltrlalclbltla-*sd-*se-*leld++2/p 7.5

यह क्षेत्र के लिए निम्न सूत्र का उपयोग करता है:

(x1(y2-y3) + x2(y3-y1) + x3(y1 - y2))/2

और प्रक्रिया के त्वरित विराम के लिए:

  • 1k Lt Lt sa Lt sb Lt d sc Lt lt r: दशमलव सटीकता को 1 स्थान पर सेट करें, स्टैक के कुछ हिस्सों tको मुख्य स्टैक में ले जाएँ और मुख्य स्टैक के विभिन्न हिस्सों को स्टोरेज के लिए अन्य रजिस्टरों में स्थानांतरित करें ( dमुख्य स्टैक के शीर्ष को दोहराता है, आदि)r के शीर्ष दो तत्वों को पीछे L/lले जाता है , ले जाएँ / दिए गए रजिस्टर से मुख्य,s में मुख्य स्टैक के ऊपर ले जाता है)

    मुख्य: y3 x3 y2 x1

    y1, बी: x2सी, सी:, y2टी:y3

  • la lc lb lt la: रजिस्टरों में ढेर के शीर्ष कॉपी a, c, b, t, और aइसी क्रम में मुख्य ढेर करने के लिए

    मुख्य: y1 y3 x2 y2 y1 y3 x3 y2 x1

    y1, बी: x2सी, सी:, y2टी:y3

  • - * sd: Calculate ((y3-y1)*x2)और में डाल परिणाम d(रजिस्टरों a, b, c, औरt नहीं रह गया है उपयोग किया जाता है तो मैं अब के ढेर की सूची से उन्हें छोड़ देंगे)

    मुख्य: y2 y1 y3 x3 y2 x1

    घ:((y3-y1)*x2)

  • - * se - *: गणना ((y1-y2)*y3)और ((y2-x3)*x1); पूर्व को स्टोर करें eऔर बाद वाले को मुख्य स्टैक पर छोड़ दें

    मुख्य: ((y2-x3)*x1)

    डी: ((y3-y1)*x2)ई:((y1-y2)*y3)

  • le ld + +: रजिस्टर के शीर्ष eऔर dमुख्य स्टैक पर कॉपी करें , शीर्ष 2 स्टैक मानों की गणना करें (परिणाम को मुख्य स्टैक पर वापस धकेलें) दो बार

    मुख्य: (((y3-y1)*x2)+((y1-y2)*y3)+((y2-x3)*x1))

    डी: ((y3-y1)*x2)ई:((y1-y2)*y3)

  • 2 /: मुख्य स्टैक पर 2 पुश करें, 1 से स्टैक पर 2 मानों को विभाजित करें ( dऔर eअब उपयोग नहीं किया जाता है, उन्हें स्टैक की सूची से हटाकर)

    मुख्य: (((y3-y1)*x2)+((y1-y2)*y3)+((y2-x3)*x1))/2

स्टैक पर मूल्य को फिर से व्यवस्थित करना हम इस स्पष्टीकरण के शीर्ष पर सूत्र के बराबर देख सकते हैं: (x1(y2-y3) + x2(y3-y1) + x3(y1 - y2))/2

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