İki Noktadan Doğrusal İşlev Çözücü (x, y)


10

Görev

(X, y) biçiminde iki Tuple koordinat argümanı alan ve (a, c) biçiminde ilgili doğrusal işlevlerini döndüren bir işlev L () yazın; burada a, x teriminin ve c'nin eş-etkinliğidir y kesme noktasıdır.

Girişin x eksenine dik bir çizgi olmayacağını ve iki girişin ayrı noktalar olduğunu varsayabilirsiniz.

puanlama 

Bu Code Golf: en kısa program kazanır.

Lütfen Dikkat: Temel işleçlerin (+, -, /, *) dışında matematiksel işlevler kullanılmaz.

Misal

İşte Python'daki golf dışı çözümüm.

def L(Point1, Point2):
    x = 0
    y = 1
    Gradient = (float(Point1[y]) - float(Point2[y])) / (float(Point1[x]) - float(Point2[x]))
    YIntercept = Point1[y] - Gradient * Point1[x] 
    return (Gradient, YIntercept)

Çıktı:

>>> L( (0,0) , (1,1) )
(1.0, 0.0)

>>> L( (0,0) , (2,1) )
(0.5, 0.0)

>>> L( (0,0) , (7,1) )
(0.14285714285714285, 0.0)

>>> L( (10,22.5) , (5,12.5) )
(2.0, 2.5)

4
L( (0,0) , (0,1) )?
Howard

1
Girişin X eksenine paralel bir çizgi olmadığını varsayabilirsiniz.
Harry Beadle

2
Girişin X eksenine paralel bir çizgi olmadığını varsayabilirsiniz. Şunu mu demek istediniz: Y ekseni?
Howard

Maalesef, gönderideki düzenleme X eksenine dik, doğruydu.
Harry Beadle

2
L((0,0),(0,0))?
user12205

Yanıtlar:


1

J - 23 karakter

Yeterince açıksözlü. LKullanılacak ikili bir fiili tanımlar (x1,y1) L (x2,y2).

