เวกเตอร์แบบยุคลิด


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

ฉันได้เพิ่มพวกเขา @ThomasKwa
Zach Gates

คำตอบ:


2

JavaScript (ES6), 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

Python 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% )


คุณแน่ใจหรือไม่ว่าใช้งานได้ใน python 2? นอกจากนี้คุณสามารถเปลี่ยน "จากการนำเข้าคณิตศาสตร์" เป็น "จากการนำเข้าคณิตศาสตร์ " (ลบช่องว่าง)
Rɪᴋᴇʀ

@RikerW มันเหมาะกับฉัน Ideone: ideone.com/9j86yjใช้\nเป็น linebreaks ...
TFeld

ทำได้ดีมากพร้อมคำอธิบายที่ดีของ "เพื่อนบ้าน" ฉันกังวลเล็กน้อยเกี่ยวกับการใช้งานของคุณinput()และการห่อข้อมูลที่สอดคล้องกันด้วย "" แต่ดูเหมือนจะไม่มีข้อห้ามสำหรับเรื่องนี้!
ทิม Pederick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.