Kho báu hải tặc


18

Tìm kiếm một kho báu được ẩn giấu bởi những tên cướp biển thực sự dễ dàng. Tất cả mọi thứ bạn cần cho việc này là một bản đồ. Người ta biết rằng hải tặc vẽ bản đồ bằng tay và mô tả thuật toán để tìm địa điểm theo cách sau: "Đứng gần một cây cọ đơn độc, thực hiện 30 bước về phía rừng, 15 về phía hồ, ..."

Một hành trình qua tuyến đường như vậy thường là một cơ hội tuyệt vời để ngắm cảnh ... Tuy nhiên, ngày nay không ai có thời gian cho việc đó. Đó là lý do tại sao những người tìm kiếm kho báu đã yêu cầu bạn viết một chương trình xác định vị trí chính xác của kho báu bằng một bản đồ nhất định.


Đầu vào

Đầu vào bao gồm nhiều hướng dẫn <Direction> <Distance>, được phân tách bằng dấu phẩy (được theo sau bởi một khoảng trắng mỗi dấu).

Hướng là một trong những hướng sau:
N- Bắc, S- Nam, E- Đông, W- Tây,
NE- Đông Bắc, NW- Tây Bắc, SE- Đông Nam, SW- Tây Nam.

Khoảng cách là một số nguyên (1 đến 1000).

Đầu ra

Kết quả là tọa độ nơi bạn kết thúc sau khi hoàn thành các hướng dẫn, với ba vị trí thập phân, được phân tách bằng dấu phẩy và khoảng trắng. Vị trí bắt đầu có tọa độ bằng không (0, 0).

Tọa độ đầu tiên là X (Đông có nghĩa là tọa độ lớn hơn 0, Tây có nghĩa nhỏ hơn 0).
Tọa độ thứ hai là Y (Bắc có nghĩa là nhiều hơn 0, Nam có nghĩa nhỏ hơn 0).


Ví dụ

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


Nguồn (bằng tiếng Ukraina). Định dạng đầu vào là khác nhau ở đó.


8
Điểm thưởng cho việc làm nó trong Logo? ;)
Peter Taylor

@Peter Định dạng đầu ra rất nghiêm ngặt ... Nhưng chúng ta sẽ xem mọi người có thích ảnh không: D
Oleh Prypin

1
Đầu ra ví dụ đầu tiên phải là -3.000, 2.000.
Lowjacker

với Logo UCB, định dạng đầu ra có thể được lấy là (print (word (form xcor 4 3) ",) (form ycor 4 3)). Nhưng tôi không chắc việc phân tích cú pháp đầu vào sẽ dễ dàng như thế nào.
Peter Taylor

@Lowjacker Vâng, cảm ơn. Trên thực tế, đầu vào là sai.
Oleh Prypin

Câu trả lời:


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

?i.to_ccó thể rút ngắn xuống còn 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(/=',')

Làm thế nào về việc thay đổi định nghĩa của f để sử dụng các mẫu bảo vệ? Họ có tài sản tốt để không yêu cầu ngắt dòng và sẽ được khoe khoang hơn trong trường hợp này. Ngoài ra, sử dụng tương tác.
FUZxxl

3

C99 (319 ký tự)

#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);}

đầu vào stdin, chạy thử tại ideone :)


3

Python, 158 154 150 ký tự

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)

Bạn thực sự có 157 ký tự, không phải 158.
Lowjacker

Tôi đoán tôi không cần, nhưng tôi thường đếm dòng mới.
Keith Randall

[157] Dòng 1: D=dict(N=1j,E=1,S=-1j,W=-1)[153] Dòng 2: có jthực sự cần thiết? [152] Dòng 3-4: Nếu bạn chuyển sang Python 3, raw_inputinputvà mặc dù bạn phải sử dụng dấu ngoặc đơn sau print, bạn vẫn lưu 2 ký tự [150]
Oleh Prypin

1
@BlaXpirit: Cảm ơn đã tối ưu hóa chính tả. J là cần thiết trong dòng 2 trong trường hợp tất cả các hướng dẫn là E và W. Kết quả là nhu cầu p là phức tạp cho .real.imaglàm việc.
Keith Randall

1
lớp int có cả imagrealattrs ...
JBernardo

3

JavaScript, 179 164 170 168 158 156 153 ký tự

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: sự cố chính xác
  • 168: thay thế (E|W)trong regex bằng(.)
  • 158: thay thế logic lặp đi lặp lại trong chức năng bằng biến d
  • 156: tái sử dụng nthay vì một biến mớid
  • 153: Cá nhân, tôi nghĩ rằng chỉnh sửa này làm cho nó xấu hơn gấp mười lần, nhưng nó ngắn hơn ba ký tự. Nó dựa trên hành vi không chuẩn mà bạn có thể gọi các đối tượng RegExp là các hàm: /./g('string')giống như /./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
Thật không may, q = .707 không thành công đầu vào "NW 10" do lỗi làm tròn; Tôi nghĩ bạn cần "q = Math.SQRT1_2" có thêm 8 ký tự. Mặt khác, bạn có thể thay thế "(E | W)?" với "(.)?" vì bạn đã thiết lập bắc / nam / không và đầu vào được hình thành tốt, tiết kiệm 2 ký tự.
DocMax

Cảm ơn bit regex. Đối với vấn đề chính xác, tôi đã sử dụng SQRT2 thay vào đó và chuyển phép nhân sang phép chia.
Casey Chu

2

Haskell, 199 ký tự

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

đầu vào stdin


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

Điều này có thể mất tối đa 10 ký tự bằng cách giảm độ chính xác của √2 / 2.



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"

đọc đầu vào dưới dạng đối số chương trình. Thí dụ:

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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.