位置を三辺測量する


11

前書き

あなたが2次元のデカルト平面上にいて、その上で自分の位置を判断したいと想像してください。その平面上の3つのポイントとそれぞれの距離を知っています。それからあなたの位置を計算することは常に可能ですが、あなたの頭の中でそれをすることはかなり難しいです。そこで、あなたはそのためのプログラムを書くことにします。

チャレンジ

3つのポイントとそれらまでの距離が与えられたら、位置の座標を出力します。

  • 入力と出力は、実数の代わりに複素数を使用するなど、任意の便利な形式にすることができます。使用する形式を回答で明確にしてください。
  • あなたは常にあなたとの距離で正確に3つの異なるポイントを取得します。
  • 座標と距離は、任意の精度の浮動小数点数です。出力は小数点以下3桁まで正確でなければなりません。丸めはあなた次第です。答えを明確にしてください。
  • 3つのポイントが同一直線上にないことを前提とする場合があるため、常に一意のソリューションが存在します。
  • ソリューションをブルートフォースすることは許可されていません。
  • この特定の問題を単純化する組み込み機能は使用できません。ただし、ベクトルノルムなどのビルトインは許可されます。

始めるためのヒント:

半径としてあなたまでの距離でそれらの3点のそれぞれの周りの円について考えてください。

ルール

  • 機能または完全なプログラムが許可されます。
  • 入出力のデフォルト規則
  • 標準の抜け穴が適用されます。
  • これはなので、バイト数が最も少なくなります。Tiebreakerは以前の提出です。

テストケース

ここで一点の入力フォーマットである[[x,y],d]xし、y座標であり、かつdこの点までの距離です。これらの3つのポイントはリストに配置されます。出力は次のようになりx、その後とy、リストに。

[[[1、2]、1.414]、[[1、1]、2.236]、[[2、2]、1.0]]-> [2、3]
[[[24.234、-13.902]、31.46]、[[12.3242、234.12]、229.953]、[[23.983、0.321]、25.572]]-> [-1.234、4.567]
[[[973.23、-123.221]、1398.016]、[[-12.123、-98.001]、990.537]、[[-176.92、0]、912.087]]-> [12.345、892.234]

このPythプログラムを使用して、追加のテストケースを生成できます。場所は入力の最初の行にあり、3つのポイントは次の3行にあります。

ハッピーコーディング!


コードは2次元のデカルト平面に収まる必要があるため、コードはできるだけ短くする必要があります。
wizzwizz4

あいまいさが生じる可能性のある不正確な結果を使用していることは明らかですが、これをどのように処理する必要がありますか?
flawr

@flawrすべての結果が正確で一意であると仮定してください。あなたのプログラムは、小数点以下が非常に少ないケースで動作するはずです。曖昧さを心配しないでください。私は家にいるときに挑戦を片付けます。
デンカー

受け入れられた答えは事実上単なるグラフ計算機であるため、TI-Basic(68kバージョン)には96バイトのソリューションがあることに言及します。明確にするために、solve(3つの円の方程式が与えられた場合)問題を単純化していますか?私はそれがそうだと思ったが、もしあなたがそのようなことで大丈夫なら、私は先に行ってそれを投稿する。
フォックス

回答:


4

デモ、122バイト

オンライン使用。各方程式をコピーして方程式ボックスに貼り付け、各ボックスの「すべて追加」をクリックしてから交差点をクリックし、必要に応じて各値を入力します。それぞれABおよびC点に対する距離である(a,b)(c,d)(E,f)、それぞれ。値の平方根を取得するにsqrtは、ボックスに値を入力します。

\left(x-a\right)^2+\left(y-b\right)^2=AA
\left(x-c\right)^2+\left(y-d\right)^2=BB
\left(x-E\right)^2+\left(y-f\right)^2=CC

最初のテストケースを確認します。

または、こちらをご覧ください:

サークル!


これはかなり良いように見えますが、これはプログラミング言語の基準を満たしていますか?これは、私にとってはプロットツールのように見えますが、決して使用しなかったため、間違っている可能性があります。
デンカー

1
@DenkerAffe 以前にメタについて質問したことがありますが、確かに重要です。
コナーオブライエン

2
申し分なく、それから私の賛成票を持っている:)
デンカー

バイト数に異議を唱えます。交差点は無料でクリックしますが、これは正しくないようです。
リルトシアスト

@lirtosiast私はポイントが定義によって常にそこにあると主張し、OPはこの種の相互作用は大丈夫だと言ったとさらに述べています。ただし、何らかのペナルティがあるはずだと思われる場合は、提案を受け付けています。
コナーオブライエン

4

C、362の 348 345バイト

入力は、stdin:のスペースで区切られたフロートのシーケンスとして与えられますx1 y1 d1 x2 y2 d2 x3 y3 d3。stdout:の出力は同様ですx y

#define F"%f "
#define G float
#define T(x)(b.x*b.x-a.x*a.x)
typedef struct{G a;G b;G c;}C;G f(C a,C b,G*c){G x=b.b-a.b;*c=(T(a)+T(b)-T(c))/x/2;return(a.a-b.a)/x;}main(){C a,b,c;G x,y,z,t,m;scanf(F F F F F F F F F,&a.a,&a.b,&a.c,&b.a,&b.b,&b.c,&c.a,&c.b,&c.c);x=f(a,a.b==b.b?c:b,&y);z=f(b.b==c.b?a:b,c,&t);m=t-y;m/=x-z;printf(F F"\n",m,x*m+y);}

Cは、メンバーがx座標a、y座標b、および距離(半径)である構造タイプですc。この関数fは、2つのC構造体とfloatへのポインターを取り、C(円)が交差する線を決定します。この線のy切片は、ポイント先のフロートに配置され、勾配が返されます。

プログラムはf2組の円を呼び出し、生成された線の交点を決定します。


入力が同一直線上にないことを明確にしたため、f生成される線は平行になることはありません。このテストでは、スロープインターセプト形式を使用しているため、これらも垂直でないことを確認します。この方法では、常に正確に1つの答えがあります。
フォックス

2

パイソン-172

フォーム(x、y、d)のタプルのリストとして入力を受け取ります。これ以上ゴルフをする方法を見つけたら教えてください、あるに違いないと思いますが、私はそれを理解できません!

import numpy as N
def L(P):
    Z=[p[2]**2-p[0]**2-p[1]**2 for p in P];return N.linalg.solve([[P[i][0]-P[0][0],P[i][1]-P[0][1]]for i in[1,2]],[(Z[0]-Z[i])*0.5 for i in [1,2]])

ここでいくつかの空白を省略できます。たとえば、次のように-1 if 1 else 1なり-1if 1else 1ます。これはブラケットでも機能します。それを利用できる場所がいくつかあります。また.5、と同じ0.5です。
デンカー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.