Öklid vektörleri


14

İki vektörün ASCII sanatı göz önüne alındığında, elde edilen vektörün büyüklüğünü ve derecesini bulun.


Giriş

Bu, STDIN yoluyla alınabilir, yerel bir dosyadan okunabilir veya bir işlev çağrısı yoluyla sağlanabilir. İki vektör girişine bir örnek:

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

Bu, kuzeyde 4 birim ve doğuda 7 birim değişikliği temsil eder. Her girişin başlangıç ​​noktası x(ondalık 120) ile gösterilir.

  • Tüm vektörler yatay veya dikey çizgilerdir.

  • Her vektör şu dört uç noktadan birine sahiptir: ^v<>ve bir tire ( -, ondalık 45) veya dikey bir çubuktan ( |, ondalık 124) oluşur.

  • Uçaktaki boş noktalar boşluklarla ( , ondalık 32) doldurulur .

  • Giriş tek olabilir x.

  • Bitişik vektörler her zaman birbirine diktir.

  • Tüm vektörler uçtan uca kuyruktur.


Çıktı

Bu, ortaya çıkan noktanın (başlangıç ​​noktasından uzaklığı) ve başlangıç ​​noktasına göre hareket etme derecesi olacaktır.

Yukarıdaki giriş için, çıktı 8.06birimler ve 60.3dereceler olmalıdır . Her biri tam olarak 3 önemli rakama sahip olmalıdır. 3 önemli basamaklı sayılara birkaç örnek:

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

Tüm birim ölçümleri olacaktır <= 999.


Bu sayılar aşağıdaki biçimde verilmelidir. Bu, yukarıdaki sayıları kullanıyor.

8.06 units @ 60.3 degrees

Bunu tek bir boşluk veya yeni satır takip edebilir.


Giriş tek bir ise x, yer değiştirme ve dolayısıyla yer değiştirme açısı yoksa, çıktı boş bir satır (tek bir yeni satır karakteri) veya aşağıdaki biçimde olmalıdır:

0 units @ - degrees

Bonus için hak kazanmaya çalışıyorsanız, yön de olmalıdır -.


İkramiye 2, 3 veya her ikisinin tamamlanması durumunda, çıktı aşağıdaki modeli izlemeli ve yukarıdaki ile aynı kısıtlamalara uymalıdır.

8.06 units @ 60.3 degrees NE

Dereceler standart düzleme göre ölçülmelidir.

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

0derece doğu, 1 - 89derece kuzeydoğu, 90kuzey vb.


Bonuslar

Aşağıdaki toplam -50% değerinde.

  1. Ele alınabilecek her ilave vektör için% -10 bonus kazanın. Bu bonus 3 defaya kadar uygulanabilir. Vektörler asla örtüşmez veya kesilmez.

  2. Çıktınız açının ana yönünü içeriyorsa% -10 bonus kazanın (kuzey, güney, doğu, batı).

  3. Çıktınız açının ara yönlerini (kuzeydoğu, kuzeybatı, güneydoğu, güneybatı) içeriyorsa% -10 bonus kazanın.


Örnekler

İçinde:

x---->
     |
     v

Dışarı:

5.39 units @ 338 degrees

İsteğe bağlı olarak SE


İçinde:

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

Dışarı:

15.3 units @ 169 degrees

İsteğe bağlı olarak NW


İçinde:

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

Dışarı:

2.24 units @ 297 degrees

İsteğe bağlı olarak SE


Örnekler (çoklu vektörler)

İçinde:

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

Dışarı:

16.3 units @ 349 degrees

İsteğe bağlı olarak SE


İçinde:

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

Dışarı:

8.54 units @ 159 degrees

İsteğe bağlı olarak NW


İçinde:

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

Dışarı:

6.32 units @ 162 degrees

İsteğe bağlı olarak NW


Vektörlerin bir yönde sıfır bileşeni olacak mı? Öyleyse, çıktı ne için olmalıdır x? Kuzey ve Kuzeybatı arasındaki sınır nedir?
lirtosiast

Bu bilgiyi ekledim. Gösterdiğiniz için teşekkürler! ThomasKwa
Zach Gates

Yalnızca bir vektörün bulunduğu bir test durumu eklemelisiniz, örn x-->. Vektörler kesişebilir mi?
lirtosiast

Normal girdi iki vektör olacaktır. Tek istisna boştur x. İkiden fazla olabilir (bonusu tamamlamaya çalışırsanız), ancak daha az olamaz. Birden fazla vektör girişi için örnekler üzerinde çalışıyorum. Hiçbir girişte vektörler çapraz olmaz. ThomasKwa
Zach Gates

Onları ekledim. ThomasKwa
Zach Gates

Yanıtlar:


2

JavaScript (ES6), 305 bayt -% 50 bonus = 152.5 puan

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

açıklama

Giriş boşluklarla doldurulmalıdır. Tüm bonusları kullanır.

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
)

Ölçek


3

Piton 2, 238.5 ( 594 562 482 477-50%) bayt

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

açıklama

Girişteki her karaktere bakarak başlangıç ​​ve bitiş konumlarını bulur.

Başlangıç x

Son her ok ( <>^v) ve komşularına bakarak bulunur . Komşular vektörleri sürdürüyorsa, yok sayın. Yoksa, bu son.

Ok yönüne dik olan komşulara bakın.

Dikey bir çizgi içeriyorlarsa, bu devam eden bir vektördür.

Örnekler ( _boşluğu gösterir):

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

___   
->_   (end)
___   

_|_   
->_   (not end)
___ 

___   
->|   (end)
___ 

---   
->_   (end)
___ 

Bitiş noktası bulunduğundan, herhangi bir sayıda vektör olabilir ( % 30 bonus ).


Bunun python 2'de çalıştığından emin misiniz? Ayrıca, "matematik içe aktarma " dan "matematik içe aktarma " ya (alanı kaldır) değiştirebilirsiniz.
Rɪᴋᴇʀ

@RikerW Benim için çalışıyor. Ideone: ideone.com/9j86yj\n satır sonu olarak kullanıyor ...
TFeld

Aferin, "komşular" güzel bir açıklama ile. Ben sizin kullanımınız input()ve girdinin "" ile örtüşmesiyle ilgili biraz endişeliydim , ama buna karşı bir kural yok gibi görünüyor!
Tim Pederick
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.