ল ও ও পি আই টি


22

দ্রষ্টব্য: এই প্রশ্নের শিরোনামটি "লুপ ইট" হওয়া উচিত, তবে শিরোনামটি কমপক্ষে 15 টি অক্ষর হওয়া দরকার বলে কিছু অদৃশ্য স্পেস রয়েছে। এই নোটটি এমন যে চ্যালেঞ্জটি অনুসন্ধান করা যেতে পারে।


চ্যালেঞ্জ

সমতলে অনন্য অবিচ্ছেদ্য পয়েন্টগুলির একটি সীমাবদ্ধ তালিকা দেওয়া, এমন বহুভুজটি সন্ধান করুন যার উল্লম্বগুলি হুবহু সেই পয়েন্টগুলি, যা স্ব ছেদ হয় না।

বিস্তারিত

  • ইনপুট হিসাবে আপনি প্রতিটি এক্স- এবং y- স্থানাঙ্ক বা জোড়াগুলির তালিকার সাথে দুটি তালিকা নিতে পারেন।
  • ইনপুট তালিকায় কমপক্ষে 3 পয়েন্ট থাকে।
  • নোট করুন যে এর অর্থ কখনই অনন্য সমাধান নেই।
  • ইনপুটগুলির তালিকাটি সম-রৈখিক নয় বলে ধরে নেওয়া যেতে পারে (পয়েন্টগুলি একটি লাইনে থাকতে পারে না), এর অর্থ আসলে সেখানে একটি অ-স্ব-ছেদ করা বহুভুজ রয়েছে।
  • প্রতিটি শীর্ষে কোণগুলি নির্বিচারে হয়, এর মধ্যে 180 ° অন্তর্ভুক্ত °
  • দৈর্ঘ্যের একটি ইনপুট করতে n, আউটপুট একটি বিন্যাস হওয়া উচিত (p1,p2,p3,...,pn)এর (1,2,3,...,n)যেখানে k-th এন্ট্রি pkপ্রতিনিধিত্ব করে pইনপুট তালিকায় -th বিন্দু। এর অর্থ হল আমরা থেকে একটি লাইন আছে p1করতে p2থেকে একটি লাইন p2থেকে p3ইত্যাদি, সেইসাথে থেকে একটি লাইন pnথেকে p1। (আপনি 0-ভিত্তিক সূচকগুলিও ব্যবহার করতে পারেন )) বিকল্পভাবে আপনি কেবল সঠিক ক্রমে ইনপুট পয়েন্টগুলির তালিকা আউটপুট করতে পারেন।

উদাহরণ

ধরা যাক আমাদের পয়েন্ট রয়েছে [(0,0),(0,1),(1,0),(-1,0),(0,-1)]এবং আমরা নিম্নলিখিত পথটি উপস্থাপন করতে চাই:

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

এর অর্থ আমরা তালিকা আউটপুট করব [5,1,4,2,3]

এখানে আরও কিছু পরামর্শ দেওয়ার চেষ্টা করুন (লক্ষ্যগুলি যাচাই করতে আমি সংশ্লিষ্ট প্লটগুলি দেখার পরামর্শ দিই))

Triangle
[(0,0),(0,1),(1,0)]

S-Curve
[(0,0),(0,1),(0,2),(0,3),(0,4),(1,0),(2,0),(2,1),(2,2),(2,3),(2,4),(3,4),(4,0),(4,1),(4,2),(4,3),(4,4)]

L-Shape
[(4,0),(1,0),(3,0),(0,0),(2,0),(0,1)]

