海盗宝藏


18

寻找被海盗隐藏的宝藏真的很容易。为此所需的一切只是一张地图。众所周知,海盗们通过手工绘制地图并以以下方式描述寻找位置的算法:“站在一棵孤独的棕榈树附近,朝森林走30步,朝湖走15步,...”

通过这种路线旅行通常是一个欣赏风景的绝好机会...但是,如今没有人有时间这样做。这就是寻宝者要求您编写一个程序的原因,该程序可以使用给定的地图确定寻宝的确切位置。


输入值

输入包含多条指令<Direction> <Distance>,并用逗号分隔(每条指令后跟一个空格)。

方向是以下之一:
N-北,S-南,E-东,W-西,
NE-东北,NW-西北,SE-东南,SW-西南。

距离是整数(1到1000)。

输出量

结果是坐标完成后的坐标,保留小数点后三位,中间用逗号和空格隔开。起始位置的坐标为零(0,0)。

第一个坐标为X(东表示坐标大于零,西表示小于零)。
第二个坐标为Ÿ(北手段更加大于零,南手段大于零)。


例子

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


来源(乌克兰文)。输入格式在那里有所不同。


8
在徽标中获得奖励积分?;)
彼得·泰勒

@Peter输出格式很严格...但是我们将看看人们是否喜欢该图片:D
Oleh Prypin 2011年

1
第一个示例输出应为-3.000, 2.000
Lowjacker

使用UCB徽标时,输出格式为(print (word (form xcor 4 3) ",) (form ycor 4 3))。但是我不确定解析输入会多么容易。
彼得·泰勒

@Lowjacker是的,谢谢。实际上,输入是错误的。
Oleh Prypin,2011年

Answers:


7

红宝石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_c可以缩短1.i为-4个字节。
MegaTom

3

哈斯克尔(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(/=',')

如何更改f的定义以使用模式防护?它们具有不错的属性,不需要换行,在这种情况下应该更简洁。另外,使用交互。
FUZxxl 2011年

3

C99(319个字符)

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

输入stdin,在ideone上运行:)


3

Python,158154150 字符

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)

实际上,你有157个字符,而不是158
Lowjacker

我猜我不需要,但是我通常会计算尾随的换行符。
基思·兰德尔

[157]第1行:D=dict(N=1j,E=1,S=-1j,W=-1)[153]第2行:j真的需要吗?[152]第3-4行:如果您切换到Python 3,raw_inputinput,即使必须使用括号print,也可以保存2个字符[150]
Oleh Prypin 2011年

1
@BlaXpirit:感谢dict的优化。在情况下,需要在第2行第j所有的方向E及W的生成的对需要用于复杂.real.imag工作。
基思·兰德尔

1
int类既有imagrealATTRS ...
JBernardo

3

JavaScript, 179 164 170 168 158 156 153个字符

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:修正精度问题
  • 168:用(E|W)正则表达式替换为(.)
  • 158:用变量替换函数中的重复逻辑 d
  • 156:重用n而不是新变量d
  • 153:就我个人而言,我认为此编辑使其丑陋十倍,但短了三个字符。它基于非标准行为,您可以将RegExp对象称为函数:/./g('string')与相同/./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
不幸的是,由于舍入误差,q = .707未能使“ NW 10”输入失败;我认为您需要添加8个字符的“ q = Math.SQRT1_2”。另一方面,您可以替换“(E | W)?”。与“(。)?” 由于您已经建立了北/南/北/北,而且输入格式正确,因此节省了2个字符。
DocMax 2011年

感谢正则表达式位。至于准确性问题,我改用SQRT2并将乘法转换为除法。
Casey Chu

2

Haskell,199个字符

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

斯卡拉(367

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

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

标准输入


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

通过降低√2/ 2的精度,最多可能会丢失10个字符。



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"

读取输入作为程序参数。例:

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

0

Perl -n 5,122个字节

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

在线尝试!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.