ユークリッドベクトル


14

2つのベクトルのASCIIアートが与えられた場合、結果のベクトルの大きさと次数を見つけます。


入力

これは、STDIN経由で受信したり、ローカルファイルから読み取ったり、関数呼び出しで提供したりできます。2つのベクトル入力の例を次に示します。

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

これは、北4ユニットと東7ユニットの変更を表します。すべての入力の開始点はx(10進数120)で表されます。

  • すべてのベクトルは水平線または垂直線です。

  • 各ベクトルには、次の4つのエンドポイント^v<>のいずれかがあります:、ダッシュ(-、10進数45)または垂直バー(|、10進数124)のいずれかで構成されます。

  • 平面上の空のポイントはスペースで埋められます(、10進数の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ですか?北と北西の境界は何ですか?
リルトシアスト

その情報を追加しました。それを指摘してくれてありがとう!@ThomasKwa
ザックゲイツ

たとえば、ベクターが1つしかないテストケースを追加する必要がありx-->ます。ベクトルは交差できますか?
リルトシアスト

通常の入力は2つのベクトルになります。唯一の例外はempty xです。3つ以上(ボーナスを完了しようとする場合)がありますが、それ以上ではありません。複数のベクトル入力の例に取り組んでいます。入力がない場合、ベクトルは交差しません。@ThomasKwa
ザックゲイツ

それらを追加しました。@ThomasKwa
ザックゲイツ

回答:


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()入力の使用とそれに対応する入力の「」でのラップについては少し心配していましたが、それに対するルールはないようです!
ティムペデリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.