त्रिकोणमिति के साथ त्रिकोणों को हल करना


13

हाई स्कूल से अपने पुराने त्रिकोणमिति नोट खोदने का समय! चुनौती विभिन्न त्रिकोणों के अज्ञात पक्षों और कोणों को हल करना है। और जैसा कि कोड गोल्फ में प्रथागत है, सबसे छोटा कार्य कोड जीतता है।

यह कोई तुच्छ समस्या नहीं है; अजगर में मेरा संदर्भ कार्यान्वयन वर्तमान में 838 837 वर्णों के नीचे है , लेकिन मुझे यकीन है कि आप गोल्फ समाधानों को बहुत छोटा कर पाएंगे।

इसके अतिरिक्त, यदि आप फंस गए हैं, तो विकिपीडिया पर इस खंड को आपको जाना चाहिए: त्रिभुज: पक्षों और कोणों की गणना करना

इनपुट

निम्नलिखित त्रिकोण इस चुनौती में प्रयुक्त पक्षों और कोणों के नाम दर्शाता है। ध्यान दें कि पक्ष लोअरकेस हैं और कोण अपरकेस हैं।

त्रिभुज

इनपुट को छह अंतरिक्ष-अलग मानों के stdinरूप में या तो कमांड-लाइन तर्क (आपकी पसंद) के रूप में दिया जाता है। छह मूल्य पक्षों a, b, cऔर कोणों के अनुरूप हैं A, B, C। अज्ञात पक्षों को प्रश्न चिह्न ( ?) के रूप में दिया गया है । इनपुट और आउटपुट एंगल दोनों ही रेडियन में होने चाहिए। आप मान सकते हैं कि इनपुट मान सही हैं (आपको कुछ भी मान्य नहीं करना है)। आप यह भी मान सकते हैं कि इनपुट त्रिकोण गैर-पतित है, और यह कि सभी पक्ष और कोण नॉनजरो हैं।

निम्न उदाहरण इनपुट आपको बताता है कि पक्ष aहै 8, पक्ष bहै 12और कोण Aहै 0.5रेडियंस:

8 12 ? 0.5 ? ?

उत्पादन

आउटपुट इनपुट के रूप में एक ही प्रारूप में दिया गया है - छह अंतरिक्ष-अलग संख्या stdout। एकमात्र अपवाद तब है जब इनपुट त्रिकोण को हल करना संभव नहीं है - फिर स्ट्रिंग "No solution"को लिखा जाना चाहिए stdout। यदि दो समाधान संभव हैं, तो वे दोनों उनके बीच एक नई रेखा के साथ आउटपुट होते हैं।

उपरोक्त इनपुट के लिए आउटपुट निम्न है:

8.0 12.0 16.0899264342 0.5 0.802561439714 1.83903121388
8.0 12.0 4.97205505116 0.5 2.33903121388 0.302561439714

आउटपुट के लिए बहुत अधिक सटीकता की आवश्यकता नहीं है, लेकिन कम से कम एक जोड़ी दशमलव की आवश्यकता है।

नियम

  • इनपुट stdinया कमांड-लाइन तर्कों से पढ़ा जाता है
  • आउटपुट को लिखा है stdout
  • यदि दिए गए इनपुट से दो समाधान संभव हैं, तो आउटपुट दोनों
  • यदि एक या दो स्पष्ट समाधान प्राप्त करने के लिए बहुत कम जानकारी है, तो इसे एक "No solution"मामला मानें
  • कोई अंतर्निहित या पहले से मौजूद कोड का उपयोग नहीं किया जा सकता (बेशक आप ट्रिग फ़ंक्शंस का उपयोग कर सकते हैं, लेकिन " solveTriangle" या ऐसा नहीं)
  • सबसे छोटा कोड जीतता है

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

में   3 4 5 ? ? ?

बाहर 3.0 4.0 5.0 0.643501108793 0.927295218002 1.57079630572


में   ? 4 ? 0.64 0.92 1.57

