海賊の宝


18

海賊に隠された宝物を見つけるのは本当に簡単です。これに必要なものはすべてマップです。海賊が手作業で地図を描き、アルゴリズムを説明して次のように場所を見つけることは広く知られています。

そのようなルートを通る旅は、通常、景色を見る絶好の機会です...しかし、今日、誰もそのための時間を持っていません。それが宝探し者が、与えられた地図を使って宝の正確な位置を決定するプログラムを書くようにあなたに頼んだ理由です。


入力

入力は、<Direction> <Distance>コンマで区切られた複数の命令で構成されます(その後にそれぞれ1つの空白が続きます)。

方向は次のいずれかです。-
N北、S-南、E-東、W-西、
NE-北東、NW-北西、SE-南東、SW-南西。

距離は整数(1〜1000)です。

出力

結果は、コンマと空白で区切られた小数点以下3桁で、命令の終了後に終わる座標です。開始位置の座標はゼロ(0、0)です。

最初の座標はXです(東はゼロより大きい座標、西はゼロより小さい座標を意味します)。
第2の座標であるY(北手段よりゼロより、サウス手段未満ゼロより)。


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

1
最初の出力例はである必要があります-3.000, 2.000
ロージャッカー

UCBロゴを使用すると、出力形式はとして取得できます(print (word (form xcor 4 3) ",) (form ycor 4 3))。しかし、入力の解析がどれほど簡単かはわかりません。
ピーターテイラー

@Lowjackerはい、ありがとう。実際には、入力が間違っていました。
オレPrypin

回答:


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_c1.i-4バイトに短縮できます。
メガトム

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

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

入力、ideone stdinでのテスト実行 :)


3

Pythonの、158の 154 150文字

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)

実際には158文字ではなく157文字があります
。– 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]保存し、
オレグPrypin

1
@BlaXpirit:dictの最適化をありがとう。すべての方向がために複雑にEおよびW.結果のpニーズある場合にはjが2行に必要とされている.realし、.imag仕事に。
キースランドール

1
intクラスには両方imagreal
属性があり

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:個人的には、この編集により10倍ugくなりますが、3文字短くなります。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

正規表現ビットをありがとう。精度の問題については、代わりにSQRT2を使用し、乗算を除算に切り替えました。
ケーシーチュウ

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

標準入力


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

グルーヴィー(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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.