2 ডি পয়েন্টের একটি সেটের উত্তল হাল আবিষ্কার করুন


20

আপনি যখন কাঠের বোর্ডে নখের সেট হাতুড়ি করেন এবং তাদের চারপাশে একটি রাবার ব্যান্ডটি জড়ান , আপনি একটি উত্তল হাল পাবেন

এখানে চিত্র বর্ণনা লিখুন

আপনার মিশন, আপনি এটি গ্রহণ করার সিদ্ধান্ত নেওয়া উচিত, এটি 2D পয়েন্টের প্রদত্ত সেটটির উত্তল হাল খুঁজে পাওয়া ।


কিছু নিয়ম:

  • এটি একটি ফাংশন হিসাবে লিখুন, পয়েন্টের তালিকার সমন্বয়গুলি (যে কোনও বিন্যাসে আপনি চান) এটি আর্গুমেন্ট
  • আউটপুটটি অবশ্যই ঘড়ির কাঁটার দিকের বা অ্যান্টিক্লোকের দিকের তালিকাভুক্ত উত্তরের হালের পয়েন্টগুলির তালিকা হতে হবে, যে কোনও একটি থেকে শুরু করে
  • আউটপুট তালিকাটি যে কোনও যুক্তিসঙ্গত বিন্যাসে থাকতে পারে যেখানে প্রতিটি পয়েন্টের স্থানাঙ্কগুলি স্পষ্টভাবে পৃথকযোগ্য। (উদাহরণস্বরূপ কোনও এক ম্লান তালিকা নয় {0.1, 1.3, 4, ...})
  • উত্তল হলের একটি অংশে যদি তিন বা ততোধিক বিন্দু একত্রিত হয় তবে কেবলমাত্র দুটি চূড়ান্তই আউটপুটটিতে রাখা উচিত

নমুনা তথ্য:

নমুনা 0

ইনপুট:

{{1, 1}, {2, 2}, {3, 3}, {1, 3}}

আউটপুট:

{{3, 3}, {1, 3}, {1, 1}}

গণিত গ্রাফিক্স (পরিসংখ্যানগুলি কেবল উদাহরণস্বরূপ)

নমুনা 1

ইনপুট:

{{4.4, 14}, {6.7, 15.25}, {6.9, 12.8}, {2.1, 11.1}, {9.5, 14.9}, 
 {13.2, 11.9}, {10.3, 12.3}, {6.8, 9.5}, {3.3, 7.7}, {0.6, 5.1}, {5.3, 2.4}, 
 {8.45, 4.7}, {11.5, 9.6}, {13.8, 7.3}, {12.9, 3.1}, {11, 1.1}}

আউটপুট:

{{13.8, 7.3}, {13.2, 11.9}, {9.5, 14.9}, {6.7, 15.25}, {4.4, 14}, 
 {2.1, 11.1}, {0.6, 5.1}, {5.3, 2.4}, {11, 1.1}, {12.9, 3.1}}

গণিত গ্রাফিক্স

নমুনা 2

ইনপুট:

{{1, 0}, {1, 1}, {1, -1}, {0.68957, 0.283647}, {0.909487, 0.644276}, 
 {0.0361877, 0.803816}, {0.583004, 0.91555}, {-0.748169, 0.210483}, 
 {-0.553528, -0.967036}, {0.316709, -0.153861}, {-0.79267, 0.585945},
 {-0.700164, -0.750994}, {0.452273, -0.604434}, {-0.79134, -0.249902}, 
 {-0.594918, -0.397574}, {-0.547371, -0.434041}, {0.958132, -0.499614}, 
 {0.039941, 0.0990732}, {-0.891471, -0.464943}, {0.513187, -0.457062}, 
 {-0.930053, 0.60341}, {0.656995, 0.854205}}

আউটপুট:

{{1, -1}, {1, 1}, {0.583004, 0.91555}, {0.0361877, 0.803816}, 
 {-0.930053, 0.60341}, {-0.891471, -0.464943}, {-0.700164, -0.750994}, 
 {-0.553528, -0.967036}}

গণিত গ্রাফিক্স

স্ট্যান্ডার্ড কোড-গল্ফ বিধি প্রযোজ্য। কোনও অ্যাড-হক জ্যামিতি লাইব্রেরি নেই। সংক্ষিপ্ত কোড জিতেছে।

সম্পাদনা 1

আমরা এখানে একটি অ্যালগরিদমিক উত্তর খুঁজছি, ম্যাটল্যাব বা ম্যাথমেটিকায় এই জাতীয় মত একটি উত্তল হাল সন্ধানকারী প্রাক-প্রোগ্রামযুক্ত রুটিন নয়

সম্পাদনা 2