L=:%~/@:-,-/@(*|.)%-&{.

Açıklama:

L=:%~/@:-,-/@(*|.)%-&{.  NB. the function L
                    &{.  NB. x coord of both points
                   -     NB. left x minus right x
             ( |.)       NB. flip right argument: (y2,x2)
              *          NB. pointwise multiplication of (x1,y1) and (y2,x2)
          -/@            NB. subtract the two results: (x1*y2)-(y1*x2)
                  %      NB. divide: (x1*y2 - y1*x2)/(x1-x2)
        -                NB. pointwise subtraction
   %~/@:                 NB. divide y difference by x diff: (y1-y2)/(x1-x2)
         ,               NB. append results together
L=:                      NB. assign function to L

Örnekler:

   L=:%~/@:-,-/@(*|.)%-&{.
   0 0 L 1 1
1 0
   0 0 L 2 1
0.5 0
   0 0 L 7 1
0.142857 0
   10 22.5 L 5 12.5
2 2.5
   0 0 L 0 1  NB. __ is negative infinity
__ 0

7

GNU dc , 30 24 bayt

[sysxly-rlx-/dlx*lyr-]sL

L(X 1 , y 1 , x 2 , y 2 ) çağrıdan önce yığına o sıraya itilecek ve çağrıldıktan sonra L(a, c) yığından (ters sırayla) açılabilecek şekilde bir makro tanımlar . ders - bu bir yığın).

Testcase ("linear.dc" olarak kaydedin ve çalıştırın dc linear.dc):

[sysxly-rlx- / dlx * lyr-] sL # L makrosu tanımla

10 # x1'i yığına itin
22.5 # y1'i yığına it
5 # x2'yi yığına itin
12.5 # Y2'yi yığına it

lLx # Çağrı L makrosu
f # Yığını boşalt

Çıktı:

$ dc linear.dc 
2.5
2
$ 

L makrosunun açıklaması:

  • sykaydolmak için pop y 2y
  • sxkaydolmak için pop x 2x
  • lyitme ykaydı (y 2 )
  • -y 2'yi y 1'den çıkarma
  • ryığın üzerinde takas (y 1 - y 2 ) ve x 1
  • lxitme xkaydı (x 2 )
  • -x 2'yi x 1'den çıkarın
  • /gradyanı elde etmek için (y 1 - y 2 ) öğesini (x 1 - x 2 ) ile bölün
  • d yinelenen gradyan
  • lxitme xkaydı (x 2 )
  • *gradyan ile çarp (x 2 )
  • lyitme ykaydı (y 2 )
  • ryığın üzerinde takas (y 2 ) ve (x 2 * gradyan)
  • -(y 2 ) ' den (x 2 * gradyan) çıkarma

1
Teşekkürler, fena değil. Dayak yendiğimi itiraf ediyorum. ;)
Martin Ender

1
@ m.buettner Yeniden golf oynadı ve yeniden açıkladı.
Dijital Travma

5

Haskell, 41 karakter

f(x,y)(u,v)=(a,y-a*x)where a=(y-v)/(x-u)

Burada golf için çok değil. Normalde eksi boşluk yazacağınız şeydir.


4

Mathematica, 55 38 bayt

Bu şaşırtıcı derecede uzundu (bu sinir bozucu uzun fonksiyon isimleri ...) EDIT: Eksen kesişme yaklaşımını değiştirdi (OP'nin kendi cevabından biraz ilham alarak). Doğrudan hesaplamanın en akıllıca fikir olmadığı ortaya çıkıyor.

L={g=1/Divide@@(#2-#),#[[2]]-g#[[1]]}&

Gibi kullanın

L[{10,22.5},{5,12.5}]
> {2., 2.5}

Mathematica sayesinde genel sonucu da elde edebilirsiniz:

L[{r,s},{p,q}]
> {(p - r)/(q - s), (q r - p s)/(q - s)}

(Bu son örnek, bunu ilk başta nasıl uyguladığımı gösterir.)

Sadece kayıt için

L[{0,0},{0,1}]
> {ComplexInfinity, Indeterminate}

teknik olarak doğrudur.


Ahh, Harika, bunu çözdüğümde biraz zihnim vardı, onu yorgunluğumdan suçlayacağım
Harry Beadle

1
+1. Neden ComplexInfinityyalın değil Infinity? (Mathematica'yı tanımıyorum)
Dijital Travma

3
@DigitalTrauma Bence, Mathematica'ya gerçekte çalışabileceğini açıkça söylemeden, gerçek denklemlerin karmaşık çözümlerini atmamak için söz konusu alanı her zaman karmaşık sayılar olarak kabul eder.
Martin Ender

2

JavaScript, 62 48

@Michael'e ES 6 ile golf oynadığı için teşekkürler.

L=(a,b)=>[s=(b[1]-a[1])/(b[0]-a[0]),a[1]-s*a[0]]

Eski versiyon:

function L(a,b){return[s=(b[1]-a[1])/(b[0]-a[0]),a[1]-s*a[0]]}

Örnek giriş:

L([0,0],[7,1])

Örnek çıktı:

[0.14285714285714285, 0]

Kayıt için:

L([0,0],[0,1])
[Infinity, NaN]

46 ES6 kullanarak:L=(a,b)=>[g=(p=a[1]-b[1])/(q=a[0]-b[0]),p-g*q]
Michael

@Michael Cool. Ben bir tür JS acemi, bu yüzden bunu yapabileceğini bilmiyordum. Teşekkürler.
user12205

@ m.buettner Haklısınız ... Sabit
user12205

1
Şimdi tüm cevaplar tam olarak on karakter aralıklıdır. : D
Martin Ender

1
Awww. Tavşan değişti!
Justin

2

Python3 (51)

def L(p,q):x,y=p;X,Y=q;m=(Y-y)/(X-x);return m,y-x*m

2

C # 105 bayt

Bu sadece işlev değildir ve tamamen kendi başına derlenecektir. Kullanım alanını kısaltmak Liçin Systemad alanına koydum , ancak bir ad alanını kullanmaya tam olarak hak kazanmak ve tasarruf etmek daha iyidir. Parantezleri kaydetti. Ayrıca return new z[]içine tasarrufreturn new[]

using z=System.Single;class P{z[] L(z[]a,z[]b){z c=(a[1]-b[1])/(a[0]-b[0]);return new[]{c,a[1]-c*a[0]};}}

(c*a[0])gerekli? Bu parantezi ortadan kaldıramaz ve 2 bayt kaydedemez misiniz?
Kyle Kanos

@KyleKanos Evet, teşekkürler. C # BODMAS'ı kullanmazken, çarpma önce yapılacaktır (sanırım).
Nathan Cooper

Bu çözümün geçerli olması için namespacebeyanı eklemeniz veya olarak değiştirmeniz gerektiğini söyleyebilirim System.Single.
Tim S.

1

Lua 5.1.4: 66 64 bayt

function L(q,w)a=(q[2]-w[2])/(q[1]-w[1])return a,q[2]-a*q[1];end

Örnek Kullanım:

> print(L( {0,0}, {1,0} ))
-0   0
> print(L( {0,0}, {1,1} ))
1    0
> print(L( {0,0}, {7,1} ))
0.14285714285714    0
> print(L( {0,0}, {0,1} ))
-inf   -nan
> print(L( {0,0}, {0,0} ))
-nan   -nan

1

C ++ 88 (106'ydı)

Geliştirildi: yorumlarınız için teşekkürler.

struct t{double x,y;};
t L(t u, t v){u.x=(v.y-u.y)/(v.x-u.x);u.y=v.y-u.x*v.x;return u;}

golfed:

typedef struct T{double x,y;}t;
t line(t u, t v){t z;z.x=(v.y-u.y)/(v.x-u.x);z.y=v.y-(z.x*v.x);return z;}

Kaynak

typedef struct T{
    double x,y;
} t;

t line(t u, t v)
{
t z;
z.x=(v.y-u.y)/(v.x-u.x);
z.y=v.y-(z.x*v.x);
return z;
}

Gereksiz bir alan görüyorum;)
Martin Ender

1
C ++ ise, neden typedef?
dyp

Ayrıca, kurtulabileceğinizi düşünüyorum z:u.x=(v.y-u.y)/(v.x-u.x); u.y=v.y-z.x*v.x; return u;
dyp

1

Apple Swift 95 86

Bu PCG.SE ilk Swift girişi olabilir ??

func L(x:Float...)->(Float,Float){var a=(x[3]-x[1])/(x[2]-x[0]);return(a,x[1]-a*x[0])}

Bu dilin Code Golf topluluğuna büyük bir hit olduğunu görmüyorum.


0

Golfscript: 25 bayt

~:y\:x;-\x--1?*.x-1**y+\p

İşlevin 'L' olarak adlandırılması gerektiğinden, yerel olarak 'L.gs' olarak kaydettim.

İçinde @Dennis tarafından açıklandığı gibi yakalamak, bu yazı , bunun yerine tamsayılar rasyonel sayılar kullanılarak içine Golfscript kandırmak için ihtiyaç olmasıdır. Golfscript notasyonunda girişi kabul etmek istiyorsanız bu işe yararX1 Y1 X2 Y2

# L( (0,0) , (1,1) )
echo "0 0 1 1" | golfscript L.gs
> 1/1
> 0/1
#L( (10,22.5) , (5,12.5) )
echo "10 22 2-1?+ 5 12 2-1?+" | golfscript L.gs
> 2/1
> 5/2

0

Ruby - 48 karakter

JavaScript yanıtıyla neredeyse aynı:

L=->u,v{a,b,c,d=*u,*v;[s=(d-b).fdiv(c-a),b-s*a]}

0

Python3 - 64 57 Bayt

def L(q,w):a=(q[1]-w[1])/(q[0]-w[0]);return a,q[1]-a*q[0]

Birçok insanın yaptığı Tuple kullanmıyorsanız 43'e düşebilirsiniz ...

def L(x,y,q,w):a=(x-q)/(y-w);return a,y-a*x

return(a,q[1]-a*q[0])
user12205

@ace Teşekkürler, bu özensizdi
Harry Beadle

0

PHP (75 karakter)

function L($u,$v){return[$s=($v[1]-$u[1])/($v[0]-$u[0]),$v[1]-($s*$v[0])];}

Ölçek : print_r(L([0,0],[7,1]));

çıktı :

Array
(
    [0] => 0.14285714285714
    [1] => 0
)

(teşekkürler @ace)

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.