Harta Karun Bajak Laut

18

Menemukan harta karun yang disembunyikan oleh bajak laut sangat mudah. Semua yang Anda butuhkan untuk ini adalah peta. Diketahui secara luas bahwa bajak laut menggambar peta dengan tangan dan menggambarkan algoritme untuk menemukan tempat dengan cara berikut: "Berdirilah di dekat pohon palem yang sendirian, lakukan 30 langkah menuju hutan, 15 menuju danau, ..."

Perjalanan melalui rute seperti itu biasanya merupakan peluang besar untuk melihat pemandangan ... Namun, saat ini tidak ada yang punya waktu untuk itu. Itu sebabnya pencari harta telah meminta Anda untuk menulis sebuah program yang akan menentukan lokasi yang tepat dari harta menggunakan peta yang diberikan.


Memasukkan

Input terdiri dari beberapa instruksi <Direction> <Distance>, dipisahkan dengan koma (yang diikuti oleh masing-masing spasi putih).

Arahnya adalah salah satu dari yang berikut:
N- Utara, S- Selatan, E- Timur, W- Barat,
NE- Timur Laut, NW- Barat Laut, SE- Tenggara, SW- Barat Daya.

Jarak adalah bilangan bulat (1 hingga 1000).

Keluaran

Hasilnya adalah koordinat tempat Anda berakhir setelah menyelesaikan instruksi, dengan tiga tempat desimal, dipisahkan dengan koma dan spasi putih. Lokasi awal memiliki nol koordinat (0, 0).

Koordinat pertama adalah X (Timur berarti koordinat lebih besar dari nol, Barat berarti kurang dari nol).
Koordinat kedua adalah Y (Utara berarti lebih dari nol, Selatan berarti kurang dari nol).


Contohnya

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


Sumber (dalam bahasa Ukraina). Format input berbeda di sana.

Oleh Prypin
sumber
8
Poin bonus untuk melakukannya di Logo? ;)
Peter Taylor
@ Peter Format outputnya ketat ... Tapi kita akan lihat apakah orang menyukai gambar: D
Oleh Prypin
1
Output contoh pertama seharusnya -3.000, 2.000.
Lowjacker
dengan Logo UCB format output dapat diperoleh sebagai (print (word (form xcor 4 3) ",) (form ycor 4 3)). Tapi saya tidak yakin betapa mudahnya menguraikan input.
Peter Taylor
@ Lowjacker Ya, terima kasih. Sebenarnya, inputnya salah.
Oleh Prypin

Jawaban:

7

Ruby 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
Lowjacker
sumber
?i.to_cdapat disingkat menjadi 1.i-4 byte.
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(/=',')
marinus
sumber
Bagaimana dengan mengubah definisi f untuk menggunakan pelindung pola? Mereka memiliki properti bagus untuk tidak memerlukan jeda baris dan harus lebih berkembang biak dalam hal ini. Juga, gunakan berinteraksi.
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);}

masukan stdin, uji coba di ideone :)

pmg
sumber
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)
Keith Randall
sumber
Anda sebenarnya memiliki 157 karakter, bukan 158.
Lowjacker
Saya kira saya tidak perlu, tetapi saya biasanya menghitung baris baru.
Keith Randall
[157] Baris 1: D=dict(N=1j,E=1,S=-1j,W=-1)[153] Baris 2: jbenar-benar diperlukan? [152] Baris 3-4: Jika Anda beralih ke Python 3, raw_inputinput, dan meskipun Anda harus menggunakan tanda kurung setelahnya print, Anda menyimpan 2 karakter [150]
Oleh Prypin
1
@BlaXpirit: Terima kasih atas optimasi dikt. J diperlukan pada baris 2 jika semua arah adalah E dan W. Hasil p harus kompleks untuk .realdan .imagbekerja.
Keith Randall
1
kelas int memiliki keduanya imagdan realattrs ...
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: masalah akurasi tetap
  • 168: diganti (E|W)dalam regex dengan(.)
  • 158: diganti logika berulang yang berfungsi dengan variabel d
  • 156: digunakan kembali nalih-alih variabel barud
  • 153: Secara pribadi, saya pikir suntingan ini membuatnya sepuluh kali lebih buruk, tetapi tiga karakter lebih pendek. Ini didasarkan pada perilaku non-standar yang Anda dapat memanggil objek RegExp sebagai fungsi: /./g('string')sama dengan /./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))

Casey Chu
sumber
1
Sayangnya, q = .707 gagal input "NW 10" karena kesalahan pembulatan; Saya pikir Anda perlu "q = Math.SQRT1_2" yang menambahkan 8 karakter. Di sisi lain, Anda dapat mengganti "(E | W)?" dengan "(.)?" karena Anda telah membuat utara / selatan / tidak dan inputnya terbentuk dengan baik, menghemat 2 karakter.
DocMax
Terima kasih atas sedikit regex. Adapun masalah akurasi, saya menggunakan SQRT2 sebagai gantinya dan beralih multiplikasi ke divisi.
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
hammar
sumber
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)
Lalith
sumber
1

Jawa (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);}}

input stdin

kebenaran
sumber
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

Ini mungkin dapat kehilangan hingga 10 karakter dengan mengurangi keakuratan √2 / 2.

Joey
sumber
1

C (gcc) , 155 152 byte

-3 bytes berkat ceilingcat

float x,y,l;D;main(d){for(;scanf("%s%f,",&d,&l)>0;y+=d^78?d^83?0:-l:l)D=d,l/=D>99?D/=256,d&=255,sqrt(2):1,x+=D^87?D^69?0:l:-l;printf("%.3f, %.3f",x,y);}

Cobalah online!

gastropner
sumber
0

Groovy (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"

membaca input sebagai argumen program. Contoh:

groovy golf.groovy NW 10, SW 10, W 10
TheBigS
sumber
0

Perl 5 -n , 122 byte

s,(N|S)?(E|W)? (\d+),$d=$3/($1&$2?2**.5:1);$x+=$2&&$d*(-1)**($2gt F);$y+=$1&&$d*(-1)**($1gt O),ge;printf"%.3f, %.3f",$x,$y

Cobalah online!

Xcali
sumber
0

J , 93 byte

[:0j3&":@+.@(1#.".@>@{:*(0j1^2%~i.8){~<;._1@' E NE N NW W SW S SE'i.{.)@|:[:(<;._1);._1', ',]

Cobalah online!

Jonah
sumber