Eliptik sistem


9

Giriş

Düzlemde beş nokta verildiğinde, göreviniz elipslerin bu noktalardan geçen alanını hesaplamaktır.

Verilen giriş değerleriyle tam olarak bir dejenere olmayan elips yapılabileceğini varsayabilirsiniz.

kurallar

Girdi, noktaların ve koordinatlarına 10karşılık gelen uygun herhangi bir biçimde tamsayılardır . Örneğin, girdiyi tamsayılar listesi olarak veya vb. Olarak alabilirsiniz. Ondalık sayıları da işleyebilirsiniz, ancak yalnızca tamsayılar gereklidir.xy10[x1, y1, x2, y2, ..., x5, y5][[x1, y1], [x2, y2], ..., [x5, y5]]

Çıktı elips alanının temsilidir. Bu, bazı sembolik ifadeler veya en az 8basamaklı ondalık bir değer olabilir .

Bu kod golf, bu yüzden bayttaki en kısa cevap kazanır.

Örnek Giriş ve Çıkış

Giriş:

[-2, 3, 2, 5, 5, 3, 4, 0, 1, -3]

Çıktı:

62,15326783788685

Bu noktalardan geçen elipsin tasviri:

Bu örnek için elips

Daha fazla örnek:

f(60, -92, -31, -10, 78, -19, -27, -35, 91, -37) = 9882.59540465108
f(-9, -4, 7, 7, 10, 1, -7, -10, 0, 7) = 269.5966648188643
f(-3, 2, 0, -5, 4, 0, -4, 1, -1, 2) = 98.54937293879908

Bu herhangi bir şans eseri bu SPOJ probleminden esinlendi mi? http://www.spoj.com/problems/ELLIPSE/
xnor

Değildi. Bu sitede aktif değilim.
Ethan Ward

Çıktının sembolik bir ifade olabileceği ne anlama geliyor?
xnor

@xnor Belki (değerlendirilmemiş) eliptik bir integral?
Mego

2
Annnnd iş için en iyi araç tooooooo gider: Matematik grafik programları! Git şekil: S.
Sihirli Ahtapot Urn

Yanıtlar:


7

Mathematica, 87 80 78 bayt