Menger Sponge
[(1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1),(8,1),(9,1),(10,1),(11,1),(12,1),(13,1),(14,1),(15,1),(16,1),(17,1),(18,1),(19,1),(20,1),(21,1),(22,1),(23,1),(24,1),(25,1),(26,1),(27,1),(1,2),(3,2),(4,2),(6,2),(7,2),(9,2),(10,2),(12,2),(13,2),(15,2),(16,2),(18,2),(19,2),(21,2),(22,2),(24,2),(25,2),(27,2),(1,3),(2,3),(3,3),(4,3),(5,3),(6,3),(7,3),(8,3),(9,3),(10,3),(11,3),(12,3),(13,3),(14,3),(15,3),(16,3),(17,3),(18,3),(19,3),(20,3),(21,3),(22,3),(23,3),(24,3),(25,3),(26,3),(27,3),(1,4),(2,4),(3,4),(7,4),(8,4),(9,4),(10,4),(11,4),(12,4),(16,4),(17,4),(18,4),(19,4),(20,4),(21,4),(25,4),(26,4),(27,4),(1,5),(3,5),(7,5),(9,5),(10,5),(12,5),(16,5),(18,5),(19,5),(21,5),(25,5),(27,5),(1,6),(2,6),(3,6),(7,6),(8,6),(9,6),(10,6),(11,6),(12,6),(16,6),(17,6),(18,6),(19,6),(20,6),(21,6),(25,6),(26,6),(27,6),(1,7),(2,7),(3,7),(4,7),(5,7),(6,7),(7,7),(8,7),(9,7),(10,7),(11,7),(12,7),(13,7),(14,7),(15,7),(16,7),(17,7),(18,7),(19,7),(20,7),(21,7),(22,7),(23,7),(24,7),(25,7),(26,7),(27,7),(1,8),(3,8),(4,8),(6,8),(7,8),(9,8),(10,8),(12,8),(13,8),(15,8),(16,8),(18,8),(19,8),(21,8),(22,8),(24,8),(25,8),(27,8),(1,9),(2,9),(3,9),(4,9),(5,9),(6,9),(7,9),(8,9),(9,9),(10,9),(11,9),(12,9),(13,9),(14,9),(15,9),(16,9),(17,9),(18,9),(19,9),(20,9),(21,9),(22,9),(23,9),(24,9),(25,9),(26,9),(27,9),(1,10),(2,10),(3,10),(4,10),(5,10),(6,10),(7,10),(8,10),(9,10),(19,10),(20,10),(21,10),(22,10),(23,10),(24,10),(25,10),(26,10),(27,10),(1,11),(3,11),(4,11),(6,11),(7,11),(9,11),(19,11),(21,11),(22,11),(24,11),(25,11),(27,11),(1,12),(2,12),(3,12),(4,12),(5,12),(6,12),(7,12),(8,12),(9,12),(19,12),(20,12),(21,12),(22,12),(23,12),(24,12),(25,12),(26,12),(27,12),(1,13),(2,13),(3,13),(7,13),(8,13),(9,13),(19,13),(20,13),(21,13),(25,13),(26,13),(27,13),(1,14),(3,14),(7,14),(9,14),(19,14),(21,14),(25,14),(27,14),(1,15),(2,15),(3,15),(7,15),(8,15),(9,15),(19,15),(20,15),(21,15),(25,15),(26,15),(27,15),(1,16),(2,16),(3,16),(4,16),(5,16),(6,16),(7,16),(8,16),(9,16),(19,16),(20,16),(21,16),(22,16),(23,16),(24,16),(25,16),(26,16),(27,16),(1,17),(3,17),(4,17),(6,17),(7,17),(9,17),(19,17),(21,17),(22,17),(24,17),(25,17),(27,17),(1,18),(2,18),(3,18),(4,18),(5,18),(6,18),(7,18),(8,18),(9,18),(19,18),(20,18),(21,18),(22,18),(23,18),(24,18),(25,18),(26,18),(27,18),(1,19),(2,19),(3,19),(4,19),(5,19),(6,19),(7,19),(8,19),(9,19),(10,19),(11,19),(12,19),(13,19),(14,19),(15,19),(16,19),(17,19),(18,19),(19,19),(20,19),(21,19),(22,19),(23,19),(24,19),(25,19),(26,19),(27,19),(1,20),(3,20),(4,20),(6,20),(7,20),(9,20),(10,20),(12,20),(13,20),(15,20),(16,20),(18,20),(19,20),(21,20),(22,20),(24,20),(25,20),(27,20),(1,21),(2,21),(3,21),(4,21),(5,21),(6,21),(7,21),(8,21),(9,21),(10,21),(11,21),(12,21),(13,21),(14,21),(15,21),(16,21),(17,21),(18,21),(19,21),(20,21),(21,21),(22,21),(23,21),(24,21),(25,21),(26,21),(27,21),(1,22),(2,22),(3,22),(7,22),(8,22),(9,22),(10,22),(11,22),(12,22),(16,22),(17,22),(18,22),(19,22),(20,22),(21,22),(25,22),(26,22),(27,22),(1,23),(3,23),(7,23),(9,23),(10,23),(12,23),(16,23),(18,23),(19,23),(21,23),(25,23),(27,23),(1,24),(2,24),(3,24),(7,24),(8,24),(9,24),(10,24),(11,24),(12,24),(16,24),(17,24),(18,24),(19,24),(20,24),(21,24),(25,24),(26,24),(27,24),(1,25),(2,25),(3,25),(4,25),(5,25),(6,25),(7,25),(8,25),(9,25),(10,25),(11,25),(12,25),(13,25),(14,25),(15,25),(16,25),(17,25),(18,25),(19,25),(20,25),(21,25),(22,25),(23,25),(24,25),(25,25),(26,25),(27,25),(1,26),(3,26),(4,26),(6,26),(7,26),(9,26),(10,26),(12,26),(13,26),(15,26),(16,26),(18,26),(19,26),(21,26),(22,26),(24,26),(25,26),(27,26),(1,27),(2,27),(3,27),(4,27),(5,27),(6,27),(7,27),(8,27),(9,27),(10,27),(11,27),(12,27),(13,27),(14,27),(15,27),(16,27),(17,27),(18,27),(19,27),(20,27),(21,27),(22,27),(23,27),(24,27),(25,27),(26,27),(27,27)]

