यूक्लिडियन क्षेत्र


14

दो वैक्टरों की ASCII कला को देखते हुए, परिणामी वेक्टर के परिमाण और डिग्री का पता लगाएं।


इनपुट

यह STDIN के माध्यम से प्राप्त किया जा सकता है, एक स्थानीय फ़ाइल से पढ़ा जा सकता है, या फ़ंक्शन कॉल के माध्यम से प्रदान किया जा सकता है। यहाँ एक दो वेक्टर इनपुट का एक उदाहरण दिया गया है:

^------>
|
|
|
x

यह उत्तर में 4 इकाइयों और पूर्व में 7 इकाइयों के परिवर्तन का प्रतिनिधित्व करता है। हर इनपुट के शुरुआती बिंदु को एक x(दशमलव 120) द्वारा दर्शाया जाएगा ।

  • सभी वैक्टर क्षैतिज या ऊर्ध्वाधर रेखाएं हैं।

  • प्रत्येक वेक्टर में इन चार समापन बिंदुओं में से एक है: ^v<>और एक डैश ( -, दशमलव 45) या एक ऊर्ध्वाधर बार ( |, दशमलव 124) से बना है।

  • विमान पर खाली स्थान रिक्त स्थान ( , दशमलव 32) से भरे हुए हैं ।

  • इनपुट एकल हो सकता है x

  • आसन्न वैक्टर हमेशा एक-दूसरे के लंबवत होते हैं।

  • सभी वैक्टर टिप-टू-टेल हैं।


उत्पादन

यह परिणामी बिंदु का विस्थापन (प्रारंभिक बिंदु से दूरी) और उस बिंदु तक चला जाएगा, जो प्रारंभिक बिंदु के सापेक्ष है।

उपरोक्त इनपुट के लिए, आउटपुट 8.06यूनिट और 60.3डिग्री होना चाहिए । प्रत्येक में 3 महत्वपूर्ण आंकड़े होने चाहिए। यहां 3 महत्वपूर्ण अंकों के साथ कुछ उदाहरण दिए गए हैं:

  • 1.00
  • 60.1
  • 453
  • 7.08
  • 4.50
  • 349

सभी यूनिट माप होंगे <= 999


इन नंबरों को नीचे प्रारूप में आउटपुट होना चाहिए। यह ऊपर से संख्याओं का उपयोग कर रहा है।

8.06 units @ 60.3 degrees

इसके बाद सिंगल ट्रेलिंग स्पेस या न्यूलाइन हो सकता है।


यदि इनपुट एक एकल है x, जिसमें कोई विस्थापन नहीं है और इसलिए विस्थापन का कोई कोण नहीं है, तो आउटपुट या तो एक खाली लाइन (एकल न्यूलाइन वर्ण) या निम्न प्रारूप में होना चाहिए:

0 units @ - degrees

यदि आप बोनस के लिए अर्हता प्राप्त करने की कोशिश कर रहे हैं, तो दिशा भी होनी चाहिए -


इस मामले में कि बोनस 2, 3, या दोनों पूरे हो गए हैं, आउटपुट को नीचे दिए गए मॉडल का पालन करना चाहिए और ऊपर दिए गए प्रतिबंधों का पालन करना चाहिए।

8.06 units @ 60.3 degrees NE

मानक विमान के अनुसार डिग्री को मापा जाना चाहिए।

       90
  135  |  45
      \|/
180 ---x---- 0
      /|\
  225  |  315
      270

0डिग्री पूर्व है, 1 - 89डिग्री उत्तर-पूर्व है, 90उत्तर है, आदि।


बोनस

निम्नलिखित कुल -50% के लायक हैं।

  1. प्रत्येक अतिरिक्त वेक्टर के लिए -10% बोनस लें, जिसे संभाला जा सकता है। इस बोनस को 3 बार तक लागू किया जा सकता है। वेक्टर्स कभी भी ओवरलैप या क्रॉस नहीं करेंगे।

  2. यदि आपके आउटपुट में कोण (उत्तर, दक्षिण, पूर्व, पश्चिम) की कार्डिनल दिशा शामिल है तो -10% बोनस लें।

  3. यदि आपके आउटपुट में कोण (उत्तर-पूर्व, उत्तर-पश्चिम, दक्षिण-पूर्व, दक्षिण-पश्चिम) का मध्यवर्ती निर्देश शामिल है तो -10% बोनस लें।


उदाहरण

में:

x---->
     |
     v

बाहर:

5.39 units @ 338 degrees

वैकल्पिक रूप से SE


में:

<--------------^
               |
               |
               x

बाहर:

15.3 units @ 169 degrees

वैकल्पिक रूप से NW


में:

x
|
|<-----^
|      |
v------>

बाहर:

2.24 units @ 297 degrees

वैकल्पिक रूप से SE


उदाहरण (एकाधिक वैक्टर)

में:

x--->
    |
    |
    v----------->

बाहर:

16.3 units @ 349 degrees

वैकल्पिक रूप से SE


में:

<-------^
|       |
|       |
v       |
        |
        |
        x

बाहर:

8.54 units @ 159 degrees

वैकल्पिक रूप से NW


में:

^-->
|  |
|  v
|
<--------x

बाहर:

6.32 units @ 162 degrees

वैकल्पिक रूप से NW


क्या वैक्टर में कभी एक दिशा में शून्य घटक होगा? यदि हां, तो आउटपुट क्या होना चाहिए x? उत्तर और उत्तर पश्चिम के बीच की सीमा क्या है?
lirtosiast

