Korsan Hazinesi


18

Korsanların gizlediği bir hazineyi bulmak gerçekten çok kolay. Bunun için ihtiyacınız olan her şey bir harita. Korsanların elle harita çizdikleri ve aşağıdaki şekilde bir yer bulmak için algoritmayı tarif ettikleri bilinmektedir: "Yalnız bir palmiye ağacının yanında durun, ormana doğru 30 adım, göle doğru 15 adım yapın ..."

Bu rotada bir yolculuk genellikle manzarayı görmek için harika bir fırsattır ... Ancak, bugünlerde kimse bunun için zamana sahip değil. Bu yüzden hazine arayanlar sizden belirli bir haritayı kullanarak hazinenin tam yerini belirleyecek bir program yazmanızı istediler.


Giriş

Girdi, <Direction> <Distance>virgüllerle ayrılmış (her biri bir boşluk olmak üzere) birden çok komuttan oluşur .

Yön aşağıdakilerden biridir:
N- Kuzey, S- Güney, E- Doğu, W- Batı,
NE- Kuzeydoğu, NW- Kuzeybatı, SE- Güneydoğu, SW- Güneybatı.

Mesafe bir tamsayıdır (1 - 1000).

Çıktı

Sonuç, virgül ve boşlukla ayrılmış üç ondalık basamaklı talimatları bitirdikten sonra koordine ettiğiniz koordinatlardır. Başlangıç ​​konumunun sıfır koordinatı vardır (0, 0).

İlk koordinat X'dir (Doğu sıfırdan büyük koordinatlar, Batı sıfırdan küçük anlamına gelir).
İkinci koordinat Y, (Kuzey aracı daha sıfırdan, Güney aracı az sıfırdan).


Örnekler

1. N 3, E 1, N 1, E 3, S 2, W 1

    3.000, 2.000

2. NW 10

    -7.071, 7.071

3. NE 42, NW 42, SE 42, SW 42

    0.000, 0.000


Kaynak (Ukraynaca). Giriş formatı burada farklı.


8
Logo ile yapmak için bonus puan? ;)
Peter Taylor

@Peter Çıktı formatı katı ... Ama insanların resmi
beğenip beğenmediğini göreceğiz

1
İlk örnek çıktı olmalıdır -3.000, 2.000.
Lowjacker