যদি আমাদের 4 পয়েন্ট O (0,0), A (1,0), বি (0,1), সি (0,2) থাকে তবে বহুভুজ OABC কি স্ব-ছেদ করে?
ngn

@ngn এটি একটি ভাল বিষয় যা আমি বিবেচনা করি নি! আমি এটি সম্পর্কে চিন্তা করতে হবে। এর পক্ষে বা বিপক্ষে আপনার কোনও যুক্তি থাকলে দয়া করে আমাকে জানান।
flawr

@ngn আমি এই বহুভুজটিকে স্ব-ছেদক হিসাবে গণনা করব। কারণটি হ'ল আমি একটি বহুভুজের সংজ্ঞা দিচ্ছি যদি দুটি প্রান্তের একটি সাধারণ বিন্দু শেষ প্রান্ত নয়, তবে এটি নিজেকে ছেদ করার জন্য একটি বহুভুজকে সংজ্ঞায়িত করব ।
flawr

@ ফ্লোয়ার আমাকে তখনই আমার উত্তর প্রত্যাহার করতে হবে, যখন রেফারেন্স পয়েন্ট থেকে সর্বাধিক কোণে একাধিক কো-লিনিয়ার পয়েন্ট থাকে তবে তা ব্যর্থ হয়।
ngn

উত্তর:


10

গণিত 29 29 বাইট

FindShortestTour (১ By বাইট) কৌতুকটি করে তবে জিজ্ঞাসা করা হয়নি এমন কিছু বহিরাগত তথ্য সরবরাহ করে (পথের দৈর্ঘ্য এবং প্রারম্ভিক বিন্দুতে ফিরে আসা)।

Most@*Last@*FindShortestTour

কেবল উত্তর দেয় (-1 বাইট @ ইউজার 202729 কে ধন্যবাদ)

ভিজ্যুয়ালাইজ করতে, ব্যবহার করুন Graphics@Line[g[[%]]], %উপরের ক্রমশক্তিটি কোথায় পাওয়া গেছে এবং জিটি মূল পয়েন্ট তালিকা।

মেনজার স্পঞ্জের জন্য সমাধানটির দৃশ্যায়ন এখানে দেওয়া হল: এখানে চিত্র বর্ণনা লিখুন

1000 টি এলোমেলো পয়েন্টগুলির জন্য এখানে একটি সমাধান রয়েছে:

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

