Linear Function Solver dari Two Points (x, y)

10

Tugas

Tulis fungsi L () yang mengambil dua argumen Tuple dari koordinat dalam bentuk (x, y), dan mengembalikan fungsi liniernya masing-masing dalam bentuk (a, c), di mana a adalah koefisien dari istilah x dan c adalah intersepsi y.

Anda dapat mengasumsikan bahwa input tidak akan menjadi garis tegak lurus sumbu x, dan bahwa kedua input adalah titik yang terpisah.

Mencetak gol 

Ini Golf Code: program terpendek menang.

Harap Dicatat: Tidak ada penggunaan fungsi matematika selain dari operator dasar (+, -, /, *).

Contoh

Ini solusi un-golfed saya di Python.

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)

Keluaran:

>>> 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)
Harry Beadle
sumber
4
L( (0,0) , (0,1) )?
Howard
1
Anda dapat mengasumsikan bahwa input bukanlah garis yang sejajar dengan sumbu X.
Harry Beadle
2
Anda dapat mengasumsikan bahwa input bukanlah garis yang sejajar dengan sumbu X. Apakah maksud Anda Y axis?
Howard
Maaf, pengeditan pada pos sudah benar, tegak lurus terhadap sumbu X.
Harry Beadle
2
L((0,0),(0,0))?
user12205

Jawaban:

1

J - 23 char

Cukup mudah. Mendefinisikan kata kerja diad Luntuk digunakan sebagai (x1,y1) L (x2,y2).

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

Penjelasan:

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

Contoh:

   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
algoritme hiu
sumber
7

GNU dc , 30 24 byte

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

Menentukan makro Lsedemikian rupa sehingga (x 1 , y 1 , x 2 , y 2 ) harus didorong ke tumpukan dalam urutan itu sebelum memanggil, dan setelah memanggil L, (a, c) dapat muncul dari tumpukan (dalam urutan terbalik dari Tentu saja - itu adalah tumpukan).

Testcase (simpan sebagai "linear.dc" dan jalankan dc linear.dc):

[sysxly-rlx- / dlx * lyr-] sL # Tentukan L makro

10 # Dorong x1 ke tumpukan
22.5 # Dorong y1 ke tumpukan
5 # Dorong x2 ke tumpukan
12.5 # Dorong y2 ke tumpukan

lLx # Panggil L makro
f # Buang tumpukan

Output adalah:

$ dc linear.dc 
2.5
2
$ 

Penjelasan L macro:

  • sypop y 2 untuk ymendaftar
  • sxpop x 2 untuk xmendaftar
  • lyydaftar push (y 2 )
  • -kurangi y 2 dari y 1
  • rswap (y 1 - y 2 ) dan x 1 pada stack
  • lxxdaftar push (x 2 )
  • -kurangi x 2 dari x 1
  • /bagi (y 1 - y 2 ) dengan (x 1 - x 2 ) untuk mendapatkan gradien
  • d duplikat gradien
  • lxxdaftar push (x 2 )
  • *kalikan (x 2 ) dengan gradien
  • lyydaftar push (y 2 )
  • rswap (y 2 ) dan (x 2 * gradien) pada stack
  • -kurangi (x 2 * gradien) dari (y 2 )
Trauma Digital
sumber
1
Terima kasih, tidak buruk. Saya mengaku dipukuli. ;)
Martin Ender
1
@ m.buettner Golf-ulang dan jelaskan kembali.
Trauma Digital
5

Haskell, 41 karakter

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

Tidak banyak bermain golf di sini. Cukup banyak apa yang biasanya Anda tulis minus spasi.

hammar
sumber
4

Mathematica, 55 38 byte

Ini mengejutkan panjang (nama-nama fungsi panjang sial ...) EDIT: Mengubah pendekatan untuk mencegat sumbu (mengambil beberapa inspirasi dari jawaban OP sendiri). Ternyata menghitungnya secara langsung bukanlah ide yang paling pintar.

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

Gunakan seperti

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

Berkat Mathematica Anda juga dapat memperoleh hasil umum:

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

(Contoh terakhir ini menunjukkan bagaimana saya awalnya menerapkan ini.)

Hanya sebagai catatan

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

yang secara teknis benar.