Area@ImplicitRegion[+##Sign@#&@@Det[{1,##,1##,#^2,#2^2}&@@@{x|y,##}]>0,{x,y}]&

5 girişler Alır: [{x1, y1}, ... , {x5, y5}].

Tam / sembolik bir değer döndürür.

Nasıl?

Izin f(x, y)vektörü göstermek (1, x, y, xy, x^2, y^2)bazıları için x, y.

Daha sonra, satır vektörleri içeren matrisin belirleyicisi [f(x, y), f(x1, y1), f(x2, y2), ..., f(x5, y5)]sıfırdır (x, y), aradığımız elips üzerinde bir noktadır. yani determinant elips için ifade verir.

İfadenin işareti ters çevrilebileceğinden, sabit terimi alır ve tüm ifadeyi sabitin işareti ile çarparız. Bu şekilde, alanı bulmak için ifadeyi 0'dan büyük olarak ayarlayabiliriz.


+1. Bir sorunu nasıl düzelttiğinizi beğendim Sign.
Vitaliy Kaurov

5

MATLAB , 130 124 114 bayt

Giriş, biri x- ve diğeri y-koordinatları için olmak üzere iki sütun vektörü olarak alınır. Bu yöntem, tüm noktalar tam olarak bir elips üzerindeyse tam elips sağlayan en az sekans regresyonunu kullanır ve daha sonra alanı hesaplamak için burada sağlanan formülü (teşekkürler @orlp) uygular .

function A=f(x,y);p=null([x.^2,2*x.*y,y.^2,2*x,2*y,0*x+1]);A=pi*det(p([1,2,4;2,3,5;4:6]))/abs(p(1)*p(3)-p(2)^2)^1.5

Aşağıdaki satırları ekleyerek eğriyi çizebilirsiniz:

X=x;Y=y;
[x,y] = meshgrid(linspace(-7,7,50));
W = [x(:).^2,2*x(:).*y(:),y(:).^2,2*x(:),2*y(:),0*x(:)+1];
Z=x;Z(:) = W*p;
clf;plot(X,Y,'o');hold on;contour(x,y,Z,[0,0]);

Çevrimiçi deneyin!


3

Mathematica 84 Bayt

Bunu ilginç bir problem olarak buldum. Her elips, birim dairenin {x, y} = {Cos (t), Sin (t)} olarak parametrelendirilebilen afin bir dönüşümüdür, böylece daire üzerindeki noktalar {xE, yE ile elipsle eşlenebilir } = A {x, y} + B burada A sabit bir matris ve B bir vektör. Noktaların takılması 10 skaler denklem ve 11 skaler bilinmeyen verir, ancak parametreleştirmenin t = 0'da başlamasına karar verebiliriz, böylece sistem çözülebilir. A matrisinin determinantının mutlak değeri, elips alanının birim daireye oranıdır, bu nedenle Pi ile çarpıyoruz. Max'i almak negatif çözümden kurtulur.

Max[π(a d-b c)/.Solve@MapThread[#2=={e,f}+{a,b}Cos@#+{c,d}Sin@#&,{{0,u,v,w,x},#}]]&

Kullanımı:

%@{{-2, 3}, {2, 5}, {5, 3}, {4, 0}, {1, -3}}

Verim:

(1001 π)/(16 Sqrt[10])

2

Mathematica, 144 bayt

x_±y_:=x^2a+b*x*y+y^2c+d*x+e*y+f;n=∞;Integrate[UnitStep[x±y/.FindInstance[And@@(#±#2==0&@@@#),{a,b,c,d,e,f},Reals,2][[1]]],{x,-n,n},{y,-n,n}]& 


tüm test senaryoları için çalışır

Giriş örneği :[{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]

Sonuçlar

9882.59540465108163146329
269.596664818864334050934
98.5493729387989852754258

JungHwan Min
± ' dan -10 bayt, varsayılan pencerelerde [CP-1252] kodlamada 1 bayttır


Hmm ... Girdi örneğinizde neden sonsuzluk alıyorum?
numbermaniac

@numbermaniac Bilmiyorum. Doğru anladım. bu girişi [{{-3, 2}, {0, -5}, {4, 0}, {-4, 1}, {-1, 2}}]mi kullanıyorsun
J42161217

Evet, ben - bu garip.
numbermaniac

Ben alıyorum (3575880 π)/(2351 Sqrt[2351])bir cevap olarak kabul edilen
J42161217

1
Tuhaf, ClearAlldüzeltmez bile. Oh, endiţelenme haha. Sizin için çalışıyor olduğu sürece. Hangi Mathematica sürümünü kullanıyorsunuz?
numbermaniac

2

Desmos , 101 bayt

u
v
f(a,b,c,h,k,x,y)=(((x-h)cosc+(y-k)sinc)/a)^2+(((x-h)sinc-(y-k)cosc)/b)^2
f(m,n,o,p,q,u,v)~1
mn\pi

Çevrimiçi Desmos çok satırlı macunları sevmez, bu yüzden tek seferde bir satıra girmeniz gerekir veya

Çevrimiçi Deneyin!

Girdi iki liste ile alınır uve v. Çıktı son satırda gösterilir.

Açıklama:

  • İlk iki satır giriş değişkenlerini adlandırır.
  • Üçüncü hat yarıçapları ile, herhangi bir elips için denklem tanımlar aveb , dönme açısı cve ofset (h,k).

    • Prettified, şöyle görünüyor: resim açıklamasını buraya girin
  • Dördüncü satır f, listelerin üzerindeki gerilemeyi uve vyarıçapı mven dönüş açısını ove ofseti(p,q) .

  • Son satır elipsin alanını formülle hesaplar A = pi*r1*r2

Ayrıca biraz genişletilmiş, etkileşimli bir görsel sürüm için Çevrimiçi Deneyin (farklı bağlantı) da kullanabilirsiniz. Beş nokta etrafında hareket edebilir ve elips ve alanı gerçek zamanlı olarak görüntüleyebilirsiniz:

resim açıklamasını buraya girin

Alternatif olarak, bu formülü kullanarak biraz daha uzun bir çözüm ( @ flawr'ın cevabı ile aynı ):

Desmos, 106 bayt

u
v
f(A,B,C,D,E,F,x,y)=Axx+2Bxy+Cyy+2Dx+2Ey+F
f(G,H,I,J,K,L,u,v)~0
\pi(GIL+2HJK-JJK-GKK-HHL)/(GI-HH)^{1.5}

Çevrimiçi Deneyin!


piSon satırda daha önce ters eğik çizgiye ihtiyacınız olmayabilir : Eğer mnpiyazarsam, pi sembolü hala görünür . Ayrıca, " çıktı son satırda gösteriliyor " mu demek istediniz ?
numbermaniac

1
@numbermaniac Ters eğik çizgi koyuyorum çünkü kopyalayıp yapıştırdığımda, yazdığımda mnpibile kelimeler tanımıyor . Ve evet, girdi demekti, girdi değil, teşekkürler.
Scott Milner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.