মন্তব্য এবং অতিরিক্ত তথ্যের উত্তর দেওয়া:

  1. আপনি ধরে নিতে পারেন ইনপুট তালিকায় ন্যূনতম সংখ্যা রয়েছে যা আপনার পক্ষে উপযুক্ত you তবে আপনাকে অবশ্যই সারিবদ্ধ (উপ) সেটগুলির যথাযথ চিকিত্সা নিশ্চিত করতে হবে।
  2. আপনি ইনপুট তালিকায় পুনরাবৃত্তি পয়েন্ট পেতে পারেন
  3. পয়েন্টগুলির সর্বাধিক সংখ্যা কেবলমাত্র উপলব্ধ মেমরির দ্বারা সীমাবদ্ধ করা উচিত
  4. পুনরায় "ভাসমান পয়েন্ট": আপনাকে নমুনাগুলিতে দেওয়া দশমিক স্থানাঙ্কের সাথে ইনপুট তালিকাগুলি প্রক্রিয়া করতে সক্ষম হতে হবে। আপনি ভাসমান পয়েন্ট উপস্থাপনা ব্যবহার করে এটি করতে পারেন


2
আমি পূর্বাভাস দিচ্ছি যে ম্যাটল্যাব এটি জিতবে।
পল আর

আমরা কি ধরে নিতে পারি যে কমপক্ষে 3 টি পয়েন্ট রয়েছে? আমরা কি ধরে নিতে পারি যে পয়েন্টগুলি আলাদা? আমাদের কি ভাসমান পয়েন্ট স্থানাঙ্ক সমর্থন করা প্রয়োজন?
পিটার টেলর

@ পিটারটেলর উদাহরণটি নির্দেশ করে শেষ উত্তরটি সত্য
জন ডিভোরাক

আমরা কি ইনপুট ওভাররাইট করতে পারি?
জন ডিভোরাক

ধারাবাহিকভাবে কলিনারি পয়েন্টগুলির সাথে চিকিত্সা করার সমস্যাটি রয়েছে গোলাকার সমস্যাগুলি। আমাদের ভুল করার অনুমতি দেওয়া উচিত।
জন ডিভোরাক

উত্তর:


2

রুবি, 168 টি অক্ষর

C=->q{r=[]
f=m=q.sort[0]
t=-0.5
(_,_,t,*f=q.map{|x,y|a=x-f[0]
b=y-f[1]
[0==(d=a*a+b*b)?9:(-t+e=Math.atan2(b,a)/Math::PI)%2,-d,e,x,y]}.sort[0]
r<<=f)while
!r[1]||f!=m
r}

এই রুবি কোডটি উপহারের মোড়ক অ্যালগরিদমও ব্যবহার করে। ফাংশনটি Cবিন্দুর একটি অ্যারে গ্রহণ করে এবং উত্তল হালকে অ্যারে হিসাবে প্রদান করে।

উদাহরণ:

>p C[[[4.4, 14], [6.7, 15.25], [6.9, 12.8], [2.1, 11.1], [9.5, 14.9], 
     [13.2, 11.9], [10.3, 12.3], [6.8, 9.5], [3.3, 7.7], [0.6, 5.1], [5.3, 2.4], 
     [8.45, 4.7], [11.5, 9.6], [13.8, 7.3], [12.9, 3.1], [11, 1.1]]]

[[5.3, 2.4], [11, 1.1], [12.9, 3.1], [13.8, 7.3], [13.2, 11.9], [9.5, 14.9], [6.7, 15.25], [4.4, 14], [2.1, 11.1], [0.6, 5.1]]

2

গণিত 151

এখনও কাজ চলছে