এখানে কীটি জেনে গেছে যে ইউক্লিডিয়ান দূরত্বটি মেট্রিক হিসাবে ব্যবহৃত হলে সংক্ষিপ্ততম ভ্রমণ বা ভ্রমণ বিক্রয় বিক্রয় সমস্যার সমাধান কখনই ছেদ করতে পারে না। কোনও সমাধানকে স্থানীয়করণ এবং অনুকূলতা নিশ্চিত করার একটি পদক্ষেপ হ'ল এই জাতীয় ছেদগুলি সরিয়ে ফেলা।


6
পি সমস্যা হ্রাস করার কারণে এনপি অ্যালগরিদম ব্যবহার করুন। +1 (???)
ব্যবহারকারী 202729

1
@*মনে হয় একটি বাইট সংরক্ষণ করুন
ব্যবহারকারী 202729


6

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

কোনও অন্তর্নির্মিত ছাড়া, এটি আমার প্রত্যাশার চেয়ে অনেক বেশি দীর্ঘ হতে পারে। অনেকগুলি বাইট কলিগের ওভারল্যাপিং বিভাগগুলি সনাক্ত করতে ব্যয় হয়।

[x,y]স্থানাঙ্কের একটি অ্যারে হিসাবে ইনপুট নেয় । ইনপুট একটি ক্রম ফেরত দেয়।

f=(a,p=[],o=([p,P],[q,Q],[r,R])=>Math.sign((S=[(p>q?r<q|r>p:r<p|r>q)|(P>Q?R<Q|R>P:R<P|R>Q),...S],Q-P)*(r-q)-(q-p)*(R-Q)))=>[...p,p[0]].some((A,i,P)=>P.some((C,j)=>j>i+1&&P[++j+!i]&&[E=o(A,B=P[i+1],C,S=[]),F=o(A,B,D=P[j]),G=o(C,D,A),H=o(C,D,B)].some(v=>!v&!S.pop())|E!=F&G!=H))?0:a[0]?a.some((_,i)=>r=f(b=[...a],p.concat(b.splice(i,1))))&&r:p

ডেমো

এই স্নিপেট আউটপুট লগ করে এবং একটি ক্যানভাসে সম্পর্কিত পথ আঁকেন।

কিভাবে?

মূল রিকার্সিভ ফাংশনটির কাঠামো এখানে (এখন) ছেদ করার জন্য পরীক্ষার কোডটি একদিকে রেখে:

f = (a, p = []) =>                    // a = array of points, p = current path
  [...p,                              // build a closed path array P[] by adding the first
         p[0]]                        // point at the end of p[]
  .some((A, i, P) =>                  // for each point A at position i in P:
    P.some((C, j) =>                  //   for each point C at position j in P:
      j > i + 1 &&                    //     test whether C is at least 2 positions after A
      P[++j +                         //     and C is not the last point
              !i] &&                  //     and i > 0 or C is not the penultimate point
      intersection(                   //     and there's an intersection between
        A, P[i + 1], C, P[j]          //     the segments (A, P[i + 1]) and (C, P[j + 1])
      )                               //     (j was incremented above)
    )                                 //   end of inner some()
  ) ?                                 // end of outer some(); if truthy:
    0                                 //   discard this path by stopping recursion
  :                                   // else:
    a[0] ?                            //   if there's at least one remaining point:
      a.some((_, i) =>                //     for each remaining point at position i:
        r = f(                        //       do a recursive call with:
          b = [...a],                 //         a copy b[] of a[] without a[i] and
          p.concat(b.splice(i, 1)))   //         the extracted point added to the path
      ) && r                          //     end of some(); return the result, if any
    :                                 //   else:
      p                               //     this is a valid path: return it

নীচে ছেদ () পরীক্ষাটির বিশদ দেওয়া আছে। এই পৃষ্ঠাটি ব্যবহৃত অ্যালগরিদম সম্পর্কে একটি বিস্তৃত ব্যাখ্যা সরবরাহ করে।

