স্থানাঙ্কের দূরত্ব


24

আছে এন একটি 2 ডি প্লেনে মানুষ। তাদের মধ্যে দূরত্ব ব্যবহার করে আমরা তাদের অবস্থানগুলি সন্ধান করতে যাচ্ছি। একটি অনন্য উত্তর পেতে আপনাকে অবশ্যই চারটি অনুমান করতে হবে:

  1. কমপক্ষে 3 জন লোক রয়েছে।
  2. প্রথম ব্যক্তি অবস্থান (0, 0)।
  3. দ্বিতীয় ব্যক্তি কিছু x> 0 এর জন্য অবস্থানের (x, 0)।
  4. তৃতীয় ব্যক্তি কিছু y> 0 এর জন্য অবস্থানে (x, y)।

সুতরাং আপনার চ্যালেঞ্জটি হল এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা 2D দূরত্বের অ্যারে D[i][j]দেয় (যেখানে ব্যক্তি iএবং এর মধ্যে দূরত্ব দেয় j) তাদের স্থানাঙ্কের একটি তালিকা ফেরত দেয় । আপনার উত্তর অবশ্যই কমপক্ষে 6 টি গুরুত্বপূর্ণ ব্যক্তির কাছে সঠিক হতে হবে। বাইট জেতে সংক্ষিপ্ত সমাধান।


উদাহরণ

[[0.0, 3.0, 5.0], [3.0, 0.0, 4.0], [5.0, 4.0, 0.0]]

=>

[[0.0, 0.0], [3.0, 0.0], [3.0, 4.0]]


[[0.0, 0.0513, 1.05809686, 0.53741028, 0.87113533], [0.0513, 0.0, 1.0780606,
0.58863967, 0.91899559], [1.05809686, 1.0780606, 0.0, 0.96529704,
1.37140397], [0.53741028, 0.58863967, 0.96529704, 0.0, 0.44501955],
[0.87113533, 0.91899559, 1.37140397, 0.44501955, 0.0]]

=>

[[0.0, 0.0], [0.0513, 0.0], [-0.39, 0.9836], [-0.5366, 0.0295], [-0.8094, -0.3221]]