f = For[t = Sort@#; n = 1; l = Pi; a = ArcTan; c@1 = t[[1]],
       n < 2 || c@n != c@1, 
       n++,
      (l = a @@ (# - c@n); c[n + 1] = #) & @@
      t[[Ordering[Mod[a@## - l, 2 Pi] & @@ (#2 - #1) & @@@ Tuples@{{c@n}, t}, 1]]]] &

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

ClearAll[a, c, t];
s = {{1, 0}, {0.68957, 0.283647}, {0.909487, 0.644276}, {0.0361877, 0.803816}, 
     {0.583004, 0.91555}, {-0.748169, 0.210483}, {-0.553528, -0.967036}, 
     {0.316709, -0.153861}, {-0.79267, 0.585945}, {-0.700164, -0.750994}, 
     {0.452273, -0.604434}, {-0.79134, -0.249902}, {-0.594918, -0.397574}, 
     {-0.547371, -0.434041}, {0.958132, -0.499614}, {0.039941, 0.0990732}, 
     {-0.891471, -0.464943}, {0.513187, -0.457062}, {-0.930053, 0.60341}, 
     {0.656995, 0.854205}};
f@s
Show[Graphics@Line@Table[c@i, {i, n}], 
     ListPlot[{t, Table[c@i, {i, n}]}, 
     PlotStyle -> {PointSize[Medium], PointSize[Large]}, 
     PlotRange -> All]]

এখানে চিত্র বর্ণনা লিখুন


1

কফিস্ক্রিপ্ট, 276:

f=($)->z=$[0];e.r=Math.atan2(e.x-z.x,e.y-z.y)for e in $;$.sort((x,y)->(x.r>y.r)-(x.r<y.r));(loop(a=$[i-1]||$[$.length-1];b=$[i];c=$[i+1]||$[0];break if!b;s=(b.x-a.x)*(c.y-b.y)-(b.y-a.y)*(c.x-b.x);break if s<0||!s&&(a.x-b.x)*(b.x-c.x)<0;$.splice i,1))for i in [$.length-1..0];$

যদি ফাংশনটি অ্যাক্সেসযোগ্য না হয় তবে f=আরও দুটি অক্ষর শেভ করতে অপসারণ করুন ।

ইনপুট / আউটপুট হল বিন্দুর একক অ্যারে, প্রতিটি পয়েন্ট x,yবৈশিষ্ট্য দ্বারা সংজ্ঞায়িত করা হয় । ইনপুট অ্যারে সংশোধিত হয়, পাশাপাশি ফিরে আসে (যদি পরেগুলির প্রয়োজন না হয় তবে শেষ দুটি অক্ষর সরিয়ে ফেলুন)।

ব্যাখ্যাটি পরে যুক্ত হতে পারে।

টেস্ট স্যুট (পুরানোতে কাজ করবে না):

alert JSON.stringify f({x:e[0], y:e[1]} for e in JSON.parse "
{{1, 1}, {2, 2}, ...}
".replace(/{/g,"[").replace(/}/g,"]"))

প্রস্তাবিত পরীক্ষার পরিবেশ: http://coffeescript.org/


আমি এটি দিয়ে চেষ্টা করেছি {{1, 1}, {2, 2}, {3, 3}, {1, 3}}এবং এটি ফিরে এসেছিল [{"x" : 1, "y" : 1, "r" : 0}, {"x" : 1, "y" : 3, "r" : 0}, "x" : 2, "y" : 2, "r" : 0.78..}]যখন আমি মনে করি সঠিক উত্তরটির কিছু {{3, 3}, {1, 3}, {1, 1}}
অনুমান

@ বিলেসারিয়াস ইস্যুতে পয়েন্ট কলিনারের সাথে প্রথমটির সাথে মাঝে মাঝে ভুল হাল তৈরি করা হয়
জন ডিভোরাক

@ বিলেসারিয়াস দয়া করে এটি প্রশ্নের পরীক্ষার কেস হিসাবে যুক্ত করুন।
জন ডিভোরাক

এটি এখন সঠিকভাবে কাজ করছে বলে মনে হয় :)
ডঃ বেলিসেরিয়াস

1

পাইথন, 209 205 195

from math import*
s=lambda(a,b),(c,d):atan2(d-b,c-a)
def h(l):
 r,t,p=[],pi/2,min(l)
 while 1:
    q=min(set(l)-{p},key=lambda q:(s(p,q)-t)%(2*pi));m=s(p,q);r+=[p]*(m!=t);p=q;t=m
    if p in r:return r

একটি উপহার মোড়ানো অ্যালগরিদম ব্যবহার করে। ফলাফলটি বামতম পয়েন্ট দিয়ে শুরু হয় এবং ঘড়ির কাঁটার বিপরীতে মোড়ক দেয়।

উদাহরণ: h([(1, 1), (2, 2), (3, 3), (1, 3)])রিটার্ন[(1, 3), (1, 1), (3, 3)]


printআউটপুট পেতে আপনার কি দরকার নেই ?
ডঃ বেলিসারিয়াস

আমি "আউটপুট" দ্বারা ভেবেছি আপনি ফাংশন আউটপুট বোঝানো। আপনি কি ফাংশনটি ফলাফলটি ফিরিয়ে দেওয়ার পরিবর্তে মুদ্রণ করতে চান?
পিচবোর্ড_বক্স

আমি ভেবেছিলাম যে প্রয়োজনীয়তা the output list can be in any reasonable formatযথেষ্ট পরিষ্কার ছিল। আপনি কি মনে করেন এটি স্পষ্টভাবে বলা দরকার?
ডাঃ বেলিসারিয়াস

ভাসমান পয়েন্ট ব্যবহার করা থাকলে আপনার আউটপুট পয়েন্টগুলি সর্বদা ইনপুটগুলির সাথে মেলে না। উদাহরণস্বরূপ h([(0, 1), (0,1), (0.1 , 1)])আমাকে দেয়[(0, 1), (0.10000000000000001, 1)]
ডঃ বেলিসারিয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.