ত্রিকোণমিতির সাহায্যে ত্রিভুজগুলি সমাধান করা


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

শুভকামনা!


আমরা কি ধরে নিতে পারি যে সমস্ত দৈর্ঘ্য এবং কোণগুলি ধনাত্মক (বিশেষত, ননজারো) সহ ত্রিভুজটি অ-অবনমিত?
বুথবি

@ বুথবি হ্যাঁ, আপনি পারেন আমি ওপি আপডেট করব।

1
এছাড়াও ... আপনি যদি আমাদের সমস্ত সমাধান মুদ্রণ করতে চান তবে আপনাকে কমপক্ষে একটি দিক সরবরাহ করতে হবে। অন্যথায়, আপনি জানেন, অসীম সমাধান।
বুথবি

@ বুথবি, আমি সম্ভবত এখানে খুব অস্পষ্ট ছিলাম। আমার অভিপ্রায়টি হ'ল, যদি ইনপুটটির দুটি সমাধান থাকে তবে আপনাকে উভয়ই আউটপুট করতে হবে।

উত্তর:


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'

উত্তরটি গণনা করার জন্য আপনার সাধারণ ট্রিগার কি? বর্তমান সম্ভাব্য সমাধান ভি মধ্যে tuples 0. একটি সপ্তম পরিবর্তনশীল আর যেমন মান কোনো অজানা মান রেকর্ড করা হয় হিসেবে সংরক্ষণ করা হয় a/sin(A)==b/sin(B)==c/sin(C)

আমি একটি কৌশল ব্যবহার করি যেখানে প্রচুর অপ্রয়োজনীয় যুক্তি এড়াতে প্রতিটি পুনরাবৃত্তিকে / বি / সি মানগুলি সাইকেল করা হয়। অভ্যন্তরীণ লুপটি কেবল এ পাশ বা কোণের মানগুলি গণনা করা প্রয়োজন।


আমি ভেরিয়েবলগুলি সাইক্লিংয়ের অনুরূপ কৌশল ব্যবহার করি তবে আপনি অবশ্যই আমার সমাধানটি পরাজিত করবেন। +1, এর থেকে কয়েকটি নতুন কৌশল শিখেছে :)

যাইহোক, আপনার কোডে একটি সমস্যা আছে: চেষ্টা করুন 8 12 ? ? .5 ?

1
আপনি যদি পেছনের লাইন বিরতিটি শেভ করেন এবং যথাক্রমে দুটি এবং দুটি ট্যাব দিয়ে দুটি অন্তঃস্থ ইন্ডেন্টেশন প্রতিস্থাপন করেন তবে আপনি এটি 419 বাইটে পেতে পারেন।
জোয়

হাহ, এটি আমার সমাধানের সাথেও অনেকটা সাদৃশ্যপূর্ণ, যদিও আপনি এটি পোস্ট করার পরেও "সমস্ত সমাধান" আমি লক্ষ্য করি নি। আপনি যদি প্রতিস্থাপন if aকরেন if not aএবং কন্ডিশনগুলি 1 স্তরে সমতল করেন তবে আপনি আরও বেশি সঞ্চয় করতে পারেন ।
বুথবি

4

সমতল সি, 565 555 530 অক্ষর

সি কোড গল্ফের জন্য সেরা ভাষা নয়, আমার ধারণা, এটি কেবল মজাদার জন্য।

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" );
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.