2点(x、y)からの線形関数ソルバー


10

タスク

(x、y)の形式で座標の2つのタプル引数を取り、それぞれの線形関数を(a、c)の形式で返す関数L()を記述します。ここで、aはx項とcの係数です。 y切片です。

入力はx軸に垂直な線ではなく、2つの入力は別々の点であると想定できます。

得点 

これがコードゴルフです:最短プログラムが勝ちます。

注意:基本的な演算子(+、-、/、*)以外の数学関数は使用しないでください。

例

これが、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)

出力:

>>> 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) )?
— ハワード

1
入力はX軸に平行な線ではないと想定できます。
— Harry Beadle 2014年

2
入力はX軸に平行な線ではないと想定できます。Y軸ですか?
— ハワード

申し訳ありませんが、投稿の編集は正しく、X軸に垂直です。
— Harry Beadle 2014年

2
L((0,0),(0,0))?
— user12205 2014年

回答:


1

J-23文字

かなり簡単です。Lとして使用される2 項動詞を定義し(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マクロの説明:

  • syy 2をポップしてy登録
  • sx登録するには2をポップx
  • 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 *勾配)を引く

1
ありがとう、悪くない。私は殴られたことを認めます。;)
— マーティンエンダー

1
@ m.buettner再ゴルフと再説明。
— Digital Trauma

5

Haskell、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}

技術的に正しいです。


ああ、すごい、私はそれを理解するのに少し心が黒くなりました、私はそれを自分の疲れのせいにします
— ハリービードル

1
+1。なぜComplexInfinity、そして普通ではないのInfinityですか?(Mathematicaは知りません)
— Digital Trauma

3
@DigitalTraumaこれは、Mathematicaに実数で機能することを明示的に伝えずに、実際の方程式の複雑な解を捨てないように、問題の空間は常に複素数であると想定しているためだと思います。
— マーティンエンダー2014年

2

JavaScript、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]

46 ES6の使用:L=(a,b)=>[g=(p=a[1]-b[1])/(q=a[0]-b[0]),p-g*q]
— マイケルM.

@マイケルクール。私はJSの初心者なので、それができるとは知りませんでした。ありがとう。
— user12205

@ m.buettnerそうです...修正済み
— user12205

1
現在、すべての回答は正確に10文字離れています。:D
— マーティンエンダー

1
Awww。バニーが変わりました!
— ジャスティン

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バイト

これは関数だけではなく、完全に独自にコンパイルされます。私は入れていたL中でSystem使用して短絡し、名前空間が、それは完全に修飾すると、名前空間を使用して保存すると良いでしょう。ブラケットを保存しました。またから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バイトを節約できませんか?
— カイルカノス

@KyleKanosはい、ありがとうございます。c#はBODMASを使用しませんが、乗算が最初に行われます(私はそう思います)。
— Nathan Cooper

このソリューションを有効にするには、namespace宣言を含めるか、に変更する必要があると思いSystem.Singleます。
— Tim S.

1

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

不要なスペースが表示されます;)
— マーティンエンダー

1
C ++の場合、なぜtypedef?
— dyp 2014年

また、私はあなたが取り除くことができると思いますz:u.x=(v.y-u.y)/(v.x-u.x); u.y=v.y-z.x*v.x; return u;
— dyp 2014年

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

Golfscript:25バイト

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

関数には「L」という名前を付ける必要があるので、「L.gs」としてローカルに保存しました。

この投稿の @Dennisで説明されているように、Golfscript をだまして整数ではなく有理数を使用する必要があるという問題があります。したがって、これは、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

Ruby-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]

多くの人がしているタプルを使用しない場合は、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 2014年

@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.