Bộ giải hàm tuyến tính từ hai điểm (x, y)


10

Nhiệm vụ

Viết hàm L () nhận hai đối số Tuple của tọa độ ở dạng (x, y) và trả về hàm tuyến tính tương ứng của chúng ở dạng (a, c), trong đó a là hệ số của thuật ngữ x và c là y-đánh chặn.

Bạn có thể giả sử rằng đầu vào sẽ không phải là một đường vuông góc với trục x và hai đầu vào là các điểm riêng biệt.

Chấm điểm 

Đây là Code Golf: chương trình chiến thắng ngắn nhất.

Xin lưu ý: Không sử dụng bất kỳ hàm toán học nào ngoài các toán tử cơ bản (+, -, /, *).

Thí dụ

Đây là giải pháp không chơi gôn của tôi trong 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)

Đầu ra:

>>> 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
Bạn có thể giả sử rằng đầu vào không phải là một đường thẳng song song với trục X.
Harry Beadle

2
Bạn có thể giả sử rằng đầu vào không phải là một đường thẳng song song với trục X. Ý bạn là trục Y?
Howard

Xin lỗi, chỉnh sửa trên bài viết là chính xác, vuông góc với trục X.
Harry Beadle

2
L((0,0),(0,0))?
dùng12205

Câu trả lời:


1

J - 23

Khá đơn giản. Xác định một động từ dyadic Lđược sử dụng như (x1,y1) L (x2,y2).

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

Giải trình:

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

Ví dụ:

   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 byte

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

Xác định một macro Lsao cho (x 1 , y 1 , x 2 , y 2 ) phải được đẩy đến ngăn xếp theo thứ tự đó trước khi gọi và sau khi gọi L, (a, c) có thể được bật ra khỏi ngăn xếp (theo thứ tự ngược lại Tất nhiên - đó là một chồng).

Testcase (lưu dưới dạng "linear.dc" và chạy dc linear.dc):

[sysxly-rlx- / dlx * lyr-] sL # Xác định macro L

10 # Đẩy x1 vào ngăn xếp
22,5 # Đẩy y1 vào ngăn xếp
5 # Đẩy x2 vào ngăn xếp
12,5 # Đẩy y2 vào ngăn xếp

lLx # Gọi L macro
f # kết xuất ngăn xếp

Đầu ra là:

$ dc tuyến tính.dc 
2,5
2
$ 

Giải thích về macro L:

  • sypop y 2 để yđăng ký
  • sxpop x 2 để xđăng ký
  • lyđẩy yđăng ký (y 2 )
  • -trừ y 2 khỏi y 1
  • rhoán đổi (y 1 - y 2 ) và x 1 trên ngăn xếp
  • lxxthanh ghi đẩy (x 2 )
  • -trừ x 2 từ x 1
  • /chia (y 1 - y 2 ) cho (x 1 - x 2 ) để lấy gradient
  • d nhân đôi độ dốc
  • lxxthanh ghi đẩy (x 2 )
  • *nhân (x 2 ) với độ dốc
  • lyđẩy yđăng ký (y 2 )
  • rhoán đổi (y 2 ) và (x 2 * gradient) trên ngăn xếp
  • -trừ (x 2 * gradient) từ (y 2 )

1
Cảm ơn, không tệ. Tôi thừa nhận bị đánh. ;)
Martin Ender

1
@ m.buettner Đánh gôn lại và giải thích lại.
Chấn thương kỹ thuật số

5

Haskell, 41 ký tự

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

Không có nhiều để chơi golf ở đây. Đó là khá nhiều những gì bạn viết bình thường trừ khoảng trắng.


4

Toán học, 55 38 byte

Điều này dài đến đáng ngạc nhiên (những tên hàm dài phiền phức đó ...) EDIT: Thay đổi cách tiếp cận cho việc chặn trục (lấy một số cảm hứng từ câu trả lời của chính OP). Hóa ra tính toán nó trực tiếp không phải là ý tưởng thông minh nhất.

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

Sử dụng như

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

Nhờ Mathematica bạn cũng có thể có được kết quả chung:

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

(Ví dụ cuối cùng này cho thấy ban đầu tôi đã thực hiện điều này như thế nào.)

