Trilaterate ตำแหน่งของคุณ


11

บทนำ

ลองจินตนาการว่าคุณอยู่บนระนาบคาร์ทีเซียนสองมิติและต้องการระบุตำแหน่งของคุณ คุณรู้ 3 คะแนนบนระนาบนั้นและระยะทางของคุณกับแต่ละจุด ในขณะที่เป็นไปได้เสมอที่จะคำนวณตำแหน่งของคุณจากสิ่งนั้นการทำเช่นนั้นในหัวของคุณนั้นค่อนข้างยาก ดังนั้นคุณตัดสินใจที่จะเขียนโปรแกรมสำหรับสิ่งนั้น

ความท้าทาย

ให้ 3 คะแนนและระยะทางของคุณกับพวกเขาเอาท์พุทลูกน้องของตำแหน่งของคุณ

  • อินพุตและเอาต์พุตอาจอยู่ในรูปแบบที่สะดวกรวมถึงการใช้จำนวนเชิงซ้อนแทนจำนวนจริง โปรดอธิบายในคำตอบของคุณว่าคุณใช้รูปแบบใด
  • คุณจะได้รับคะแนนที่แตกต่างกัน 3 ระยะโดยมีระยะห่างจากคุณ
  • พิกัดและระยะทางจะลอยด้วยความแม่นยำตามอำเภอใจ ผลลัพธ์ของคุณจะต้องถูกต้องกับทศนิยม 3 ตำแหน่ง การปัดเศษขึ้นอยู่กับคุณ โปรดอธิบายในคำตอบของคุณ
  • คุณอาจสันนิษฐานว่าจุดสามจุดนั้นไม่ใช่ collinear ดังนั้นจะมีวิธีแก้ปัญหาเฉพาะเสมอ
  • คุณไม่ได้รับอนุญาตให้แก้ไขปัญหา
  • คุณไม่สามารถใช้บิวอินใด ๆ ที่ทำให้ปัญหานี้เป็นปัญหาเล็กน้อย Builtins สำหรับ vector norms ฯลฯ ได้รับอนุญาตแม้ว่า

คำแนะนำในการเริ่มต้น:

คิดถึงวงกลมรอบ ๆ 3 จุดเหล่านั้นโดยให้ระยะทางเท่ากับรัศมี

กฎระเบียบ

กรณีทดสอบ

รูปแบบการป้อนข้อมูลสำหรับจุดหนึ่งที่นี่คือ[[x,y],d]พร้อมxและyเป็นพิกัดและdเป็นระยะทางถึงจุดนี้ คะแนนทั้งสามนี้จัดเรียงอยู่ในรายการ ส่งออกจะ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 บรรทัดต่อไปนี้

Happy Coding!


เนื่องจากต้องการให้พอดีกับระนาบคาร์ทีเซียนสองมิติรหัสจึงต้องสั้นที่สุด
wizzwizz4

เห็นได้ชัดว่าคุณกำลังใช้ผลลัพธ์ที่ไม่แน่นอนซึ่งยังสามารถทำให้เกิดความคลุมเครือได้เราควรจัดการกับสิ่งนี้อย่างไร
ข้อบกพร่อง

@flawr เพียงแค่สมมติว่าผลลัพธ์ทั้งหมดนั้นไม่ซ้ำกันและไม่ซ้ำกัน โปรแกรมของคุณควรทำงานในกรณีที่มีจุดทศนิยมน้อยมากไม่ต้องกังวลกับความกำกวม ฉันจะทำความสะอาดความท้าทายเมื่อฉันอยู่บ้าน
Denker

เนื่องจากคำตอบที่ยอมรับนั้นเป็นเพียงเครื่องคิดเลขกราฟฉันจะพูดถึงว่ามีวิธีแก้ปัญหา 96- ไบต์ใน TI-Basic (รุ่น 68k) เพื่อชี้แจงว่าsolve(ให้สมการวงกลมสามวง) หรือไม่? ฉันคิดว่ามันเป็น แต่ถ้าคุณโอเคกับสิ่งต่าง ๆ ฉันจะไปข้างหน้าและโพสต์
Fox

คำตอบ:


4

Desmos, 122 ไบต์

การใช้งานออนไลน์ คัดลอก + วางแต่ละสมการลงในกล่องสมการคลิก "เพิ่มทั้งหมด" สำหรับแต่ละกล่องจากนั้นคลิกที่จุดตัดจากนั้นป้อนค่าแต่ละค่าตามความเหมาะสม แต่ละA, Bและ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

ตรวจสอบกรณีการทดสอบครั้งแรก

หรือคุณสามารถดูที่นี่:

วงการ!


สิ่งนี้ดูค่อนข้างดี แต่สิ่งนี้ตรงตามเกณฑ์ของเราสำหรับภาษาการเขียนโปรแกรมหรือไม่ นี่ดูเหมือนเครื่องมือวางแผนสำหรับฉันไม่เคยใช้มันดังนั้นฉันอาจจะผิด
Denker

1
@DenkerAffe ฉันถามคำถามจริง ๆ เกี่ยวกับเมตาก่อนหน้านี้และมันนับอย่างแน่นอน
Conor O'Brien

2
เอาล่ะโหวตขึ้นแล้ว :)
Denker

ฉันโต้แย้งการนับจำนวนไบต์ คุณได้รับการคลิกจุดตัดฟรีซึ่งไม่ถูกต้อง
lirtosiast

@lirtosiast ฉันจะยืนยันว่าประเด็นอยู่ที่นั่นเสมอโดยคำจำกัดความและระบุเพิ่มเติมว่า OP กล่าวว่าการโต้ตอบประเภทนี้ไม่เป็นไร อย่างไรก็ตามหากคุณเชื่อว่าควรมีบทลงโทษฉันเปิดรับข้อเสนอแนะ
Conor O'Brien

4

C, 362 348 345 ไบต์

การป้อนข้อมูลจะได้รับเป็นลำดับของลอยพื้นที่แยกจากกันบน stdin x1 y1 d1 x2 y2 d2 x3 y3 d3นี้: ผลผลิตที่คล้ายกันใน x ystdout:

#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ใช้สองCโครงสร้างและตัวชี้ไปลอยและกำหนดบรรทัดที่C(วงกลม) ตัดกัน ค่าตัดแกน y ของเส้นนี้ถูกวางลงในโฟลว์ชี้ไปที่และความชันจะถูกส่งกลับ

โปรแกรมเรียกใช้fวงกลมสองคู่จากนั้นกำหนดจุดตัดของเส้นที่ผลิต


เนื่องจากเราได้ชี้แจงว่าปัจจัยการผลิตไม่ได้เป็น collinear เส้นที่fผลิตจะไม่ขนานกัน การทดสอบเพื่อให้แน่ใจว่าพวกเขายังไม่ได้อยู่ในแนวตั้งเนื่องจากฉันใช้รูปแบบการตัดความชัน วิธีนี้มีคำตอบเดียวเสมอ
Fox

2

Python - 172

รับอินพุตเป็นรายการของ tuples ของฟอร์ม (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
Denker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.