একটি 2 ডি উত্তল হলের ক্ষেত্রফল


11

আপনাকে 2D ইউক্যালিডিয়ান বিমানের Cartesian স্থানাঙ্ক (x,y) পয়েন্টের প্রতিনিধিত্বকারী সংখ্যার পূর্ণসংখ্যার একটি অ্যারে / তালিকা / ভেক্টর দেওয়া হবে ; সমস্ত স্থানাঙ্ক 104 এবং 104 , ডুপ্লিকেট অনুমোদিত। নিকটতম পূর্ণসংখ্যার সাথে বৃত্তাকার points পয়েন্টগুলির উত্তল হলের ক্ষেত্রফল সন্ধান করুন ; একটি সঠিক মিডপয়েন্টটি নিকটতম এমনকি পূর্ণসংখ্যার সাথে গোল করা উচিত। আপনি মধ্যবর্তী গণনাগুলিতে ভাসমান-পয়েন্ট নম্বরগুলি ব্যবহার করতে পারেন তবে কেবলমাত্র যদি আপনি গ্যারান্টি দিতে পারেন তবে চূড়ান্ত ফলাফলটি সর্বদা সঠিক হবে। এটি , তাই সংক্ষিপ্ততম সঠিক প্রোগ্রামটি জয়ী।

উত্তল জাহাজের কাঠাম পয়েন্ট সেটের P ক্ষুদ্রতম উত্তল সেট যা রয়েছে P । ইউক্লিডিয়ান বিমানে, কোনও একক পয়েন্টের জন্য (x,y) , এটি পয়েন্টটি নিজেই; দুটি স্বতন্ত্র পয়েন্টের জন্য, এটি তাদের সমন্বিত রেখা, তিনটি অ-কলিনারি পয়েন্টের জন্য, এটি ত্রিভুজ যা তারা গঠন করে এবং আরও সামনে।

উত্তেজকটি কীভাবে আটকায়, তার একটি দুর্দান্ত চাক্ষুষ ব্যাখ্যা, সর্বোপরি একটি কাঠের বোর্ডে নখ হিসাবে সমস্ত পয়েন্ট কল্পনা হিসাবে বর্ণনা করা হয়, এবং তারপরে সমস্ত পয়েন্টগুলি আবদ্ধ করার জন্য তাদের চারপাশে একটি রাবার ব্যান্ড প্রসারিত:
এখানে চিত্র বর্ণনা লিখুন

কিছু পরীক্ষার কেস:

Input: [[50, -13]]
Result: 0

Input: [[-25, -26], [34, -27]]
Result: 0

Input: [[-6, -14], [-48, -45], [21, 25]]
Result: 400

Input: [[4, 30], [5, 37], [-18, 49], [-9, -2]]
Result: 562

Input: [[0, 16], [24, 18], [-43, 36], [39, -29], [3, -38]]
Result: 2978

Input: [[19, -19], [15, 5], [-16, -41], [6, -25], [-42, 1], [12, 19]]
Result: 2118

Input: [[-23, 13], [-13, 13], [-6, -7], [22, 41], [-26, 50], [12, -12], [-23, -7]]
Result: 2307

Input: [[31, -19], [-41, -41], [25, 34], [29, -1], [42, -42], [-34, 32], [19, 33], [40, 39]]
Result: 6037

Input: [[47, 1], [-22, 24], [36, 38], [-17, 4], [41, -3], [-13, 15], [-36, -40], [-13, 35], [-25, 22]]
Result: 3908

Input: [[29, -19], [18, 9], [30, -46], [15, 20], [24, -4], [5, 19], [-44, 4], [-20, -8], [-16, 34], [17, -36]]
Result: 2905

2
আপনার কি কোনও পরীক্ষার মামলা আছে?
মালটিসেন

17
কোড গল্ফে শ্বেতক্ষেত্র গণনা না করা একটি খারাপ ধারণা, এটি স্ট্রিংকে কোডে রূপান্তর করতে এবং এটি সম্পাদন করতে হোয়াইটস্পেসের বৃহত্তর স্ট্রিং প্লাস জেনেরিক কোড সহ সাবমিশনের দিকে পরিচালিত করে।
xnor

4
একটি সঠিক মিডপয়েন্টটি নিকটতম এমনকি পূর্ণসংখ্যার সাথে গোল করা উচিত : কেবল ভাবছেন যে এর পিছনে যুক্তিটি কী?
আর্নৌল্ড

4
[[0, 0], [1, 1], [0, 1]]1/20