[                                     // build an array containing:
  E = o(A, B = P[i + 1], C, S = []),  //   E = test of (A, B, C) (+ initialization of S[])
  F = o(A, B, D = P[j]),              //   F = test of (A, B, D)
  G = o(C, D, A),                     //   G = test of (C, D, A)
  H = o(C, D, B)                      //   H = test of (C, D, B)
]                                     //
.some(v =>                            // the segments are collinear and overlapping if:
  !v &                                //   any value above is 0
  !S.pop()                            //   and the corresponding entry in S[] is falsy
) |                                   // the segments intersect if:
E != F & G != H                       //   E is not equal to F and G is not equal to H

অবশেষে, এখানে সহায়ক ফাংশন ও () এর সংজ্ঞা দেওয়া আছে :

o = (                                             // given three points represented by
  [p, P], [q, Q], [r, R]                          // a lowercase letter for x
) =>                                              // and an uppercase letter for y:
  Math.sign(                                      //
    (                                             //   1) prepend to the array S[]
      S = [                                       //      a boolean which is true if the
        (p > q ? r < q | r > p : r < p | r > q) | //      segment (P, Q) would not contain
        (P > Q ? R < Q | R > P : R < P | R > Q),  //      the point R, assuming that the
        ...S                                      //      3 points are collinear
      ],                                          //
                                                  //   2) return the orientation of P, Q, R:
      Q - P                                       //        -1 = counterclockwise
    ) * (r - q) - (q - p) * (R - Q)               //         0 = collinear
  )                                               //        +1 = clockwise

... ব্যাখ্যা দয়া করে?
ব্যবহারকারী 202729

1
@ ব্যবহারকারী202729 (* কপাল জুড়ে হাত মুছুন *) সম্পন্ন!
আরনাউল্ড

5

এপিএল (ডায়ালগ ক্লাসিক) , 42 38 বাইট

{⍋(⍪,(|z)ׯ1*⊢=⌈/)12z0j1⊥¨⍵-⍵[⊃⍋↑⍵]}

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

ইনপুট হ'ল স্থানাঙ্ক জোড়াগুলির একটি তালিকা। আউটপুট হল 0-ভিত্তিক ক্রমানুসারে।

পয়েন্টগুলির তালিকা - যুক্তি { }

⍵[⊃⍋↑⍵] সর্বনিম্নতম বিন্দু point

⍵- সমস্ত পয়েন্ট অনুবাদ করে যাতে বামে-সর্বনিম্নতম স্থানাঙ্ক সিস্টেমের উত্সে থাকে

0j1 কাল্পনিক ইউনিট i = srrt (-1)

0j1⊥¨ স্থানাঙ্কগুলি ডিকোড করে যেমন বেস-i নম্বর সিস্টেমে অঙ্কগুলি - অর্থাত্ (x, y) একটি জটিল সংখ্যা ix + y তে পরিণত হয়

z← ধার্য z

12○জটিল সংখ্যার আর্গুমেন্ট, ওরফে থিটা অ্যাঙ্গেল বা এপিএল বিজ্ঞপ্তি ফাংশন গণনা করে 12

(⍪,(|z)ׯ1*⊢=⌈/)এমন একটি ট্রেন যা বুলিয়ান মাস্কটি যেখানে সর্বাধিক কোণে ( ⊢=⌈/) থাকে তার গণনা করে, মাস্কের 0 1টিকে 1 ¯1-এ পরিবর্তিত করে সংশ্লিষ্ট পাওয়ার ( ¯1*) কে জটিল সংখ্যার দৈর্ঘ্যের দ্বারা গুণিত করে|z , এবং এটি কোণার ,লম্বা পাতলা 1-কলামের ম্যাট্রিক্স ( ) এর ডানদিকে ( ) সংক্ষেপণ করে।

গ্রেড - মেট্রিক্সের সারিগুলি ডিক্সিকোগ্রাফিকভাবে আরোহণের ক্রমানুসারে সাজানোর জন্য এমন অনুগমন ফেরত দেয়


@ ব্যবহারকারী202729 তাদের দ্বিতীয় মাপদণ্ড অনুসারে বাছাই করা হবে - দূরত্ব (অর্থাত্ বিজ্ঞপ্তি ফাংশন 10, ওরফে জটিল দৈর্ঘ্য)
এনজিএন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.