[[0.0, 41.9519, 21.89390815, 108.37048253, 91.40006121, 49.35063671,
82.20983622, 83.69080223, 80.39436793, 86.5204431, 91.24484876, 22.32327813,
99.5351474, 72.1001264, 71.98278813, 99.8621559, 104.59071383, 108.61475753,
94.91576952, 93.20212636], [41.9519, 0.0, 24.33770482, 144.67214389,
132.28290899, 49.12079288, 85.34321428, 117.39095617, 103.60848008,
79.67795144, 69.52024038, 42.65007733, 105.60007249, 110.50120501,
89.92218111, 60.03623019, 133.61394005, 76.26668715, 130.54041305,
122.74547069], [21.89390815, 24.33770482, 0.0, 130.04213984, 112.98940283,
54.26427666, 71.35378232, 104.72088677, 81.67425703, 90.26668791,
71.13288376, 18.74250061, 109.87223765, 93.96339767, 69.46698314,
84.37362794, 124.38527485, 98.82541733, 116.43603102, 113.07526035],
[108.37048253, 144.67214389, 130.04213984, 0.0, 37.8990613, 111.2161525,
176.70411028, 28.99007398, 149.1355788, 124.17549005, 198.6298252,
126.02950495, 101.55746829, 37.24713176, 152.8114446, 189.29178553,
34.96711005, 180.83483984, 14.33728853, 35.75999058], [91.40006121,
132.28290899, 112.98940283, 37.8990613, 0.0, 111.05881157, 147.27385449,
44.12747289, 115.00173099, 134.19476383, 175.9860033, 104.1315771,
120.19673135, 27.75062658, 120.90347767, 184.88952087, 65.64187459,
183.20903265, 36.35677531, 60.34864715], [49.35063671, 49.12079288,
54.26427666, 111.2161525, 111.05881157, 0.0, 125.59451494, 82.23823276,
129.68328938, 37.23819968, 118.38443321, 68.15130552, 56.84347674,
84.29966837, 120.38742076, 78.30380948, 91.88522811, 72.15031414,
97.00421525, 82.23460459], [82.20983622, 85.34321428, 71.35378232,
176.70411028, 147.27385449, 125.59451494, 0.0, 158.1002588, 45.08950594,
161.43320938, 50.02998891, 59.93581537, 180.43028005, 139.95387244,
30.1390519, 133.42262669, 182.2085151, 158.47101132, 165.61965338,
170.96891788], [83.69080223, 117.39095617, 104.72088677, 28.99007398,
44.12747289, 82.23823276, 158.1002588, 0.0, 136.48099476, 96.57856065,
174.901291, 103.29640959, 77.53059476, 22.95598599, 137.23185588,
160.37639016, 26.14552185, 152.04872054, 14.96145727, 17.29636403],
[80.39436793, 103.60848008, 81.67425703, 149.1355788, 115.00173099,
129.68328938, 45.08950594, 136.48099476, 0.0, 166.89727482, 92.90019808,
63.53459104, 177.66159356, 115.1228903, 16.7609065, 160.79059188,
162.35278463, 179.82760993, 140.44928488, 151.9058635], [86.5204431,
79.67795144, 90.26668791, 124.17549005, 134.19476383, 37.23819968,
161.43320938, 96.57856065, 166.89727482, 0.0, 148.39351779, 105.1934756,
34.72852943, 106.44495924, 157.55442606, 83.19240274, 96.09890812,
61.77726814, 111.24915274, 89.68625779], [91.24484876, 69.52024038,
71.13288376, 198.6298252, 175.9860033, 118.38443321, 50.02998891,
174.901291, 92.90019808, 148.39351779, 0.0, 72.71434547, 175.07913091,
161.59035051, 76.3634308, 96.89392413, 195.433818, 127.21259331,
185.63246606, 184.09218079], [22.32327813, 42.65007733, 18.74250061,
126.02950495, 104.1315771, 68.15130552, 59.93581537, 103.29640959,
63.53459104, 105.1934756, 72.71434547, 0.0, 121.04924013, 88.90999601,
52.48935172, 102.51264644, 125.51831504, 117.54806623, 113.26375241,
114.12813777], [99.5351474, 105.60007249, 109.87223765, 101.55746829,
120.19673135, 56.84347674, 180.43028005, 77.53059476, 177.66159356,
34.72852943, 175.07913091, 121.04924013, 0.0, 93.63052717, 171.17130953,
117.77417844, 69.1477611, 95.81237385, 90.62801636, 65.7996984],
[72.1001264, 110.50120501, 93.96339767, 37.24713176, 27.75062658,
84.29966837, 139.95387244, 22.95598599, 115.1228903, 106.44495924,
161.59035051, 88.90999601, 93.63052717, 0.0, 117.17351252, 159.88686894,
48.89223072, 156.34374083, 25.76186961, 40.13509273], [71.98278813,
89.92218111, 69.46698314, 152.8114446, 120.90347767, 120.38742076,
30.1390519, 137.23185588, 16.7609065, 157.55442606, 76.3634308, 52.48935172,
171.17130953, 117.17351252, 0.0, 145.68608389, 162.51692098, 166.12926334,
142.8970605, 151.6440003], [99.8621559, 60.03623019, 84.37362794,
189.29178553, 184.88952087, 78.30380948, 133.42262669, 160.37639016,
160.79059188, 83.19240274, 96.89392413, 102.51264644, 117.77417844,
159.88686894, 145.68608389, 0.0, 169.4299171, 33.39882791, 175.00707479,
160.25054951], [104.59071383, 133.61394005, 124.38527485, 34.96711005,
65.64187459, 91.88522811, 182.2085151, 26.14552185, 162.35278463,
96.09890812, 195.433818, 125.51831504, 69.1477611, 48.89223072,
162.51692098, 169.4299171, 0.0, 156.08760216, 29.36259602, 11.39668734],
[108.61475753, 76.26668715, 98.82541733, 180.83483984, 183.20903265,
72.15031414, 158.47101132, 152.04872054, 179.82760993, 61.77726814,
127.21259331, 117.54806623, 95.81237385, 156.34374083, 166.12926334,
33.39882791, 156.08760216, 0.0, 167.00907734, 148.3962894], [94.91576952,
130.54041305, 116.43603102, 14.33728853, 36.35677531, 97.00421525,
165.61965338, 14.96145727, 140.44928488, 111.24915274, 185.63246606,
113.26375241, 90.62801636, 25.76186961, 142.8970605, 175.00707479,
29.36259602, 167.00907734, 0.0, 25.82164171], [93.20212636, 122.74547069,
113.07526035, 35.75999058, 60.34864715, 82.23460459, 170.96891788,
17.29636403, 151.9058635, 89.68625779, 184.09218079, 114.12813777,
65.7996984, 40.13509273, 151.6440003, 160.25054951, 11.39668734,
148.3962894, 25.82164171, 0.0]]

=>