6
সাধারণত চ্যালেঞ্জগুলি স্ব-অন্তর্ভুক্ত থাকে তবে এটি একটি নয়। আপনি কি ব্যাখ্যা করতে পারেন যে উত্তল হাল কী, এবং এটি কীভাবে গণনা করা যায়? অথবা কিছু রেফারেন্স অনলাইন সংস্থানকে নির্দেশ করুন?
অলিভিয়ার গ্রাগোয়ার

উত্তর:


9

এসকিউএল সার্ভার 2012+, 84 বাইট

SELECT Round(Geometry::ConvexHullAggregate(Geometry::Point(x,y,0)).STArea(),0)FROM A

এসকিউএল সার্ভারে জ্যামিতি ফাংশন এবং সমষ্টি ব্যবহার করে। স্থানাঙ্কগুলি Aকলাম সহ টেবিল থেকে xএবং y


9

জাভা 10, 405 ... আর ফিট করে না; সম্পাদনা ইতিহাস দেখুন .. 317 316 বাইট

P->{int n=P.length,l=0,i=0,p,q,t[],h[][]=P.clone(),s=0;for(;++i<n;)l=P[i][0]<P[l][0]?i:l;p=l;do for(h[s++]=P[p],q=-~p%n,i=-1;++i<n;q=(t[1]-P[p][1])*(P[q][0]-t[0])<(t[0]-P[p][0])*(P[q][1]-t[1])?i:q)t=P[i];while((p=q)!=l);for(p=i=0;i<s;p-=(t[0]+h[++i%s][0])*(t[1]-h[i%s][1]))t=h[i];return Math.round(.5*p/~(p%=2))*~p;}

-52 ধন্যবাদ বাইট @ OlivierGrégoire
-3 ধন্যবাদ বাইট @PeterTaylor
-7 ধন্যবাদ বাইট @ceilingcat

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

অথবা 299 rounding ছাড়া বাইট ..

ব্যাখ্যা:

এখানে তিনটি পদক্ষেপ রয়েছে:

  1. ইনপুট-স্থানাঙ্কের ভিত্তিতে উত্তল হালের জন্য পয়েন্টগুলি গণনা করুন ( জারভিসের অ্যালগোরিদম / মোড়ক ব্যবহার করে )
  2. এই উত্তল হলের ক্ষেত্রফল গণনা করুন
  3. ব্যাঙ্কারের গোল ...

উত্তল হাল এর অংশ যে স্থানাঙ্কগুলি গণনা করতে, আমরা নিম্নলিখিত পদ্ধতির ব্যবহার করি:

lppl

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

কোড হিসাবে:

P->{                      // Method with 2D integer array as parameter & long return-type
  int n=P.length,         //  Integer `n`, the amount of points in the input
      l=0,                //  Integer `l`, to calculate the left-most point
      i=0,                //  Index-integer `i`
      p,                  //  Integer `p`, which will be every next counterclockwise point
      q,                  //  Temp integer `q`
      t[],                //  Temp integer-array/point
      h[][]=P.clone(),    //  Initialize an array of points `h` for the Convex Hull
      s=0;                //  And a size-integer for this Convex Hull array, starting at 0
  for(;++i<n;)            //  Loop `i` in the range [1, `n`):
    l=                    //   Change `l` to:
      P[i][0]<P[l][0]?    //   If i.x is smaller than l.x:
       i                  //    Replace `l` with the current `i`
      :l;                 //   Else: leave `l` unchanged
  p=l;                    //  Now set `p` to this left-most coordinate `l`
  do                      //  Do:
    for(h[s++]=P[p],      //   Add the `p`'th point to the 2D-array `h`
        q=-~p%n,          //   Set `q` to `(p+1)` modulo-`n`
        i=-1;++i<n;       //    Loop `i` in the range [0, `n`):
        ;q=               //      After every iteration: change `q` to:
                          //       We calculate: (i.y-p.y)*(q.x-i.x)-(i.x-p.x)*(q.y-i.y), 
                          //       which results in 0 if the three points are collinear;
                          //       a positive value if they are clockwise;
                          //       or a negative value if they are counterclockwise
           (t[1]-P[p][1])*(P[q][0]-t[0])<(t[0]-P[p][0])*(P[q][1]-t[1])?
                          //       So if the three points are counterclockwise:
            i             //        Replace `q` with `i`
           :q)            //       Else: leave `q` unchanged
      t=P[i];             //     Set `t` to the `i`'th Point (to save bytes)
  while((p=q)             //  And after every while-iteration: replace `p` with `q`
             !=l);        //  Continue the do-while as long as `p` is not back at the
                          //  left-most point `l` yet
  // Now step 1 is complete, and we have our Convex Hull points in the List `h`

  for(p=i=0;              //  Set `p` (the area) to 0
      i<s                 //  Loop `i` in the range [0, `s`):
      ;p-=                //    After every iteration: Decrease the area `p` by:
        (t[0]+h[++i%s][0])//     i.x+(i+1).x
        *(t[1]-h[i%s][1]))//     Multiplied by i.y-(i+1).y
    t=h[i];               //   Set `t` to the `i`'th point (to save bytes)
 return Math.round(.5*p/~(p%=2))*~p;}
                          //  And return `p/2` rounded to integer with half-even