मैंने वह जानकारी जोड़ी है। इस पर ध्यान दिलाने के लिए धन्यवाद! @ThomasKwa
Zach Gates

आपको एक परीक्षण मामला जोड़ना चाहिए जहां केवल एक वेक्टर है, जैसे x-->। क्या वैक्टर पार कर सकते हैं?
lirtosiast

नियमित इनपुट दो वैक्टर होंगे। एकल अपवाद खाली है x। दो से अधिक हो सकते हैं (यदि बोनस पूरा करने का प्रयास), लेकिन कम नहीं। मैं कई वेक्टर इनपुट्स के उदाहरणों पर काम कर रहा हूं। किसी भी इनपुट में वैक्टर क्रॉस नहीं होंगे। @ थोमसकवा
जैच गेट्स '

मैंने उन्हें जोड़ा है। @ThomasKwa
Zach Gates

जवाबों:


2

जावास्क्रिप्ट (ईएस 6), 305 बाइट्स - 50% बोनस = 152.5 स्कोर

v=>(l=v.search`
`+1,s=v.search`x`,u=0,d="-",v.replace(/[<>v^]/g,(p,i)=>{c=o=>v[i+o]!=q;with(Math)if(p<"?"?c(l,q="|")&c(-l):c(1,q="-")&c(-1))d=(atan2(x=i%l-s%l,y=(i/l|0)-(s/l|0))*180/PI+270)%360,u=sqrt(x*x+y*y)}),u[p="toPrecision"](3)+` units @ ${d[p](3)} degrees`)

व्याख्या

रिक्त स्थान के साथ इनपुट होना चाहिए। सभी बोनस का उपयोग करता है।

v=>(
  l=v.search`
`+1,                                                     // l = line length
  s=v.search`x`,                                         // s = index of start point
  u=0,                                                   // u = units
  d=                                                     // d = degrees
  w="-",                                                 // w = cardinal direction
  v.replace(/[<>v^]/g,(p,i)=>{                           // for each endpoint
    c=o=>v[i+o]!=q;                                      // compares cell at offset to char
    with(Math)                                           // save having to write "Math."
      if(p<"?"?c(l,q="|")&c(-l):c(1,q="-")&c(-1))        // check for line branching off
        d=(atan2(
          x=i%l-s%l,                                     // x = relative x
          y=(i/l|0)-(s/l|0)                              // y = relative y
        )*180/PI+270)%360,                               // convert to degrees
        u=sqrt(x*x+y*y),
        w="N S"[sign(y)+1]+"W E"[sign(x)+1]              // get cardinal direction
  }),
  u[p="toPrecision"](3)+` units @ ${d[p](3)} degrees `+w // format output
)

परीक्षा


3

पायथन 2, 238.5 ( 594 562 482 477-50%) बाइट्स

from math import*
def F(x):s='%.3g'%x;return[[s+'.',s]['.'in s].ljust(4,'0'),s][x>99]
I=input()
V=I.split('\n');N=len(V)
l=max(len(x)for x in V)
q=[' '*(l+2)];V=q+[' '+x.ljust(l+1)for x in V]+q
for k in range(N*l):
 i,j=k/l,k%l;c=V[i+1][j+1]
 if c in'<>^v'and['|'not in zip(*V)[j+1][i:i+3],'-'not in V[i+1][j:j+3]][c>'?']:a,b=i,j
 if c=='x':A,B=i,j
Y=A-a;X=b-B;a=atan2(Y,X)/pi*180%360
print[F(hypot(X,Y))+' units @ '+F(a)+' degrees '+' NS'[cmp(Y,0)]+' EW'[cmp(X,0)],''][I=='x']

व्याख्या

इनपुट में प्रत्येक वर्ण को देखकर आरंभ और अंत की स्थिति ढूँढता है।

प्रारंभ है x

अंत प्रत्येक तीर ( <>^v), और उनके पड़ोसियों को देखकर पाया जाता है। यदि पड़ोसियों को वैक्टर जारी है, तो अनदेखा करें। और, यह अंत है।

तीर की दिशा में लंबवत पड़ोसियों को देखें।

यदि उनमें एक लंब रेखा होती है, तो यह एक सतत वेक्टर है।

उदाहरण ( _स्थान इंगित करता है):

_#_   
->_   Neighbors marked by #
_#_ 

___   
->_   (end)
___   

_|_   
->_   (not end)
___ 

___   
->|   (end)
___ 

---   
->_   (end)
___ 

क्योंकि अंत बिंदु पाया जाता है, किसी भी संख्या में वैक्टर ( 30% बोनस ) हो सकते हैं।


क्या आपको यकीन है कि यह अजगर 2 में काम करता है? साथ ही, आप "गणित के आयात से " को "गणित के आयात से " (स्थान को हटा सकते हैं) में बदल सकते हैं ।
R

@RikerW यह मेरे लिए काम करता है। Ideone: ideone.com/9j86yj लाइनब्रेक के\n रूप में उपयोग करता है ...
TFeld

अच्छी तरह से किया, "पड़ोसियों" की एक अच्छी व्याख्या के साथ। मैं आपके उपयोग से input()और "" के साथ इनपुट के संबंधित रैपिंग से थोड़ा चिंतित था , लेकिन इसके खिलाफ कोई नियम नहीं लगता है!
टिम पैडरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.