[[0.0, 0.0], [41.9519, 0.0], [19.6294, 9.6969], [-88.505, -62.5382],
[-88.0155, -24.6423], [21.2457, -44.5433], [14.7187, 80.8815], [-59.789,
-58.5613], [-29.9331, 74.6141], [34.5297, -79.3315], [62.6017, 66.3826],
[5.2353, 21.7007], [6.1479, -99.3451], [-62.597, -35.7777], [-13.6408,
70.6785], [96.8736, -24.2478], [-61.4216, -84.6558], [92.2547, -57.3257],
[-74.7503, -58.4927], [-55.0613, -75.199]]

2
সুতরাং মূলত আপনি DistanceMatrixগণিতের বিপরীতমুখী ফাংশনটি সন্ধান করছেন ;-)
J42161217

আপনার প্রথম উদাহরণে, তৃতীয় পয়েন্টটি (3,4) বা (3, -4) হতে পারে।
ডেভিডসি

@ ডেভিডসি আপনি অনুমানগুলি নিবিড়ভাবে পড়েন নি।
orlp

হ্যাঁ। আমি এখন দেখতে।
ডেভিডসি

2
একাধিক সঠিক উত্তর থাকতে পারে বা আমি কিছু ভুল করছি? আমি +0.322২ য় উদাহরণের শেষ স্থানাঙ্কের জন্য পাচ্ছি ।
এমিগানা

উত্তর:


5

পাইথন 2 , 183 178 166 161 160 159 158 156 বাইট

@ জিউস্পেপকে 1 বাইট ধন্যবাদ এবং 2 জন বাইট @ জোনাথনফ্রেচের জন্য ধন্যবাদ সংরক্ষণ করা হয়েছে।

def f(D):
 X=D[0][1];o=[0,X];O=[0,0];n=2
 for d in D[2:]:y=d[0]**2;x=(y-d[1]**2)/X/2+X/2;y-=x*x;o+=x,;O+=y**.5*(y>d[2]**2-(x-o[2])**2or-1),;n+=1
 return o,O

এটি অনলাইন চেষ্টা করুন!

বাকী গণনা করতে প্রথম 3 পয়েন্ট ব্যবহার করে। x-coords, y-coords মন্তব্যে অনুমোদিত হিসাবে একটি জোড়া ফেরত দেয়


O+=[...]হতে পারে O+=...,এবং o+=[x]হতে পারে o+=x,
জোনাথন ফ্রেচ

@ জোনাথানফ্রেচ কাজ করে না। পাইথন কেবলমাত্র তালিকায় তালিকাগুলি যোগ করার অনুমতি দেয়। টিআইও
পূর্বকাকুডারী

@ Pietu1998 আমার অর্থ নয় o+=x, বরং o+=x,
জোনাথন ফ্রেচ 11

4

আর, 107

function(d){y=t(cmdscale(d))
y=y-y[,1]
p=cbind(c(y[3],-y[4]),y[4:3])%*%y/sum(y[,2]^2)^.5
p*c(1,sign(p[6]))}

বড় হেড স্টার্টটি প্রথম লাইনে রয়েছে যেখানে আমি মাল্টি-ডাইমেনশনাল স্কেলিং (এমডিএস) এর জন্য আর এর ফাংশনটি ব্যবহার করি। বাকিটি সম্ভবত অকার্যকর (কীভাবে উন্নতি করতে হবে সে সম্পর্কে পরামর্শ দেওয়ার জন্য ধন্যবাদ): লাইন 2 ডেটাটি অনুবাদ করে যাতে প্রথম পয়েন্টটি (0, 0) এ থাকে; লাইন 3 পয়েন্টগুলি ঘোরান যাতে দ্বিতীয় পয়েন্টটি (0, x) এ থাকে; লাইন 4 সমস্ত কিছু ফ্লিপ করে যাতে তৃতীয় পয়েন্ট y> 0 এ থাকে।


আর এর জন্য একটি বিল্ট-ইন আছে ??? Dang।
জিউসেপ

3

আর , 227 215 209 176 169 বাইট

function(d){x=y=c(0,0)
x[2]=a=d[1,2]
d=d^2
i=3:nrow(d)
D=d[1,i]
x[i]=(D+a^2-d[2,i])/2/a
y[3]=e=sqrt(d[1,3]-x[3]^2)
y[i]=(D-d[3,i]+x[3]^2+e^2-2*x[3]*x[i])/2/e
Map(c,x,y)}

এটি অনলাইন চেষ্টা করুন!

একসময় আমি কম্পিউটারের জ্যামিতিতে কোর্স করেছিলাম। আমি বলতে চাই যে এটি সাহায্য করেছে, তবে আমি স্পষ্টভাবে কিছুই শিখিনি।

