কণিক বিভাগটি শনাক্ত করুন


13

দ্বি-মাত্রিক বিমানে পাঁচটি স্বতন্ত্র পয়েন্ট দেওয়া হয়েছে, বিন্দু দ্বারা গঠিত কনিক বিভাগের প্রকার নির্ধারণ করুন। আউটপুট এক হইবে circle, hyperbola, ellipse, অথবা parabola

বিধি

  • পয়েন্টগুলি সাধারণ রৈখিক অবস্থানে থাকবে, যার অর্থ কোনও তিনটি পয়েন্ট কলিনারি নয় এবং এইভাবে তাদের মধ্য দিয়ে যাওয়া কনিকটি অনন্য হবে be
  • 5 পয়েন্টের সমন্বয়গুলি -10 এবং 10 এর মধ্যে দশমিক সংখ্যার অন্তর্ভুক্ত হবে।
  • দশমিক / ফ্লোট মানগুলির জন্য নির্ভুলতা আপনার ভাষার নেটিভ ফ্লোট / দশমিক প্রকারের নির্ভুলতা হওয়া উচিত। যদি আপনার ভাষা / ডেটা টাইপটি নির্বিচারে-নির্ভুলতা হয় তবে আপনি দশমিক পয়েন্টের পরে সর্বাধিক প্রয়োজনীয় নির্ভুলতা হিসাবে শূন্যের (যেমন 1.0000000000005 == 1.000000000000) দিকে গোল করে 12 অঙ্ক ব্যবহার করতে পারেন ।
  • আউটপুট ক্যাপিটালাইজেশন কোন ব্যাপার না।
  • কোনিক ellipseবিভাগটি আসলে একটি বৃত্ত হলে আউটপুটিংয়ের অনুমতি নেই। সমস্ত চেনাশোনাগুলি উপবৃত্তাকার, তবে আপনাকে অবশ্যই সুনির্দিষ্ট একটি আউটপুট দিতে হবে।

ভাসমান বিন্দু ভুল ও নির্ভুলতার উপর:

আমি এটি যথাসম্ভব সহজ করার চেষ্টা করছি, যাতে ভাসমান পয়েন্টের ভুলগুলি যাতে সমস্যা না হয়। লক্ষ্যটি হ'ল, যদি ডেটা টাইপটি ভাসা / ডাবলের পরিবর্তে "যাদুকরী অসীম নির্ভুলতা মান" হত, তবে সবকিছু ঠিকঠাকভাবে কাজ করবে। তবে, যেহেতু "যাদুকরী অসীম নির্ভুলতা মান" বিদ্যমান নেই, তাই আপনি কোড লিখেছেন যা ধরে নিয়েছে যে আপনার মানগুলি অসীম নির্ভুলতা এবং ভাসমান পয়েন্টের ভুলগুলির ফলস্বরূপ যে সমস্যাগুলি ক্রপ হয় সেগুলি বৈশিষ্ট্যগুলি রয়েছে, বাগগুলি নয়।

পরীক্ষার কেস

(0, 0), (1, 5), (2, 3), (4, 8), (9, 2) => hyperbola
(1.2, 5.3), (4.1, 5.6), (9.1, 2.5), (0, 1), (4.2, 0) => ellipse
(5, 0), (4, 3), (3, 4), (0, 5), (0, -5) => circle
(1, 0), (0, 1), (2, 1), (3, 4), (4, 9) => parabola

2
ফ্লোটগুলির জন্য, আউটপুটগুলিকে circleখুব বৃত্তাকার উপবৃত্ত থেকে আলাদা করার জন্য ফ্লোট সমতা পরীক্ষা করা প্রয়োজন বলে মনে হয়। আমাদের এখানে কোন নির্ভুলতা অনুমান করা উচিত?
xnor

1
@ মেগো সমস্ত ভাষার জন্য সমস্যার পূর্ণসংখ্যক সংস্করণকে কেন অনুমতি দিচ্ছেন না, তবে বিস্তৃত পরিসর সহ, উদাহরণস্বরূপ -10000 থেকে 10000.
orlp

1
আপনি কি নিশ্চিত যে পরীক্ষার কেস চারটি সঠিক? desmos: desmos.com/calculator/fmwrjau8fd
মালটিসেন

2
এছাড়াও, 3 টিও
মালটিসেন

