Vectơ Euclide


14

Dựa vào nghệ thuật ASCII của hai vectơ, tìm độ lớn và mức độ của vectơ kết quả.


Đầu vào

Điều này có thể được nhận qua STDIN, đọc từ tệp cục bộ hoặc được cung cấp thông qua lệnh gọi hàm. Dưới đây là một ví dụ về đầu vào hai vectơ:

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

Điều này thể hiện sự thay đổi của 4 đơn vị phía bắc và 7 đơn vị phía đông. Mỗi điểm bắt đầu của đầu vào sẽ được biểu thị bằng một x(thập phân 120).

  • Tất cả các vectơ là các đường ngang hoặc dọc.

  • Mỗi vectơ có một trong bốn điểm cuối sau: ^v<>và được tạo thành từ một dấu gạch ngang ( -, số thập phân 45) hoặc thanh dọc ( |, số thập phân 124).

  • Các điểm trống trên mặt phẳng được lấp đầy khoảng trắng ( , số thập phân 32).

  • Đầu vào có thể là một x.

  • Các vectơ liền kề luôn vuông góc với nhau.

  • Tất cả các vectơ là đầu đến đuôi.


Đầu ra

Đây sẽ là sự dịch chuyển của điểm kết quả (khoảng cách từ điểm bắt đầu) và mức độ mà nó đã di chuyển, so với điểm bắt đầu.

Đối với đầu vào trên, đầu ra phải là 8.06đơn vị và 60.3độ. Mỗi nên có chính xác 3 con số quan trọng. Dưới đây là một vài ví dụ về các số có 3 chữ số có nghĩa:

  • 1,00
  • 60,1
  • 453
  • 7,08
  • 4,50
  • 349

Tất cả các phép đo đơn vị sẽ được <= 999.


Những con số này phải được xuất ra ở định dạng dưới đây. Đây là sử dụng các số từ trên.

8.06 units @ 60.3 degrees

Điều này có thể được theo sau bởi một không gian duy nhất hoặc dòng mới.


Nếu đầu vào là một đơn x, không có dịch chuyển và do đó không có góc dịch chuyển, đầu ra phải là một dòng trống (một ký tự dòng mới) hoặc theo định dạng sau:

0 units @ - degrees

Nếu bạn đang cố gắng để đủ điều kiện nhận thưởng, hướng đi cũng sẽ -như vậy.


Trong trường hợp phần thưởng 2, 3 hoặc cả hai được hoàn thành, đầu ra phải tuân theo mô hình dưới đây và tuân theo các hạn chế tương tự như trên.

8.06 units @ 60.3 degrees NE

Độ nên được đo theo mặt phẳng tiêu chuẩn.

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

0độ là đông, 1 - 89độ là đông bắc, 90là bắc, v.v.


Tiền thưởng

Dưới đây có giá trị tổng cộng -50%.

  1. Nhận phần thưởng -10% cho mỗi vectơ bổ sung có thể được xử lý. Phần thưởng này có thể được áp dụng tối đa 3 lần. Các vectơ sẽ không bao giờ trùng nhau hoặc chéo.

  2. Nhận phần thưởng -10% nếu đầu ra của bạn bao gồm hướng chính của góc (bắc, nam, đông, tây).

  3. Nhận phần thưởng -10% nếu đầu ra của bạn bao gồm các hướng trung gian của góc (đông bắc, tây bắc, đông nam, tây nam).


Ví dụ

Trong:

x---->
     |
     v

Ngoài:

5.39 units @ 338 degrees

Tùy chọn SE


Trong:

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

Ngoài:

15.3 units @ 169 degrees

Tùy chọn NW


Trong:

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

Ngoài:

2.24 units @ 297 degrees

Tùy chọn SE


Ví dụ (nhiều vectơ)

Trong:

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

Ngoài:

16.3 units @ 349 degrees

Tùy chọn SE


Trong:

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

Ngoài:

8.54 units @ 159 degrees

Tùy chọn NW


Trong:

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

Ngoài:

6.32 units @ 162 degrees

Tùy chọn NW


Các vectơ sẽ bao giờ có thành phần bằng không theo một hướng? Nếu vậy, đầu ra nên làm xgì? Ranh giới giữa Bắc và Tây Bắc là gì?
lirtosiast

Tôi đã thêm thông tin đó. Cảm ơn đã chỉ ra điều đó! @ThomasKwa
Zach Gates

Bạn nên thêm một trường hợp thử nghiệm trong đó chỉ có một vectơ, ví dụ x-->. Vectơ có thể vượt qua?
lirtosiast

Đầu vào thông thường sẽ là hai vectơ. Ngoại lệ duy nhất là trống rỗng x. Có thể có nhiều hơn hai (nếu cố gắng hoàn thành phần thưởng), nhưng không ít hơn. Tôi đang làm việc trên các ví dụ cho nhiều đầu vào vector. Không có đầu vào sẽ vectơ chéo. @ThomasKwa
Zach Gates

Tôi đã thêm chúng. @ThomasKwa
Zach Gates

Câu trả lời:


2

JavaScript (ES6), 305 byte - Phần thưởng 50% = 152,5 điểm

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`)

Giải trình

Đầu vào phải được đệm bằng khoảng trắng. Sử dụng tất cả tiền thưởng.

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
)

Kiểm tra


3

Python 2, 238,5 ( 594 562 482 477-50%) byte

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']

Giải trình

Tìm vị trí bắt đầu và kết thúc bằng cách nhìn vào từng ký tự trong đầu vào.

Bắt đầu là x

Kết thúc được tìm thấy bằng cách nhìn vào mỗi mũi tên ( <>^v) và hàng xóm của họ. Nếu hàng xóm đang tiếp tục vectơ, bỏ qua. Khác, đây là kết thúc.

Nhìn vào các hàng xóm vuông góc với hướng mũi tên.

Nếu chúng chứa một đường vuông góc, thì đó là một vectơ tiếp tục.

Ví dụ ( _chỉ ra không gian):

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

___   
->_   (end)
___   

_|_   
->_   (not end)
___ 

___   
->|   (end)
___ 

---   
->_   (end)
___ 

Bởi vì điểm cuối được tìm thấy, có thể có bất kỳ số lượng vectơ ( thưởng 30% ).


Bạn có chắc chắn điều này hoạt động trong python 2? Ngoài ra, bạn có thể thay đổi "từ nhập toán học " thành "từ nhập toán học " (xóa khoảng trắng).
Rɪᴋᴇʀ

@RikerW Nó hoạt động với tôi. Ideone: ideone.com/9j86yj sử dụng \nlàm breakbreak ...
TFeld

Làm tốt lắm, với một lời giải thích tốt đẹp của "hàng xóm". Tôi hơi lo ngại về việc bạn sử dụng input()và gói đầu vào tương ứng với "", nhưng dường như không có quy tắc nào chống lại điều đó!
Tim Pederick
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.