ইনপুটটি একটি আর ম্যাট্রিক্স, আউটপুট সহ 2-এলিমেন্ট ভেক্টরগুলির একটি তালিকা (x,y)(যা অনুমানের নিকটে এবং বাইট সংরক্ষণ করে)।

এখানে সমস্যাটি অবশ্যই প্রথম তিনটি বিষয়। একবার আপনি তিনটি পয়েন্ট ঠিক করে নিলে আপনি সেগুলির উপর ভিত্তি করে অন্য সমস্তগুলি গণনা করতে পারেন।

আমি জিনিসগুলি সরল করতে কেবল বীজগণিতের কিছুটা ব্যবহার করেছি এবং পরে লক্ষ্য করেছি যে যেহেতু আমি অন্যদের সমাধানের জন্য কেবল প্রথম 3 পয়েন্ট ব্যবহার করছি তাই এটি সমস্ত খুব সুন্দরভাবে ভেক্টরাইজড হয়েছে।

ফ্লাডেল দ্বারা আউটগল্ফড


2

জাভাস্ক্রিপ্ট (ES7), 202 193 বাইট

d=>{for(k=7;(a=d.map((r,i)=>[x=(r[0]**2-r[1]**2+a*a)/2/a,(d[0][i]**2-x*x)**.5*(k>>i&1||-1)],a=d[0][1])).some(([x,y],i)=>a.some(([X,Y],j)=>(Math.hypot(x-X,y-Y)-d[i][j])**2>1e-6));k+=8);return a}

পরীক্ষার মামলা

কিভাবে?

যাক আমি, ঞ ইনপুট হতে হবে এবং x আমি , Y আমি প্রত্যাশিত আউটপুট দেখুন।

চ্যালেঞ্জ বিধি দ্বারা, আমরা জানি যে:

  • যে কোনও জোড়ার জন্য (i, j) : d i, j = √ ((x i - x j ) ² + (y i - y j ) ²)
  • x 0 = y 0 = y 1 = 0

আমরা তাৎক্ষণিকভাবে অনুমান করতে পারি:

  1. x 1 = d 0,1

  2. d 0, j = √ ((x 0 - x j ) ² + (y 0 - y j ) ²) = √ (x j ² + y j ²)
    d 0, j ² = x j ² + y j ²

  3. d 1, j = √ ((x 1 - x j ) ² + (y 1 - y j ) ²) = √ ((x 1 - x )) + 1 জে ²)
    ডি 1, জে ² = (x 1 - x জে ) ² + y জে ² = x 1 ² + x জে ² + 2 এক্স 1 এক্স জে + জে ² = ডি 0,1 ² + এক্স জে ² + 2 ডি 0,1 এক্স জে + ই জে ²

গণনা x জে

2 এবং 3 ব্যবহার করে আমরা পাই:

x জে ² - (ডি 0,1 ² + এক্স জে ² - 2 ডি 0,1 এক্স জে ) = ডি 0, জে ² - ডি 1, জে ²

যা বাড়ে:

এক্স জে = (ডি 0, জে ² - ডি 1, জে + ডি ডি 0,1 ²) / 2 ডি 0,1

গণনা y জে

এখন যে এক্স জে জানা গেছে, আমাদের রয়েছে:

y j ² = d 0, j ² - x j ²

যা দেয়:

y j = ± √ (d 0, j ² - x j ²)

আমরা মূল দূরত্বগুলির সাথে মেলে না দেওয়া পর্যন্ত আমরা সমস্ত সম্ভাব্য সংমিশ্রণগুলি চেষ্টা করে প্রতিটি y j এর চিহ্নটি নির্ধারণ করি। আমাদের নিশ্চিত করতে হবে যে আমাদের y আছে 2 > 0 রয়েছে

আমরা বিটমাস্ক কে ব্যবহার করে এটি করি যেখানে 1 এর ইতিবাচক এবং 0 এর সংজ্ঞাটিকে নেতিবাচক হিসাবে চিহ্নিত করা হয়। আমরা কে = 7 ( বাইনারি 111 ) দিয়ে শুরু করি এবং প্রতিটি পুনরাবৃত্তিতে 8 যোগ করি । এইভাবে, y j এর ধনাত্মক মানগুলি 0 ≤ j ≤ 2 এর জন্য নির্বাচিত হওয়ার গ্যারান্টিযুক্ত । (আমরা দিয়ে শুরু করতে পারেন ট = 4 ঠিক যেমন ভাল, কারণ Y 0 = Y 1 = 0 যাহাই হউক না কেন। কিন্তু ব্যবহার 7 প্রতিরোধ নেতিবাচক শূন্য উপস্থিত হওয়া থেকে।)