बाहर 3.00248479301 4.0 5.02764025486 0.64 0.92 1.57


में   ? ? 5 ? 0.92 ?

बाहर No solution


में   ? ? 5 ? 0.92 1.57

बाहर 3.03226857833 3.97800936148 5.0 0.65159265359 0.92 1.57


में   8 12 ? 0.5 ? ?

बाहर (दो समाधान)

8.0 12.0 16.0899264342 0.5 0.802561439714 1.83903121388
8.0 12.0 4.97205505116 0.5 2.33903121388 0.302561439714

में   8 12 ? ? .5 ?

बाहर 8.0 12.0 18.3912222133 0.325325285223 0.5 2.31626736837

सौभाग्य!


क्या हम मान सकते हैं कि त्रिभुज गैर-पतित है, जिसकी सभी लंबाई और कोण सकारात्मक हैं (विशेष रूप से, नॉनजेरो)?
बूथ

@boothby हाँ, आप कर सकते हैं। मैं ओपी को अपडेट करूंगा।

1
इसके अलावा ... यदि आप चाहते हैं कि हम सभी समाधानों को प्रिंट करें, तो आपको कम से कम एक पक्ष प्रदान करना होगा। अन्यथा, y'know, अनंत समाधान।
24

@boothby, मैं शायद यहाँ बहुत अस्पष्ट था। मेरा क्या मतलब है, अगर इनपुट के दो समाधान हैं, तो आपको दोनों का उत्पादन करना होगा।

जवाबों:


7

पायथन, 441 वर्ण

from math import*
V=[map(float,raw_input().replace('?','0').split())+[0]]
for i in' '*9:
 W=[]
 for a,b,c,A,B,C,R in V:
  if B and C:A=A or pi-B-C
  if a:
   if A:R=R or a/sin(A)
   else:
    if b and c:A=acos((b*b+c*c-a*a)/2/b/c)
    elif R:N=asin(a/R);W+=[(b,c,a,B,C,N,R)];A=pi-N
  else:a=R*sin(A)
  W+=[(b,c,a,B,C,A,R)]
 V=W
V=[T for T in V if all(t>0 for t in T)]
if V:
 for T in V:print' '.join(map(str,T[:-1]))
else:print'No solution'

क्या उत्तर की गणना करने के लिए आपका ठेठ ट्रिगर होता है। वर्तमान संभावित समाधानों को वी में ट्यूपल्स के रूप में संग्रहीत किया जाता है। किसी भी अज्ञात मूल्यों को 0. एक सातवें चर आर के रूप में दर्ज किया जाता है a/sin(A)==b/sin(B)==c/sin(C)

मैं एक चाल का उपयोग करता हूं जहां बहुत सारे अनावश्यक तर्क से बचने के लिए a / b / c मान प्रत्येक पुनरावृत्ति को चक्रित किया जाता है। आंतरिक लूप को केवल ए साइड या कोण के मूल्यों की गणना करने की आवश्यकता होती है।


मैं चर को साइकिल करने की एक समान चाल का उपयोग करता हूं, लेकिन आप निश्चित रूप से मेरे समाधान को हरा देते हैं। +1, इस से कुछ नए गुर सीखे :)

वैसे, आपके कोड के साथ एक समस्या है: प्रयास करें 8 12 ? ? .5 ?

1
आप इसे 419 बाइट्स के लिए प्राप्त कर सकते हैं यदि आप अनुगामी रेखा को तोड़ते हैं और दो अंतरतम इंडेंटेशन को क्रमशः एक और दो टैब से बदल देते हैं।
जॉय

हाह, यह मेरे समाधान के समान ही दिखता है, भी, हालांकि मैंने "सभी समाधानों" पर ध्यान नहीं दिया था जब तक कि आपने इसे पोस्ट नहीं किया। अगर आप की जगह आप और भी अधिक बचा सकता है if aके साथ if not aऔर 1 स्तर के लिए सशर्त, नीचे समतल।
बूथबुल