1
আমি মনে করি আপনি এফপি যথাযথতার সাথে সমস্যাগুলিকে গুরুত্ব দিচ্ছেন না এবং এটি এই কোডগলফের
edc65

উত্তর:


2

মতলব, 154 বাইট

p=input();c=null([p.^2 prod(p,2) p 1+p(:,1)*0]),s={'circle' 'ellipse' 'parabola' 'hyperbola'};s{3+sign(c(3)^2-4*c(1)*c(2))-~max(abs(c(3)),abs(c(1)-c(2)))}

স্যুভারের পরামর্শগুলির জন্য কিছু বাইট সংরক্ষণ করা হয়েছে।

হিসাবে ইনপুট লাগে [x1 y1;x2 y2;x3 y3; etc]। এটি একটি ভ্যান্ডারমনডে ম্যাট্রিক্স ব্যবহার করেছে এবং এর নাল জায়গার ভিত্তি আবিষ্কার করে, যা সর্বদা একক ভেক্টর হবে। তারপরে এটি বৈষম্যমূলক গণনা করে এবং 1 এবং 4 এর মধ্যে একটি সূচক তৈরি করতে এটি ব্যবহার করে যা স্ট্রিং পেতে ব্যবহৃত হয়।

Ungolfed:

p=input();
c=null([p.^2 prod(p')' p ones(length(p),1)]);
s={'circle' 'ellipse' 'parabola' 'hyperbola'};
s{3+sign(c(3)^2-4*c(1)*c(2))-~max(abs(c(3)),abs(c(1)-c(2)))}

sign(...)অংশ, discriminant হিসাব 1 দান যদি এটা ইতিবাচক (পরাবৃত্ত) এর -1 যদি এটা নেতিবাচক (উপবৃত্তাকার), এবং 0 যদি এটা 0 (অধিবৃত্ত) আছে। max(...)Subtracts 1 দূরে যদি এটি একটি বৃত্ত। মতলব অ্যারেগুলি এক-সূচকযুক্ত, সুতরাং 1, 2, 3, 4 মান দেওয়ার জন্য 3 যুক্ত করুন এবং শঙ্কু বিভাগের নামের অ্যারেটিকে সূচীকরণ করতে এটি ব্যবহার করুন।


1
তুলনা করার পরিবর্তে max() == 0আপনি ~max()
এটিকে

1
এছাড়াও এর পরিবর্তে ones(length(p),1)আপনি যা করতে পারেন1+p(:,1)*0
স্যুভার

চিয়ার্স, max()জিনিসটি আমার কাছে নির্বোধ ছিল, আমি সেখানে আগে তুলনা করেছি এবং অবশ্যই অলস হয়েছি! পাওয়ার উপায়টিও onesখুব সুন্দর।
ডেভিড

14

জাভাস্ক্রিপ্ট (ES6), 316 323 347

p=>[1,2,4].some(x=>(d=D(Q=[[x&1,x&2,x&4,0,0,0],...p.map(([x,y])=>[x*x,x*y,y*y,x,y,1])]))?[a,b,c]=Q.map((v,i)=>D(Q.map((r,j)=>(r=[...r],r[i]=x*!j,r)))/d):0,D=m=>m[1]?m[0].reduce((r,v,i)=>r+(i&1?-v:v)*D(m.slice(1).map(r=>r.filter((a,j)=>j-i))),0):m)&&(d=b*b-4*a*c)?d<0?!b&c==a?'Circle':'Ellipse':'Hyperbola':'Parabola'

ম্যাট্রিক্স এবং নির্ধারককে পরিচালনা করার জন্য উপযুক্ত যে কোনও ভাষা আরও ভাল স্কোর করা উচিত (এপিএল, জে, সিজেএম, জেলি)

তথ্যসূত্র: একটি শঙ্কুর সাধারণ ফর্ম , পাঁচটি পয়েন্ট একটি শঙ্কু নির্ধারণ করে , লিনিয়ার সমীকরণের সিস্টেম , নির্ণয়কারী

কার্টেসিয়ান বিমানে, কোন কনিকের সাধারণ সমীকরণ হয়

A*x*x + B*x*y + C*y*y + D*x + E*y + F = 0 

A বা B বা C সমান 0 (অন্যথায় এটি একটি সরল রেখা)

এ ... এফ ছয়টি অজানা। পাঁচটি জোড় (x, y) দিয়ে আমরা পাঁচটি সমীকরণ সহ একটি রৈখিক সিস্টেম তৈরি করতে পারি এবং স্কেলিং একটি মাত্রা সরিয়ে দেয়। অর্থাৎ, আমরা এ, বি বা সি এর মধ্যে একটি সেট করতে পারি যদি এটি 0 না হয় (এবং আমরা জানি যে কমপক্ষে একটি 0 নয়)।

আমি 3 টি সিস্টেম তৈরি এবং সমাধান করার চেষ্টা করছি: প্রথমে এ = 1 চেষ্টা করে। যদি দ্রবণযোগ্য না হয় তবে বি = 1, তারপরে সি। (এর চেয়ে ভাল উপায় আর হতে পারে তবে এটি আমার সেরা)

এ, বি, সি এর মান থাকা আমরা বৈষম্যমূলককে দেখে কনিককে শ্রেণিবদ্ধ করতে পারি d=B*B-4*A*C

  • d == 0 -> প্যারাবোলা
  • d> 0 -> হাইপারবোলা
  • d <0 -> উপবৃত্তাকার, বিশেষত (এ == সি এবং বি == 0) -> বৃত্ত

কম গল্ফড

F=p=>(
  // Recursive function to find determinant of a square matrix
  D=m=>m[1]
    ?m[0].reduce((r,v,i)=>r+(i&1?-v:v)*D(m.slice(1).map(r=>r.filter((a,j)=>j-i))),0)
    :m,
  // Try 3 linear systems, coefficients in Q
  // Five equation made from the paramaters in p
  // And a first equation with coefficient like k,0,0,0,0,0,1 (example for A)  
  [1,2,4].some(
    x => (
      // matrix to calc the determinant, last coefficient is missing at this stage
      Q = [ 
        [x&1, x&2, x&4, 0,0,0] // first one is different
        // all other equations built from the params 
        ,...p.map( ([x,y]) => [x*x, x*y, y*y, x, y, 1] )
      ],
      d = D(Q), // here d is the determinant
      d && ( // if solvable  then d != 0
        // add missing last coefficient to Q
        // must be != 0 for the first row, must be 0 for the other
        Q.map( r=> (r.push(x), x=0) ),
        // solve the system (Cramer's rule), I get all values for A...F but I just care of a,b,c
        [a,b,c] = Q.map((v,i)=>D(Q.map(r=>(r=[...r],r[i]=r.pop(),r))) / d),
        d = b*b - 4*a*c, // now reuse d for discriminant
        d = d<0 ? !b&c==a ? 'Circle' : 'Ellipse' // now reuse d for end result
        : d ? 'Hyperbola' : 'Parabola'
      ) // exit .some if not 0
    ), d // .some exit with true, the result is in d
  )  
)

পরীক্ষা

F=p=>[1,2,4].some(x=>(d=D(Q=[[x&1,x&2,x&4,0,0,0],...p.map(([x,y])=>[x*x,x*y,y*y,x,y,1])]))?[a,b,c]=Q.map((v,i)=>D(Q.map((r,j)=>(r=[...r],r[i]=x*!j,r)))/d):0,D=m=>m[1]?m[0].reduce((r,v,i)=>r+(i&1?-v:v)*D(m.slice(1).map(r=>r.filter((a,j)=>j-i))),0):m)&&(d=b*b-4*a*c)?d<0?!b&c==a?'Circle':'Ellipse':'Hyperbola':'Parabola'

console.log=(...x)=>O.textContent+=x+'\n'

;[
 [[0, 0], [1, 5], [2, 3], [4, 8], [9, 2]]
,[[1.2, 5.3],[4.1, 5.6], [9.1, 2.5], [0, 1], [4.2, 0]]
,[[5, 0], [4, 3], [3, 4], [0, 5], [0, -5]]
,[[1, 0], [0, 1], [2, 1], [3, 4], [4, 9]]
].forEach(t=>console.log(t.join`|`+' => '+F(t)))
<pre id=O></pre>


2
এটা সত্যিই দুর্দান্ত! চমৎকার কাজ!
অ্যালেক্স এ।

2

পাইথন - 234 বাইট

import numpy as n
x=input()
d=[n.linalg.det(n.delete(n.array([[i*i,i*j,j*j,i,j,1]for i,j in x]),k,1))for k in range(6)]
t=d[1]**2-4*d[0]*d[2]
print"hyperbola"if t>0else"parabola"if t==0else"circle"if d[1]==0and d[0]==d[2]else"ellipse"

আমি প্রিন্ট কখনো circleবা parabolaকারণ tএবং d[1]ঠিক কখনোই আঘাত 0, কিন্তু ওপি বলেছেন যে ঠিক ছিল।


1

সি, 500

আমার জাভাস্ক্রিপ্ট উত্তর সিতে পোর্ট করা হয়েছে কেবল এটি করা যায় কিনা তা দেখার জন্য।

ব্যবহার: স্ট্যান্ডার্ড ইনপুট থেকে 10 টি মান পড়ুন

প্রতিধ্বনি 1 0 0 1 2 1 3 4 4 9 | মোচাকৃতি

আউটপুট:

পরাবৃত্ত

পরীক্ষা (আদর্শ)

double D(m,k)double*m;{double t=0;for(int s=1,b=1,x=0;x<6;x++,b+=b)k&b||(t+=s*m[x]*(k+b>62?1:D(m+6,k+b)),s=-s);return t;}i,u,h;double m[36],*t=m+6,w[6],s[3],b,d;main(){for(;i++<5;*t++=d*d,*t++=d*b,*t++=b*b,*t++=d,*t++=b,*t++=1)scanf("%lf%lf",&d,&b);for(u=4;u;u/=2)for(m[0]=u&1,m[1]=u&2,m[2]=u&4,d=D(m,0),h=0;d&&h<3;h++){for(i=0;i<6;i++)w[i]=m[i*6+h],m[i*6+h]=i?0:u;s[h]=D(m,0)/d;for(;i--;)m[i*6+h]=w[i];}b=s[1];d=b*b-4*s[0]*s[2];puts(d?d<0?!b&(s[2]==s[0])?"Circle":"Ellipse":"Hyperbola":"Parabola");}

কম গল্ফড

// Calc determinant of a matrix of side d
// In the golfed code, d is fix to 6
double D(m, d, k)
double*m;
{
    int s = 1, b = 1, x = 0;
    double t = 0;
    for (; x < d; x++, b += b)
        k&b || (
            t += s*m[x] *(k+b+1==1<<d? 1: D(  m + d, d, k + b)), s = -s
        );
    return t;
}

double m[36],d, *t = m + 6, w[6], s[3], a, b, c;
i,u,h;
main()
{
    for (; i++ < 5; )
    {
        scanf("%lf%lf", &a, &b);
        *t++ = a*a, *t++ = a*b, *t++ = b*b, *t++ = a, *t++ = b, *t++ = 1;
    }
    for (u = 4; u; u /= 2)
    {
        m[0] = u & 1, m[1] = u & 2, m[2] = u & 4;
        d = D(m, 6, 0);
        if (d) 
            for (h = 0; h < 3; h++)
            {
                for (i = 0; i < 6; i++)
                    w[i] = m[i * 6 + h],
                    m[i * 6 + h] = i ? 0 : u;
                s[h] = D(m, 6, 0)/d;
                for (; i--; )
                    m[i * 6 + h] = w[i];
            }
    }
    a = s[0], b = s[1], c = s[2];
    d = b*b - 4 * a * c;
    puts(d ? d < 0 ? !b&(c == a) ? "Circle" : "Ellipse" : "Hyperbola" : "Parabola");
}

1

সেজ, 247 বাইট

def f(p):
 for i in[1,2,4]:
  z=[i&1,i&2,i&4,0,0,0]
  M=matrix([z]+[[x*x,x*y,y*y,x,y,1]for x,y in p])
  try:A,B,C=(M\vector(z))[:3]
  except:continue
  d=B*B-4*A*C
  return['parabola','hyperbola','circle','ellipse'][[d==0,d>0,d<0and B==0and A==C,d<0].index(1)]

এটি অনলাইনে চেষ্টা করুন

এই ফাংশনটি একজন iterable লাগে (x,y)ইনপুট হিসাবে জোড়া 3 সম্ভব রৈখিক ব্যবস্থা (প্রতিটি discriminant কম্পিউটিং চেষ্টা করে, A=1, B=1, এবং C=1,) এবং কনিকের সাপেক্ষে অধ্যায় ধরণ discriminant, মান উপর ভিত্তি করে আউটপুট A, Bএবং C

সম্ভবত আরও কিছু গল্ফ করার দরকার আছে তবে আমি সেজে মরিয়া হয়েছি এবং এখনই ঘুম পাচ্ছি, তাই আমি আরও সকালে এটিতে কাজ করব।

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