এটি সংক্ষিপ্ত হবে কিনা তা সম্পর্কে আমি নিশ্চিত নই, তবে মৌলটির জন্য y এর চিহ্ন (প্রাথমিক 3 পরে) গণনা করার সঠিক উপায়টি kহল p = (x, y)দুটি পয়েন্ট, সেট p' = (x, -y), এবং তৃতীয়টি ইতিমধ্যে পরিচিত পয়েন্টটি নিয়ে jএবং দূরত্বের তুলনা করা d[i][j]সাথে dist(p, j)এবং dist(p', j)। আমি নেতিবাচক জিরোগুলিকে উপায় দ্বারা একটি ভুল উত্তর হিসাবে বিবেচনা করি না।
orlp

@orlp নেতিবাচক জিরোগুলি অপসারণ করা কোনও বাইটের জন্য মূল্য দেয় না, সুতরাং এটি নিখুঁত নান্দনিক বিবেচনা। :-) (এবং আপনি ঠিক বলেছেন: প্রাথমিকভাবে অ-কার্যক্ষম সমাধানের জন্য এই পদ্ধতিটি একটি বরং অদক্ষ সমাধান But তবে আমি ভেবেছিলাম এটি এখনও পোস্ট করার মতো মূল্যবান))
আর্নল্ড

2

জাভাস্ক্রিপ্ট (ES7), 140 139 126 121 118 117 বাইট

@ জিউসেপ্পকে ধন্যবাদ 1 বাইট সংরক্ষিত

/* this line for testing only */ f =
D=>D.map((d,n)=>n>1?(y=d[0]**2,D[n]=x=(y-d[1]**2)/X/2+X/2,y-=x*x,[x,y**.5*(y>d[2]**2-(x-D[2])**2||-1)]):[X=n*d[0],0])
<!-- HTML for testing only --><textarea id="i" oninput="test()">[[0.0, 0.0513, 1.05809686, 0.53741028, 0.87113533], [0.0513, 0.0, 1.0780606, 0.58863967, 0.91899559], [1.05809686, 1.0780606, 0.0, 0.96529704, 1.37140397], [0.53741028, 0.58863967, 0.96529704, 0.0, 0.44501955], [0.87113533, 0.91899559, 1.37140397, 0.44501955, 0.0]]</textarea><pre id="o"></pre><script>window.onload=test=function(){try{document.querySelector("#o").innerHTML=JSON.stringify(f(JSON.parse(document.querySelector("#i").value)))}catch(e){}}</script>

আমার পাইথন উত্তরের মতো কিছুটা কাজ করে। রিটার্নিং [x,y]জোড়াগুলি জেএসে পৃথক এক্স এবং ওয়াই তালিকার তুলনায় অনেক খাটো পরিণত হয়েছিল। আর্গুমেন্ট তালিকাটি ওভাররাইট করে, সুতরাং এটি একাধিকবার ইনপুট হিসাবে ব্যবহার করবেন না।


2
@ জিউসেপ আসলে, আমি কেবল স্কোর করতে পারি না f=এবং এটি একটির মধ্যে ফিট করতে পারি না । : পি
পুরক্কা কুডারী

ভাল আমি জাভাস্ক্রিপ্ট জানি না তাই আমি অবাক হই না যে আমি এটি মিস করেছি।
জিউসেপে

2

গণিত, 160 বাইট

(s=Table[0{,},n=Tr[1^#]];s[[2]]={#[[1,2]],0};f@i_:=RegionIntersection~Fold~Table[s[[j]]~Circle~#[[j,i]],{j,i-1}];s[[3]]=Last@@f@3;Do[s[[i]]=#&@@f@i,{i,4,n}];s)&

প্রোগ্রামটি বিল্ট-ইন ব্যবহার করে RegionIntersectionবৃত্তের ছেদ বিন্দু গণনা করার জন্য । প্রোগ্রামটির কাজের জন্য সঠিক সমন্বয় প্রয়োজন।

এই ধরে RegionIntersection x- স্থানাঙ্কটি সমান হলে এর ফলাফলের সর্বশেষে উচ্চতর y- স্থানাঙ্কের সাথে পয়েন্টটি তৈরি করে। (কমপক্ষে ওল্ফ্রাম স্যান্ডবক্সে এটি সত্য)

এর RegionIntersectionইনপুটটিতে অনেকগুলি চেনাশোনা থাকলে কোনও কারণে কাজ করে না তাই প্রতিটি জোড় ব্যবহার করে একবার প্রক্রিয়া করতে হবেFold

স্ক্রিনশট প্রদর্শন করুন:স্ক্রিনশট

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.