4

प्लेन सी, 565 555 530 चार्ट

C कोड गोल्फ के लिए सबसे अच्छी भाषा नहीं है, मुझे लगता है, तो यह सिर्फ मनोरंजन के लिए है।

float t[6],u[6],P=3.1415;x,w,j,k,D,E;
#define y(V) for(V=0;V<6;++V)
#define Y if(p[j]&&p[k]&&
#define A(o,s,a,b,c,A,B,C) z(float*p){y(D)y(E)if(j=D%3,k=E%3,j-k){Y c)w=C=acos((a*a+b*b-c*c)/2/a/b);if(A&&B)w=C=P-A-B;Y C)w=c=sqrt(a*a+b*b-2*a*b*cos(C));if(A&&B&&a)w=b=s(B)*a/s(A);Y A&&!B&&!C)w=B=(x=A<P/2&&a<b&&p==u,1-2*x)*(asin(b*s(A)/a)-x*P);}y(j)k=w&&(p==t||x>0)&&o("%f ",a);o("\n");}main(int l,char*q[]){y(j)sscanf(*++q,"%f",t+j),u[j]=t[j];z(t);z(u);j=w||o("No solution\n");}
A(printf,sin,p[j],p[k],p[3-j-k],p[j+3],p[k+3],p[6-j-k])

के साथ संकलित किया cc -o trig trig.c -lm। कमांड लाइन आर्ग्स के रूप में इनपुट पढ़ता है।


यह समाधान भी विफल रहता है 8 12 ? ? .5 ?- मैंने इसे ओपी में एक अतिरिक्त परीक्षण मामले के रूप में जोड़ा।

1
फिक्स्ड! लंबाई एक साइड इफेक्ट के रूप में कम हुई :)
अलेक्जेंडर बैकलिन

1

पर्ल - 412 चर

कीथ रान्डेल के पायथन सॉल्यूशन के आधार पर एक पर्ल वन-लाइनर के रूप में:

use Math::Trig;@V=((map{tr/?/0/;$_}@ARGV),0);map{my@W;while(($a,$b,$c,$A,$B,$C,$R)=splice@V,0,7){$A||=pi-$B-$C if($B*$C);if($a){if($A){$R||=$a/sin$A;}else{if($b*$c){$A=acos(($b*$b+$c*$c-$a*$a)/2/$b/$c);}elsif($R){$N=asin($a/$R);push@W,$b,$c,$a,$B,$C,$N,$R;$A=pi-$N;}}}else{$a=$R*sin$A;}push@W,$b,$c,$a,$B,$C,$A,$R if($a*$b*$c>=0);}@V=@W;}(1..9);print($V[0]?join' ',map{(((6-$i++)%7)?$_:"\n")}@V:"No solution\n");

यहाँ अधिक पठनीय रूप में है:

use Math::Trig;
@V = ( ( map { tr/?/0/; $_ } @ARGV ), 0 );
map {
    my @W;
    while ( ( $a, $b, $c, $A, $B, $C, $R ) = splice @V, 0, 7 ) {
        $A ||= pi- $B - $C
             if ( $B * $C );
        if ($a) {
            if ($A) { $R ||= $a / sin $A; }
            else {
                if ( $b * $c ) {
                    $A = acos(
                        ( $b * $b + $c * $c - $a * $a ) / 2 / $b / $c );
                } elsif ($R) {
                    $N = asin( $a / $R );
                    push @W, $b, $c, $a, $B, $C, $N, $R;
                    $A = pi- $N;
                }
            }
        } else {
            $a = $R * sin $A;
        }
        push @W, $b, $c, $a, $B, $C, $A, $R
            if ( $a * $b * $c >= 0 );
    }
    @V = @W;
} ( 1 .. 9 );

print( $V[0]
         ? join ' ', map { ( ( ( 6 - $i++ ) % 7 ) ? $_ : "\n" ) } @V
         : "No solution\n" );
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.