Chỉ để cho bản ghi âm thôi

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

đó là chính xác về mặt kỹ thuật.


Ahh, Tuyệt vời, tôi có một chút suy nghĩ đen đủi rằng, tôi sẽ đổ lỗi cho sự mệt mỏi của mình
Harry Beadle

1
+1. Tại sao ComplexInfinityvà không đơn giản là cũ Infinity? (Tôi không biết Mathicala)
Chấn thương kỹ thuật số

3
@DigitalTrauma Tôi nghĩ rằng bởi vì, không nói rõ ràng với Mathicala rằng nó có thể hoạt động trong thực tế, nó luôn giả định không gian trong câu hỏi là các số phức, để không vứt bỏ các giải pháp phức tạp của phương trình thực.
Martin Ender

2

JavaScript, 62 48

Cảm ơn @Michael đã chơi golf với ES 6.

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

Phiên bản cũ:

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

Đầu vào mẫu:

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

Đầu ra mẫu:

[0.14285714285714285, 0]

Đối với hồ sơ:

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

46 sử dụng ES6:L=(a,b)=>[g=(p=a[1]-b[1])/(q=a[0]-b[0]),p-g*q]
Michael M.

@Michael Mát mẻ. Tôi là một người mới chơi JS, vì vậy tôi không biết bạn có thể làm điều đó. Cảm ơn.
12205

@ m.buettner Bạn đã đúng ...
Đã sửa

1
Bây giờ tất cả các câu trả lời là chính xác mười ký tự. : D
Martin Ender

1
À. Con thỏ đã thay đổi!
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 byte

Đây không chỉ là chức năng và sẽ tự biên dịch hoàn toàn. Tôi đã đặt Lvào Systemkhông gian tên để rút ngắn thời gian sử dụng, nhưng tốt hơn hết là nên đủ điều kiện và tiết kiệm sử dụng một không gian tên. Đã lưu dấu ngoặc. Cũng là một tiết kiệm từ return new z[]vàoreturn 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])cần thiết không? Bạn có thể loại bỏ các dấu ngoặc đơn đó và lưu 2 byte không?
Kyle Kanos

@KyleKanos Vâng, cảm ơn. Trong khi c # không sử dụng BODMAS, phép nhân sẽ được thực hiện trước tiên (tôi nghĩ).
Nathan Cooper

Tôi muốn nói rằng bạn phải bao gồm namespacekhai báo hoặc thay đổi nó thành System.Single, để giải pháp này có hiệu lực.
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

Cách sử dụng ví dụ:

> 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 (là 106)

Cải thiện: cảm ơn ý kiến ​​của bạn.

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

Chơi gôn

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

Nguồn

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

Tôi thấy một không gian không cần thiết;)
Martin Ender

1
Nếu là C ++, tại sao typedef?
22 giờ 42 phút

Ngoài ra, tôi nghĩ bạn có thể thoát khỏi 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

Đây có thể là mục Swift đầu tiên trên 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])}

Tôi không thấy ngôn ngữ này là một thành công lớn đối với cộng đồng Code Golf.


0

Golfscript: 25 byte

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

Vì hàm cần được đặt tên là 'L', tôi đã lưu nó dưới dạng 'L.gs' cục bộ.

Điều hấp dẫn, như được giải thích bởi @Dennis trong bài đăng này , là chúng ta cần lừa Golfscript sử dụng các số hữu tỷ thay vì số nguyên. Vì vậy, điều này hoạt động nếu bạn sẵn sàng chấp nhận đầu vào X1 Y1 X2 Y2 trong ký hiệu 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

0

Ruby - 48 ký tự

Gần giống với câu trả lời JavaScript:

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

0

Python3 - 64 57 byte

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

Bạn có thể giảm xuống còn 43 nếu bạn không sử dụng Tuple, điều mà nhiều người đang làm ...

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

return(a,q[1]-a*q[0])
dùng12205

@ace Cảm ơn, đó là cẩu thả
Harry Beadle

0

PHP (75 ký tự)

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

kiểm tra : print_r(L([0,0],[7,1]));

đầu ra:

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

(cảm ơn @ace)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.