6

জাভাস্ক্রিপ্ট (ES6),  191  189 বাইট

কার্যকরী জার্ভিস মার্চ (ওরফে উপহার মোড়ানো অ্যালগরিদম)।

P=>(r=(g=p=>([X,Y]=P[p],Y*h-X*v)+(P.map(([x,y],i)=>q=(y-Y)*(P[q][0]-x)<(x-X)*(P[q][1]-y)?i:q,q=P[++p]?p:0,h=X,v=Y)|q?g(q):V*h-H*v))(v=h=0,([[H,V]]=P.sort(([x],[X])=>x-X)))/2)+(r%1&&r&1)/2|0

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

বা জটিল গোলাকার স্কিম ছাড়াই 170 বাইট


রাউন্ডিংটি কেবলমাত্র একটি লাল রঙের উত্তোলক ছিল কারণ দ্বিগুণ ক্ষেত্রটি সর্বদাই ঠিক পূর্ণসংখ্যার হয়।
ভ্লাদিমির রেশেটনিকভ

4
@ ভ্লাদিমিররেশনিকভ কৌতূহলের বাইরে: আপনি যদি জানতেন যে গোল করা একটি লাল রঙের হেরিং ছিল, তবে কেন এটি অন্যথায় ভাল চ্যালেঞ্জ থেকে বিভ্রান্ত করার জন্য যুক্ত করবেন? .. সমস্ত ভাষাতেই ব্যাঙ্কারের গোলাকার তৈরি হয়নি, এমনকি জেএস এবং জাভার মতো সুপরিচিত ভাষাও নয়। আমি সাধারণভাবে চ্যালেঞ্জটি পছন্দ করি এবং আমার জাভা উত্তরটি লিখতে উপভোগ করি তবে কনভেক্স হাল কীভাবে চ্যালেঞ্জটিকে স্ব-অন্তর্নিহিত করে তা টিবিএইচকে বর্ধিত করা থেকে বিরত রাখার বিষয়ে গোলাকার এবং ব্যাখ্যার অভাবে, পিএস: দুঃখিত @ আরনাউল্ড এটি হিসাবে এটি করার জন্য আপনার উত্তরে মন্তব্য করুন ..
কেভিন ক্রুইজসেন

4

আর , 85 81 78 বাইট

function(i,h=chull(i),j=c(h,h[1]))round((i[h,1]+i[j[-1],1])%*%diff(-i[j,2])/2)

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

2-কলামের ম্যাট্রিক্স হিসাবে ইনপুট নেয় - প্রথমটির জন্য x, দ্বিতীয়টির জন্য y। আর এর roundপ্রকৃতপক্ষে ব্যাংকারের বৃত্তাকার পদ্ধতিটি ব্যবহার করে, তাই আমরা এখানে বেশ ভাগ্যবান।

i(xi1+x)(yi1yi)/2

জিউসেপিকে -৩ বাইটের জন্য ধন্যবাদ।


3

[আর + এসপি প্যাকেজ], 55 বাইট

function(x)round(sp::Polygon(x[chull(x),,drop=F])@area)

আরডিআরআর এ চেষ্টা করুন

একটি ফাংশন যা দুশ্চিন্তা 2 ম্যাট্রিক্স নেয় এবং বৃত্তাকার ক্ষেত্রটি প্রদান করে। এটি spপ্যাকেজটি ব্যবহার করে । drop=Fএক তুল্যমুল্য ক্ষেত্রে পরিচালনা করতে প্রয়োজন হয়। টিআইওর spপ্যাকেজের অভাবের কারণে ডেমোর জন্য আরডিআরআর ব্যবহৃত হয় ।

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