Martin Ender
sumber
Ahh, Luar Biasa, aku agak pusing memikirkan hal itu, aku akan menyalahkan kelelahanku
Harry Beadle
1
+1. Kenapa ComplexInfinitydan tidak tua biasa Infinity? (Saya tidak tahu Mathematica)
Digital Trauma
3
@DigitalTrauma Saya pikir itu karena, tanpa secara eksplisit mengatakan kepada Mathematica bahwa ia dapat bekerja dengan real, ia selalu menganggap ruang yang dimaksud adalah bilangan kompleks, sehingga tidak membuang solusi kompleks dari persamaan nyata.
Martin Ender
2

JavaScript, 62 48

Terima kasih kepada @Michael untuk bermain golf dengan ES 6.

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

Versi lama:

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

Input sampel:

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

Output sampel:

[0.14285714285714285, 0]

Untuk catatan:

L([0,0],[0,1])
[Infinity, NaN]
pengguna12205
sumber
46 menggunakan ES6:L=(a,b)=>[g=(p=a[1]-b[1])/(q=a[0]-b[0]),p-g*q]
Michael M.
@Michael Cool. Saya semacam pemula JS, jadi saya tidak tahu Anda bisa melakukan itu. Terima kasih.
user12205
@ m.buettner Anda benar ... Tetap
user12205
1
Sekarang semua jawaban benar-benar terpisah sepuluh karakter. : D
Martin Ender
1
Awww. Kelinci berubah!
Justin
2

Python3 (51)

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

C # 105 byte

Ini bukan hanya fungsi dan akan dikompilasi sepenuhnya pada itu sendiri. Aku telah menempatkan Ldi Systemnamespace untuk korslet menggunakan, tetapi lebih baik untuk sepenuhnya memenuhi syarat dan menghemat menggunakan namespace. Disimpan kurung. Juga penghematan dari return new z[]kereturn 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]};}}
Nathan Cooper
sumber
Apakah (c*a[0])perlu? Tidak bisakah Anda menghilangkan tanda kurung itu dan menghemat 2 byte?
Kyle Kanos
@KyleKanos Ya, terima kasih. Sementara c # tidak menggunakan BODMAS, perkalian akan dilakukan terlebih dahulu (saya pikir).
Nathan Cooper
Saya katakan Anda harus memasukkan namespacedeklarasi, atau mengubahnya menjadi System.Single, agar solusi ini valid.
Tim S.
1

Lua 5.1.4: 66 64 byte

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

Contoh penggunaan:

> 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
Kyle Kanos
sumber
1

C ++ 88 (dulu 106)

Ditingkatkan: terima kasih atas komentar Anda.

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;}

Golf:

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;}

Sumber

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;
}
bacchusbeale
sumber
Saya melihat ruang yang tidak perlu;)
Martin Ender
1
Jika itu C ++, mengapa typedef?
dyp
Juga, saya pikir Anda dapat menyingkirkan 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

Ini mungkin entri Swift pertama di PCG.SE ??

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

Saya tidak melihat bahasa ini menjadi hit besar bagi komunitas Code Golf.

Harry Beadle
sumber
0

Golfscript: 25 byte

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

Karena fungsi perlu dinamai 'L', saya menyimpannya sebagai 'L.gs' secara lokal.

Tangkapannya, seperti yang dijelaskan oleh @Dennis dalam posting ini , adalah bahwa kita perlu mengelabui Golfscript agar menggunakan bilangan rasional alih-alih bilangan bulat. Jadi ini berfungsi jika Anda bersedia menerima masukan X1 Y1 X2 Y2 dalam notasi skrip golf

# 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
salah
sumber
0

Ruby - 48 karakter

Hampir identik dengan jawaban JavaScript:

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

Python3 - 64 57 Bytes

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

Anda dapat menurunkannya menjadi 43 jika Anda tidak menggunakan Tuple, yang dilakukan banyak orang ...

def L(x,y,q,w):a=(x-q)/(y-w);return a,y-a*x
Harry Beadle
sumber
return(a,q[1]-a*q[0])
user12205
@ace Terima kasih, ceroboh
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])];}

uji : print_r(L([0,0],[7,1]));

keluaran:

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

(terima kasih @ace)

Fabien Sa
sumber