L o o p I t


22

नोट: इस प्रश्न का शीर्षक "लूप इट" होना चाहिए, लेकिन क्योंकि शीर्षक में कम से कम 15 अक्षर होने चाहिए, कुछ अदृश्य स्थान हैं। यह नोट ऐसा है कि चुनौती को खोजा जा सकता है।


चुनौती

विमान में अद्वितीय अभिन्न बिंदुओं की एक सीमित सूची को देखते हुए, एक बहुभुज ढूंढें जिनके कोने बिल्कुल उन बिंदु हैं, जो स्वयं को काटना नहीं करता है।

विवरण

  • इनपुट के रूप में आप प्रत्येक x- और y- निर्देशांक या जोड़े की सूची के साथ उदा दो सूची ले सकते हैं।
  • इनपुट सूची में कम से कम 3 बिंदु हैं।
  • ध्यान दें कि इसका मतलब यह है कि एक अनूठा समाधान कभी नहीं है।
  • आदानों की सूची को सह-रैखिक नहीं माना जा सकता है (बिंदुओं को एक पंक्ति में समाहित नहीं किया जा सकता है), इसका मतलब यह है कि वास्तव में ऐसा गैर-स्व-प्रतिच्छेद बहुभुज है।
  • प्रत्येक शीर्ष पर कोण मनमाना है, इसमें 180 ° शामिल है।
  • लंबाई की एक इनपुट के लिए n, उत्पादन एक क्रमचय होना चाहिए (p1,p2,p3,...,pn)की (1,2,3,...,n)जहां kमई के प्रवेश pkका प्रतिनिधित्व करता है pइनपुट सूची में मई के बिंदु। इस का मतलब है हम से एक रेखा है 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), B (0,1), C (0,2) है, तो बहुभुज OABC स्व-प्रतिच्छेदन है?
ngn

@ngn यह एक अच्छा बिंदु है जिस पर मैंने विचार नहीं किया! मुझे इसके बारे में सोचना पड़ेगा। यदि आपके पास या इसके खिलाफ कोई तर्क है तो कृपया मुझे बताएं।
'५०

@ मैं इस बहुभुज को स्व-प्रतिच्छेदन के रूप में गिनूंगा। कारण यह है कि मैं होना करने के लिए एक बहुभुज को परिभाषित होता है स्वयं अन्तर्विभाजक अगर वहाँ दो किनारों की एक आम बात है कि एक अंतिम बिंदु नहीं है।
15

@flawr मुझे अपना उत्तर वापस लेना चाहिए, यह तब विफल हो जाता है जब संदर्भ बिंदु से अधिकतम कोण पर कई सह-रैखिक बिंदु होते हैं।
ngn

जवाबों:


10

गणितज्ञ २ ९ 28 बाइट्स

FindShortestTour (16 बाइट्स) चाल करता है, लेकिन कुछ बाहरी जानकारी नहीं देता है (पथ की लंबाई, और शुरुआती बिंदु पर वापसी)।

Most@*Last@*FindShortestTour

बस जवाब देता है (@ उपयोगकर्ता 202729 को -1 बाइट धन्यवाद)

कल्पना करना, उपयोग करना Graphics@Line[g[[%]]], जहां% ऊपर क्रमपरिवर्तन पाया जाता है और जी मूल बिंदु सूची है।

यहाँ मेन्जर स्पंज के समाधान की कल्पना है: यहां छवि विवरण दर्ज करें

यहाँ 1000 यादृच्छिक बिंदुओं पर एक समाधान है:

यहां छवि विवरण दर्ज करें

यहां कुंजी यह जान रही है कि यूक्लिडियन दूरी को मीट्रिक के रूप में उपयोग किए जाने पर सबसे छोटी यात्रा या यात्रा सेल्समैन समस्या समाधान कभी भी चौराहों की उपज नहीं देगा। एक समाधान को स्थानीय बनाने और इष्टतमता सुनिश्चित करने के लिए एक कदम इस तरह के चौराहों को हटाने के लिए है।


6
P समस्या को हल करने के लिए NP एल्गोरिथ्म का उपयोग करें क्योंकि यह छोटा है। +1 (???)।
user202729

1
@*एक बाइट को बचाने के लिए लगता है।
user202729


6

जावास्क्रिप्ट (ईएस 6), 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 () की संरचना है , जो अब के लिए प्रतिच्छेदन परीक्षण कोड को छोड़कर:

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

... स्पष्टीकरण कृपया?
user202729

1
@ user202729 (* माथे पर हाथ पोंछे *) हो गया!
अरनुलद

5

एपीएल (डायलॉग क्लासिक) , 42 38 बाइट्स

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

इसे ऑनलाइन आज़माएं!

इनपुट समन्वय जोड़े की एक सूची है। आउटपुट 0-आधारित क्रमपरिवर्तन है।

अंकों की सूची है - के तर्क { }

⍵[⊃⍋↑⍵] सबसे निचला बिंदु है

⍵- सभी बिंदुओं का अनुवाद करता है ताकि बाईं ओर-सबसे कम समन्वय प्रणाली के मूल में हो

0j1 काल्पनिक इकाई i = sqrt (-1)

0j1⊥¨ निर्देशांक को डिकोड करता है जैसे कि आधार-आई संख्या प्रणाली में अंक - अर्थात (x, y) एक जटिल संख्या ix + y में बदल जाता है

z← को आवंटित z

12○जटिल संख्या के तर्कों, उर्फ ​​थीटा कोणों या एपीएल परिपत्र फ़ंक्शन की गणना करता है 12 की

(⍪,(|z)ׯ1*⊢=⌈/)एक ट्रेन है जो एक बूलियन मास्क की गणना करती है जहाँ कोण अधिकतम पर ( ⊢=⌈/) होते हैं, मास्क में 0 1 को 1 into1 में बदल देता है, इसी शक्ति को utes1 बढ़ाकर ( ¯1*), जटिल संख्या के परिमाण द्वारा गुणा करता है|z , और कोणों के ,लम्बे पतले 1-स्तंभ मैट्रिक्स ( ) के दाईं ओर ( समतल ) है।

ग्रेड - क्रमचय लौटाता है जो आरोही क्रम में मैट्रिक्स की पंक्तियों को क्रमबद्ध रूप से क्रमबद्ध करता है


@ user202729 उन्हें दूसरी कसौटी के अनुसार क्रमबद्ध किया जाएगा - दूरी (अर्थात गोलाकार कार्य 10, उर्फ ​​जटिल परिमाण)
ngn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.