UCB Logosu ile çıktı formatı olarak elde edilebilir (print (word (form xcor 4 3) ",) (form ycor 4 3)). Ancak girdinin ayrıştırılmasının ne kadar kolay olacağından emin değilim.
Peter Taylor

@ Lowjacker Evet, teşekkürler. Aslında, giriş yanlıştı.
Oleh Prypin

Yanıtlar:


7

Yakut 1.9, 175 171 162 153 130 120 117

l=0
gets.scan(/(\w+) (\d+)/){|d,n|l+=n.to_i*?i.to_c**%w[E NE N NW W SW S SE].index(d).quo(2)}
puts'%.3f, %.3f'%l.rect

?i.to_c1.i-4 bayta kısaltılabilir .
MegaTom

3

Haskell (291)

import Text.Printf
d=sqrt(0.5)
f"N"n(x,y)=(x,y+n)
f"S"n(x,y)=(x,y-n)
f"E"n(x,y)=(x+n,y)
f"W"n(x,y)=(x-n,y)
f[a,b]n(x,y)=(s,t)where(s,_)=f[b](d*n)(x,y);(_,t)=f[a](d*n)(x,y)
p[]=(0,0)
p(a:b:c)=f a(read b::Float)$p c
s(a,b)=printf"%.3f, %.3f"a b
main=getLine>>=putStrLn.s.p.words.filter(/=',')

Desen korumalarını kullanmak için f tanımını değiştirmeye ne dersiniz? Onlar bir satır sonu gerektirmez güzel özelliği var ve bu durumda daha breve olmalıdır. Ayrıca, etkileşim kullanın.
FUZxxl

3

C99 (319 karakter)

#define B ;break;
#include<math.h>
#include<stdio.h>
float x,y,w,z,j;int
main(void){int
k;char
c[3];while(scanf("%s%d,",c,&k)==2){j=k;w=1;switch(c[1]){case'E':w=3;default:w-=2;j=sqrt(k*k/2)B
case
0:w=z=0;}switch(*c){case'N':z=1
B
case'S':z=-1
B
case'E':w=1
B
default:w=-1;}x+=w*j;y+=z*j;}printf("%5.3f, %5.3f\n",x,y);}

giriş stdin, testin çalıştırmak ideone de :)


3

Python, 158 154 150 karakter

p=0j
for s in raw_input().split(','):c,d=s.split();v=sum(dict(N=1j,E=1,S=-1j,W=-1)[x]for x in c);p+=v*int(d)/abs(v)
print'%.3f, %.3f'%(p.real,p.imag)

Aslında 157 karakter var, 158 değil.
Lowjacker

Sanırım ihtiyacım yok, ama genellikle takip eden yeni hattı sayıyorum.
Keith Randall

[157] Satır 1: D=dict(N=1j,E=1,S=-1j,W=-1)[153] Satır 2: jgerçekten gerekli mi? [152] 3-4 Satırları: Python 3'e geçerseniz, raw_inputinputve daha sonra parantez kullanmanız gerekse bile print2 karakter
kaydedersiniz

1
@BlaXpirit: Diksiyon optimizasyonu için teşekkürler. Tüm yönlerin E ve W olması durumunda j satır 2'ye ihtiyaç duyulur. Ortaya çıkan p'nin çalışması .realve .imagçalışması için karmaşık olması gerekir .
Keith Randall

1
int sınıf hem sahiptir imagve real... attrs
JBernardo

3

JavaScript, 179 164 170 168 158 156 153 karakter

prompt(X=Y=0).replace(/(N|S)?(.)? (\d+)/g,
        function(m,y,x,n){
            n/=x&&y?Math.SQRT2:1
            Y+=y?y<'S'?n:-n:0
            X+=x?x<'W'?n:-n:0
        })
alert(X.toFixed(3)+', '+Y.toFixed(3))
  • 170: düzeltilmiş doğruluk sorunu
  • 168: (E|W)normal ifade ile değiştirildi(.)
  • 158: işlevli tekrarlayan mantık yerine değişken d
  • 156: nyeni bir değişken yerine tekrar kullanılmışd
  • 153: Şahsen, bu düzenlemenin on kat daha çirkin olduğunu düşünüyorum, ancak üç karakter daha kısa. Bu RegExp fonksiyonları olarak nesneleri çağırabilir o standart dışı davranışa dayanıyor: /./g('string')aynıdır /./g.exec('string'):

    for(p=prompt(X=Y=0),R=/(N|S)?(.)? (\d+)/g;[,y,x,n]=R(p)||0;X+=x?x<'W'?n:-n:0)n/=x&&y?Math.SQRT2:1,Y+=y?y<'S'?n:-n:0;alert(X.toFixed(3)+', '+Y.toFixed(3))


1
Ne yazık ki, q = .707 yuvarlama hataları nedeniyle "NW 10" girişini geçememektedir; Sanırım 8 karakter ekleyen "q = Math.SQRT1_2" ye ihtiyacınız var. Öte yandan, "(E | W)?" ile "(.)?" çünkü zaten kuzey / güney / ikisini de kurmadınız ve giriş iyi biçimlendirilmiş, 2 karakter tasarrufu.
DocMax

Normal ifade için teşekkürler. Doğruluk konusuna gelince, bunun yerine SQRT2 kullandım ve çarpma işlemini bölmeye değiştirdim.
Casey Chu

2

Haskell, 199 karakter

import Text.Printf
import Complex
i=0:+(1::Float)
e 'S'= -i
e d=i^mod(fromEnum d-1)4
g p(d:s:t)=g(p+(signum.sum.map e)d*(fst(reads s!!0):+0))t
g(x:+y)[]=printf"%.3f, %.3f"x y
main=interact$g 0.words

1

Scala ( 367 , 332)

var (x,y,s)=(.0,.0,.7071);args.mkString(" ").split(",").foreach{m=>val a=m.trim.split(" ");var (n,u,v)=(a(1).toInt,.0,.0);a(0) match{case "N"=>v=1;case "S"=>v= -1;case "E"=>u=1;case "W"=>u= -1;case "NW"=>{u= -s;v=s};case "NE"=>{u=s;v=s};case "SW"=>{u= -s;v= -s};case "SE"=>{u=s;v= -s}};x += n*u;y += n*v};printf("%1.3f %1.3f\n",x,y)

1

Java (459) (445) (402) (382) (363) (352)

import java.util.*;class
M{public
static void main(String[]a){double
x=0,y=0;Scanner
s=new
Scanner(System.in);s.useDelimiter("\\W+");while(s.hasNext()){String
d=s.next();double
z=Math.sqrt(d.length());int
w=s.nextInt();y+=(d.contains("N")?w:d.contains("S")?-w:0)/z;x+=(d.contains("E")?w:d.contains("W")?-w:0)/z;}System.out.format("%1.3f %1.3f",x,y);}}

stdin girişi


1

PowerShell, 178

$input-split','|%{,@{N=0,1
NE=($s=.707106781186548),$s
E=1,0
SE=$s,-$s
S=0,-1
SW=-$s,-$s
W=-1,0
NW=-$s,$s}[($a=-split$_)[0]]*$a[1]}|%{$x+=$_[0]
$y+=$_[1]}
'{0:N3}, {1:N3}'-f$x,$y

Bu, √2 / 2'nin doğruluğunu azaltarak muhtemelen 10 karaktere kadar kaybedebilir.



0

Harika (215)

x=0.0;y=0.0;args.join(' ').split(', ').each{d=it.split(' ');c=d[0]==~/../?Math.sqrt(2):1;s=d[1] as int;a=['N':1,'S':-1,'E':1,'W':-1];m=d[0]=~/N|S/;y+=m?a[m[0]]*(s/c):0;m=d[0]=~/E|W/;x+=m?s/c*a[m[0]]:0};print "$x,$y"

girdiyi program argümanları olarak okur. Misal:

groovy golf.groovy NW 10, SW 10, W 10


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.