두 점 (x, y)에서 선형 함수 해 찾기


10

작업

(x, y) 형식으로 좌표의 두 튜플 인수를 취하는 함수 L ()을 작성하고 (a, c) 형식으로 각각의 선형 함수를 반환합니다. 여기서 a는 x 항과 c y 절편입니다.

입력이 x 축에 수직 인 선이 아니며 두 입력이 별도의 점이라고 가정 할 수 있습니다.

채점 

이것은 코드 골프입니다 : 최단 프로그램이 이깁니다.

참고 : 기본 연산자 (+,-, /, *) 외에는 수학 함수를 사용하지 마십시오.

다음은 파이썬에서 풀리지 않은 솔루션입니다.

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)

산출:

>>> 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
입력이 X 축에 평행 한 선이 아니라고 가정 할 수 있습니다.
Harry Beadle

2
입력이 X 축에 평행 한 선이 아니라고 가정 할 수 있습니다. Y 축을 의미합니까?
Howard

죄송합니다. 게시물의 수정 사항이 X 축에 수직으로 정확했습니다.
Harry Beadle

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

답변:


1

J-23 자

매우 간단합니다. L으로 사용할 이진 동사 를 정의합니다 (x1,y1) L (x2,y2).

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

설명:

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

예 :

   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 바이트

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

L(x 1 , y 1 , x 2 , y 2 )를 호출하기 전에 순서대로 스택에 푸시해야하고 호출 후에 L, (a, c)가 스택에서 튀어 나올 수 있도록 매크로를 정의합니다. 물론-스택입니다).

테스트 사례 ( "linear.dc"로 저장하고 실행 dc linear.dc) :

[sysxly-rlx- / dlx * lyr-] sL # L 매크로 정의

10 # x1을 스택에 밀어 넣습니다.
22.5 # y1을 스택에 밀어 넣습니다
5 # x2를 스택에 밀어 넣습니다.
12.5 # y2를 스택으로 밉니다

lLx # 콜 L 매크로
f # 스택을 덤프

출력은 다음과 같습니다

$ dc linear.dc 
2.5
2
$ 

L 매크로 설명 :

  • sy등록 하려면 pop y 2y
  • sx등록 하려면 pop x 2x
  • ly푸시 y레지스터 (y 2 )
  • -y 1 에서 y 2 빼기
  • r스왑 (y 1 -y 2 ) 및 x 1 스택
  • lx푸시 x레지스터 (x 2 )
  • -x 1 에서 x 2 빼기
  • /그라디언트를 얻으려면 (y 1 -y 2 )를 (x 1 -x 2 )로 나눕니다.
  • d 복제 그라디언트
  • lx푸시 x레지스터 (x 2 )
  • *그라디언트에 곱하기 (x 2 )
  • ly푸시 y레지스터 (y 2 )
  • r스택에서 스왑 (y 2 ) 및 (x 2 * 그라디언트)
  • -(y 2 ) 에서 (x 2 * gradient) 빼기

1
고마워요 나는 구타를 인정한다. ;)
Martin Ender 2014 년

1
@ m.buettner 재 골프하고 다시 설명했다.
Digital Trauma

5

하스켈, 41 자

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

여기서 골프를 많이하지 않습니다. 일반적으로 공백을 뺀 것과 거의 비슷합니다.


4

Mathematica, 55 38 바이트

이것은 놀랍게도 길었습니다 (이 성가신 긴 함수 이름 ...) 편집 : 축 절편에 대한 접근 방식이 변경되었습니다 (OP의 답변에서 영감을 얻음). 직접 계산하는 것이 가장 영리한 아이디어가 아니라는 것이 밝혀졌습니다.

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

처럼 사용

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

Mathematica 덕분에 일반적인 결과를 얻을 수도 있습니다.

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

(이 마지막 예는 내가 이것을 어떻게 구현했는지 보여줍니다.)

기록만을 위해서

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

기술적으로 정확합니다.


Ahh, Awesome, 나는 약간의 검은 마음을 가지고 그것을 알아 내고, 나는 그것을 내 피곤에 비난 할 것입니다
Harry Beadle

1
+1. 왜 ComplexInfinity평범하지 Infinity않은가? (Mathematica를 모른다)
Digital Trauma

3
@DigitalTrauma 저는 Mathematica에게 실수로 작동 할 수 있다고 명시 적으로 말하지 않고 문제의 공간을 항상 복잡한 숫자로 가정하여 복잡한 방정식의 복잡한 해를 버리지 않기 때문이라고 생각합니다.
Martin Ender 2014 년

2

자바 스크립트, 62 48

ES 6으로 골프를 해주신 @Michael에게 감사드립니다.

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

구 버전:

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

샘플 입력 :

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

샘플 출력 :

[0.14285714285714285, 0]

기록을 위해 :

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

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

@ 마이클 쿨. 나는 일종의 JS 초보자이므로 그렇게 할 수 있다는 것을 몰랐습니다. 감사.
user12205

@ m.buettner 당신이 맞아요 ... 고정
user12205

1
이제 모든 답은 정확히 10 자입니다. : D
Martin Ender

1
Awww. 토끼가 바뀌었다!
Justin

2

파이썬 3 (51)

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

2

C # 105 바이트

이것은 단순한 함수가 아니며 자체적으로 완전히 컴파일됩니다. 나는 뒀다 LSystem사용하여 단락에 네임 스페이스 수 있지만 완전히 자격 네임 스페이스를 사용하여 저장에 더 나은입니다. 괄호를 저장했습니다. 또한에서 절약 return new z[]return 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])필요? 괄호를 제거하고 2 바이트를 저장할 수 없습니까?
Kyle Kanos

@KyleKanos 네, 감사합니다. c #은 BODMAS를 사용하지 않지만 곱셈이 먼저 수행됩니다 (제 생각에).
Nathan Cooper

이 솔루션이 유효 하려면 namespace선언 을 포함 하거나로 변경해야 한다고 말하고 싶습니다 System.Single.
Tim S.

1

루아 5.1.4 : 66 64 바이트

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

사용법 예 :

> 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)

개선 : 귀하의 의견에 감사드립니다.

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

골프 :

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

출처

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

나는 불필요한 공간을 본다;)
Martin Ender

1
C ++ 인 경우 왜 typedef?
dyp

또한, 나는 당신이 제거 할 수 있다고 생각합니다 z:u.x=(v.y-u.y)/(v.x-u.x); u.y=v.y-z.x*v.x; return u;
dyp

1

애플 스위프트 95 86

이것은 PCG.SE의 첫 번째 Swift 항목 일 수 있습니까 ??

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

이 언어가 Code Golf 커뮤니티에 큰 타격을 입히는 것을 보지 못했습니다.


0

골프 스크립트 : 25 바이트

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

함수 이름을 'L'로 지정해야하므로 로컬로 'L.gs'로 저장했습니다.

이 글 에서 @Dennis가 설명했듯이 캐치 스크립트는 정수 대신에 합리적인 숫자를 사용하도록 Golfscript를 속 여야합니다. 따라서 이것은 골프 스크립트 표기법으로 입력 기꺼이 받아 들일 경우 작동합니다X1 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

루비 – 48 자

JavaScript 답변과 거의 동일합니다.

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

0

Python3 - 64 57 바이트

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

많은 사람들이하고있는 Tuple을 사용하지 않으면 43까지 줄일 수 있습니다 ...

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 감사합니다, 그것은 조잡했습니다
Harry Beadle

0

PHP (75 자)

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

테스트 : print_r(L([0,0],[7,1]));

출력 :

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

(@ace 감사합니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.