समुद्री डाकू खजाना


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
लोगो में इसे करने के लिए बोनस अंक? ;)
पीटर टेलर

@ पेटर आउटपुट फॉर्मेट सख्त है ... लेकिन हम देखेंगे कि क्या लोग तस्वीर को पसंद करते हैं: D
Oleh Prypin

1
पहला उदाहरण आउटपुट होना चाहिए -3.000, 2.000
लोजैकर

UCB लोगो के साथ आउटपुट फॉर्मेट को प्राप्त किया जा सकता है (print (word (form xcor 4 3) ",) (form ycor 4 3))। लेकिन मुझे यकीन नहीं है कि इनपुट को पार्स करना कितना आसान होगा।
पीटर टेलर

@Lowjacker हाँ, धन्यवाद। दरअसल, इनपुट गलत था।
ओलेह प्रिनपिन

जवाबों:


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(/=',')

पैटर्न गार्ड का उपयोग करने के लिए एफ के डिफिनेशन को बदलने के बारे में कैसे? उनके पास लाइन ब्रेक की आवश्यकता नहीं होने के लिए अच्छी संपत्ति है और इस मामले में अधिक संक्षिप्त होना चाहिए। इसके अलावा, बातचीत का उपयोग करें।
फ़ूजएक्सएक्सएल

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, टेस्ट रन आइडोन पर :)


3

पायथन, 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)

आपके पास वास्तव में 157 वर्ण हैं, 158 नहीं।
लॉजकर

मुझे लगता है कि मुझे इसकी आवश्यकता नहीं है, लेकिन मैं आमतौर पर अनुगामी न्यूलाइन गिनता हूं।
कीथ रान्डेल

[१५ Line] लाइन १: D=dict(N=1j,E=1,S=-1j,W=-1)[१५३] लाइन २: क्या jवास्तव में जरूरत है? [१५२] लाइन्स ३-४: यदि आप पायथन ३, raw_input→ पर जाएँ input, और इसके बाद printभी आपको कोष्ठक का उपयोग करना है , तो आप २ वर्णों को बचाते हैं [१५०]
ओलेह प्रिनपिन

1
@BlaXpirit: तानाशाही अनुकूलन के लिए धन्यवाद। सभी दिशाओं में ई और डब्ल्यू होने की स्थिति में j को पंक्ति 2 में आवश्यक है। परिणामस्वरूप पी को काम करने .realऔर .imagकाम करने के लिए जटिल होने की आवश्यकता है ।
कीथ रान्डेल

1
int class में दोनों imagऔर real
attrs होते हैं

3

जावास्क्रिप्ट, 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: व्यक्तिगत रूप से, मुझे लगता है कि यह संपादन इसे दस गुना बदसूरत बनाता है, लेकिन यह तीन वर्ण छोटा है। यह गैर मानक व्यवहार है कि आप रेगुलर एक्सप्रेशन कार्यों के रूप में वस्तुओं कॉल कर सकते हैं पर आधारित है: /./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
दुर्भाग्य से, क्यू = .707 गोलाई त्रुटियों के कारण "एनडब्ल्यू 10" इनपुट विफल रहता है; मुझे लगता है कि आपको "q = Math.SQRT1_2" की आवश्यकता है जो 8 वर्ण जोड़ता है। दूसरी ओर, आप "(ई | डब्ल्यू)?" साथ में "(।)?" चूंकि आपने पहले ही उत्तर / दक्षिण / न तो स्थापित किया है और इनपुट अच्छी तरह से बना है, जिससे 2 चार्ट बचते हैं।
डॉकमैक्स

रेगेक्स बिट के लिए धन्यवाद। सटीकता के मुद्दे के लिए, मैंने इसके बजाय SQRT2 का उपयोग किया और गुणा को विभाजन में बदल दिया।
केसी चू

2

हास्केल, 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

जावा (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

पॉवरशेल, 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

यह शायद by2 / 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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.