欧几里得向量


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

后面可以跟一个空格或换行符。


如果输入是single 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
扎克·盖茨

您应该添加一个测试用例,其中只有一个向量,例如x-->。向量可以交叉吗?
lirtosiast

常规输入将是两个向量。唯一的例外是空x。可能有两个以上(如果尝试完成奖金),但不能少于两个。我正在研究多个向量输入的示例。在任何输入下,矢量都不会交叉。@ThomasKwa
扎克·盖茨

我添加了他们。@ThomasKwa
扎克·盖茨

Answers:


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为换行...
TFeld

做得好,对“邻居”有一个很好的解释。我有点担心您input()对输入的使用以及使用“”进行的换行,但是似乎并没有针对它的规则!
蒂姆·佩德瑞克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.