मैं मैनहट्टन घूम रहा हूं, मैं अपने होटल से कितनी दूर हूं?


27

अनावश्यक और जटिल कहानी

मैं मैनहट्टन के चारों ओर घूम रहा हूं , ब्लॉक द्वारा ब्लॉक और मेरे पैर थक गए हैं और घर वापस जाना चाहते हैं।

यातायात बहुत बुरा है, लेकिन सौभाग्य से मैं बहुत समृद्ध हूं और मेरे पास होटल में स्टैंडबाय पर एक हेलीकाप्टर है। लेकिन मुझे उन्हें यह जानने की आवश्यकता है कि उड़ान के लिए कितना ईंधन पैक करना है और इसके लिए उन्हें होटल से मेरी सीधी दूरी जानने की आवश्यकता है। मुझे याद था कि मैं किन ब्लॉकों में गया था और उन्हें बता सकता हूं कि मैंने कौन सा मार्ग लिया। इस दूरी को सटीक होने की आवश्यकता है, अगर वे बहुत कम हैं तो हम इसे वापस नहीं करेंगे, बहुत लंबा और मैंने ईंधन खरीदा है जिसका मैं उपयोग नहीं कर सकता।

क्या आप मुझे यह बताने के लिए कोई कार्यक्रम लिख सकते हैं कि मुझे लाने के लिए उन्हें अपनी उड़ान में कितनी दूरी तय करनी होगी?

विशिष्टता:

मुझे एक फ़ंक्शन लिखें:

  1. एक मनमानी ग्रिड के सापेक्ष चलने वाले ब्लॉकों की सूची या स्ट्रिंग को स्वीकार करता है:
    • यू पी, डी खुद, एल ईफ्ट और आर ight।
    • ऊपरी या निचला मामला हो सकता है - जैसे। अगर इसके uबजाय Uआगे जाने के लिए उपयोग करने के लिए छोटा है ।
    • एक अमान्य दिशा में अपरिभाषित व्यवहार होता है - जैसे। X की एक दिशा विफलता का कारण बन सकती है।
  2. एक फ्लोट / दशमलव / डबल देता है जो मूल बिंदु से सीधी रेखा की दूरी से दोगुना है।

चित्रण और स्पष्टीकरण के लिए:

मेरी यात्रा

मेरी यात्रा बस के रूप में आसानी से के रूप में दर्ज किया जा सकता था "luluu..."या ['l','u','l'...]लेकिन यह ऊपर, नीचे, बाएँ, ठीक है के रूप में दर्ज किया जाना चाहिए।


15
आप एक हेलीकॉप्टर रखने के लिए पर्याप्त समृद्ध हैं लेकिन आप ध्यान रखते हैं कि कुछ अतिरिक्त ईंधन खरीदा जाए? : O
Fez Vrasta

8
@fezvrasta क्योंकि मैं कंजूस हूं।

7
मैनहट्टन दूरी के बारे में यह नहीं बनाकर मेरे सिर के साथ गड़बड़ करने का तरीका।
केंडल फ्रे

25
सही उत्तर है, "इससे कोई फर्क नहीं पड़ता। आप एक अमीर आदमी हैं, इसलिए आप अपनी जेब में पहुँच जाते हैं, $ 20 की एक माला निकालते हैं, और एक कैबी का ध्यान आकर्षित करने के लिए इसे हवा में उड़ाते हैं; आप हैं फिर बालवाड़ी ठगों के एक समूह द्वारा सेट करें जो आपको लूटते हैं और आपको एक खूनी लुगदी से मारते हैं। आपको फिर से कूड़े और सार्वजनिक आवारागर्दी के लिए गिरफ्तार किया जाता है, आतंकवाद के लिए सामूहिक रूप से घबराहट और एक महामारी के कारण एक सार्वजनिक जगह पर उत्पात मचाने का प्रयास किया जाता है। फुटपाथ, दोषी ठहराया गया, जेल भेजा गया, और एक सेलमेट उपनाम वाले ब्रूटस के साथ बंद कर दिया गया, जो आपके लिए एक वास्तविक मजबूत काम कर रहा है। वेलकम टू न्यू यॉर्क! "
बॉब जार्विस - मोनिका

2
@MKKay मैं इसे मानचित्र पर दिशाओं के रूप में व्याख्या करता हूं, वैसे भी (अन्यथा यह "आगे" और "वापस") होगा, और दूरी मापना असंदिग्ध है "मूल बिंदु से सीधी रेखा की दुगुनी दूरी", इसलिए नहीं मैनहट्टन दूरी)।
फायरफली

जवाबों:


32

जे, 17 अक्षर

2*|+/0j1^'urdl'i.

इस तथ्य का उपयोग करता है, कि jउचित दिशाओं का प्रतिनिधित्व करने की शक्तियाँ ।

  • 'urdl'i. स्ट्रिंग लें और सूचकांकों की गणना करें (0 के लिए 'यू', 1 के लिए 'आर', ...)
  • 0j1^की इसी शक्ति का उपयोग करके जटिल विमान में दिशा में बदल जाता है j
  • +/ एकल चरणों को पूरा करता है
  • 2*| मापांक से दो गुना

उदाहरण:

> 2*|+/0j1^'urdl'i.'uuuudrrrl'
7.2111

5
अच्छी नौकरी। जीत के लिए गणित का ज्ञान। :-)
गारेथ

इसे "गैर-विस्तारित" ASCII बनाएं और फिर यह सिर्फ 15 बाइट्स है (क्योंकि आप आठवें बिट का उपयोग नहीं करते हैं)।
टाइमटेक

11

अजगर 2.7 56 58 56 51 48

स्क्रूज मैकडक से चोरी हुए नंबर वन डाइम के साथ , मैंने अपना भाग्य बनाया और अब स्क्रूज की तुलना में अधिक संपत्ति है।

y=lambda s:2*abs(sum(1j**(ord(i)%15)for i in s))

पायथन 2.7 - 61 53 50 (असंवेदनशील मामला)

y=lambda s:2*abs(sum(1j**(ord(i)%16%9)for i in s))

कार्यान्वयन

>>> from random import sample
>>> y=lambda s:2*abs(sum((-1j)**(ord(i)%15)for i in s))
>>> path=sample('RLUD'*1000, 100)
>>> y(path)
20.0
>>> path=sample('RLUD'*1000, 100)
>>> y(path)
34.058772731852805

मैं हो रही है IndexError: list index out of range। इनपुट का क्या रूप होना चाहिए?
प्लेनैपस

@plannapus: मैंने एक कार्यान्वयन अनुभाग जोड़ा है
अभिजीत

आह और यह %5नहीं था %8। ठीक है अब यह अधिक समझ में आता है :)
प्लेनैपस

5

एपीएल (29)

{|+/2 0j2×-⌿2 2⍴+/'URDL'∘.=⍵}

जैसे

     {|+/2 0j2×-⌿2 2⍴+/'URDL'∘.=⍵} 'UUUUDRRRL'
7.211102551

स्पष्टीकरण:

  • +/'URDL'∘.=⍵: देखें कि URDLतर्क में कितनी बार वर्ण होते हैं
  • -⌿2 2⍴: Uमूल्य से मूल्य घटाएं D, और Rमूल्य से Lमूल्य
  • 2 0j2×: द्वारा लंबवत मान को 2और क्षैतिज मान को गुणा करें2i
  • +/: योग
  • |: परिमाण

4

रूबी 1.9+ (67)

f=->s{2*(((g=s.method :count)[?U]-g[?D])**2+(g[?R]-g[?L])**2)**0.5}

उदाहरण

f["DRUULULLULL"] => 10.0
f["UUUUDRRRL"] => 7.211102550927978

3

perl6: 44 वर्ण

2*abs [+] i <<**>>%(<U R D L>Z ^4){get.comb}
  • get.comb इनपुट की एक लाइन मिलती है और पात्रों में विभाजित हो जाती है
  • <U R L D> इस मामले में शब्दों की एक सूची है
  • (1,2,3) Z (4,5,6)== (1,2), (2,5), (3,6), तो यह 2 सूचियों को एक-दूसरे %()में बदल देता है , पार्सल की सूची बनाता है जो हैश में बदल जाता है
  • <<**>>**लंबे समय तक फिट करने के लिए छोटी सूची का विस्तार करते हुए, जोड़ीदार बनाता है। कम सूची केवल होने के लिए होता हैi
  • [+]एक सूची के सभी तत्वों को, absजटिल संख्याओं के लिए मापांक लेता है

हां, मैंने सभी संभावित स्थानों को हटा दिया।


2

पायथन 2.7 - 65

अच्छा और छोटा एक, यह विमान के माध्यम से कदम रखने के लिए जटिल संख्याओं का उपयोग करता है:

x=lambda s:2*abs(sum([[1,-1,1j,-1j]['RLUD'.index(i)]for i in s]))

डीएसएम और अभिजीत के पास अन्य प्रश्न हैं, जिन्होंने मुझे इसकी 1jगणना करने के लिए उपयोग दिखाया है ।


कर सकते हैं 1jके रूप में लिखा जा j, -1jके रूप में -j? इसके अलावा, क्या यह ऊपरी और निचले इनपुट, या केवल ऊपरी को संभालता है?
डेविड एफसी

1
अंकल स्क्रूज , आई हेट यू । आपको कम से कम कुछ पैसा अपने भतीजों के लिए छोड़ देना चाहिए।
अभिजीत

1
@DavidCarraher: नहीं, आप नहीं कर सकते। चर jऔर काल्पनिक इकाई के बीच अंतर करना असंभव होगाj
अभिजीत

क्या आपने यह नहीं कहा कि यह दुगुनी दूरी पर उत्पादन करने वाला था ? जब UUUUDRRRL के साथ कोशिश कर रहा हूं तो 7.21 के बजाय इस फ़ंक्शन के साथ 3.606 मिल रहा है।
प्लेनैपस

4
आप 2अंतिम परिणाम को गुणा करने के बजाय स्थिरांक को गुणा करके 2 और वर्णों को बचा सकते हैं ।
अभिजीत

2

गणितज्ञ ९९ ४ ९

कोड को सुव्यवस्थित करने के लिए Calle पूरा श्रेय लेता है।

f@l_:=2 N@Norm[Tr[l/.{"r"→1,"l"→-1,"u"→I,"d"→-I}]]

उदाहरण

f[{"u", "u", "u", "u", "d", "r", "r", "r", "l"}]

7.2111


1
आप बहुत सारे काम कर रहे हैं जो ओपी द्वारा आवश्यक नहीं हैं, f@l_ := 2 N@Norm[Tr[l /. {"r" -> 1, "l" -> -1, "u" -> I, "d" -> -I}]]पर्याप्त होंगे।

मुझे 2 Norm[(2. + 2. I) + "U" + "X"]आपके कोड के लिए आउटपुट के रूप में मिलता है ।
डेविड एफसी

1
हां, लेकिन ओपी का कहना है कि इस तरह के इनपुट से विफल होना ठीक है। यही कारण है कि मैं और बाकी सभी इसकी व्याख्या करते हैं। मैं इन अन्य भाषाओं को नहीं पढ़ सकता, लेकिन आप देखेंगे कि वे अक्सर यू, आर, एल और डी के लिए हार्डकोड करते हैं।

ठीक है। समझ गया। यह बात बताने के लिए धन्यवाद।
डेविड एफसी

यदि आप कोष्ठक के दो शेष जोड़े को बदल देते हैं तो आपको @एक और दो अक्षर कम मिलते हैं।
० '

2

PHP, 67

function f($a){foreach($a as$d)@$$d++;return 2*hypot($U-$D,$L-$R);}

उदाहरण:

<?php
var_dump(f(array('U', 'U', 'U', 'U', 'D', 'R', 'R', 'R', 'L')));

>float(7.211102550928)

2

जूलिया, ४५

f(l)=2*abs(sum([im^(c=='d'?3:c) for c in l]))

iशक्तियों को चुरा लिया है चाल। इसके अलावा d के अलावा सभी वर्णों में ऐसे मान हैं जो स्वीकार्य शक्तियों के रूप में काम करते हैं i


1

जे, 29 अक्षर

+:+&.*:/-/_2[\#/.~/:~'ruld'i.

केवल छोटे अक्षर दिशाओं और किसी भी अन्य की तुलना में पात्रों के साथ काम करता है r, u, l, और dयह एक गलत जवाब देने के लिए कारण होगा।

उपयोग:

   +:+&.*:/-/_2[\#/.~/:~'ruld'i.'uuuudrrrl'
7.2111

स्पष्टीकरण:

'ruld'i.'uuuudrrrl'डायएडिक रूप i.बाएं तर्क में सही तर्क से वस्तुओं के सूचकांक को ढूंढता है। इस मामले में:

   'ruld'i.'uuuudrrrl'
1 1 1 1 3 0 0 0 2

/:~ इस सूची को आरोही क्रम में क्रमबद्ध करें:

   /:~'ruld'i.'uuuudrrrl'
0 0 0 1 1 1 1 2 3

#/.~ प्रत्येक संख्या की घटनाओं की संख्या को गिना जाता है:

   #/.~/:~'ruld'i.'uuuudrrrl'
3 4 1 1

_2[\ इसे 2 पंक्तियों में काटता है:

   _2[\#/.~/:~'ruld'i.'uuuudrrrl'
3 4
1 1

-/ नीचे से ऊपर की ओर घटाता है

   -/_2[\#/.~/:~'ruld'i.'uuuudrrrl'
2 3

+&.*:एक और जे उत्तर से मैंने आज सुबह एक चाल उधार लिया है , और वस्तुओं को चुकता करता है, फिर उन्हें रकम देता है, फिर एक वर्गमूल करता है। प्रलेखन के तहत&. देखें :

   +&.*:/-/_2[\#/.~/:~'ruld'i.'uuuudrrrl'
3.60555

+: परिणाम दोगुना:

   +:+&.*:/-/_2[\#/.~/:~'ruld'i.'uuuudrrrl'
7.2111

1

आर, 86 74 56 वर्ण

ठीक है, यह वास्तव में काल्पनिक संख्याओं से छोटा है:

2*Mod(sum(sapply(scan(,""),switch,u=1i,d=-1i,l=-1,r=1)))

उपयोग:

> 2*Mod(sum(sapply(scan(,""),switch,u=1i,d=-1i,l=-1,r=1)))
1: u u u u d r r r l
10: 
Read 9 items
[1] 7.211103

Xy coords के साथ 74 वर्णों पर पुराना समाधान:

2*sqrt(sum(rowSums(sapply(scan(,""),switch,u=0:1,d=0:-1,l=-1:0,r=1:0))^2))

उपयोग:

> 2*sqrt(sum(rowSums(sapply(scan(,""),switch,u=0:1,d=0:-1,l=-1:0,r=1:0))^2))
1: u u u u d r r r l
10: 
Read 9 items
[1] 7.211103

स्टड के रूप में इनपुट लेता है, लोअर-केस और स्पेस-अलग होने की आवश्यकता होती है। (0,0) से शुरू होने वाले xy निर्देशांक का उपयोग करें।


1

k ( 50 49)

{2*sqrt x$x:0 0f+/("udlr"!(1 0;-1 0;0 -1;0 1))@x}

उदाहरण

{2*sqrt x$x:0 0f+/("udlr"!(1 0;-1 0;0 -1;0 1))@x}"uuuudrrrl"
7.211103

1

जावा, 185, 203 , 204 , 217 , 226

class A{public static void main(String[] a){int x=0,y=0;for(int i=0;i<a[0].length();i++) switch(a[0].charAt(i)){case'U':y++;break;case'D':y--;break;case'L':x++;break;case'R':x--;}System.out.print(Math.hypot(x,y)*2);}}

मैंने मान लिया कि प्रत्येक "यू" "1 अप" था, इसलिए दो यूनिट "यूयू" होंगे।

संपादित करें: इफ़्स के लिए स्विच को अदला-बदली करें

class A{public static void main(String[]a){int x=0,y=0;for(int i=0;i<a[0].length();i++){int c=a[0].charAt(i);if(c=='U')y++;if(c=='D')y--;if(c=='L')x++;if(c=='R')x--;}System.out.print(Math.hypot(x,y)*2);}}

पुनरावृति के लिए ले जाया गया

class A{public static void main(String[]a){int x=0,y=0;for(int i=0;i<a[0].length();){int c=a[0].charAt(i++);if(c=='U')y++;if(c=='D')y--;if(c=='L')x++;if(c=='R')x--;}System.out.print(Math.hypot(x,y)*2);}}

अब इनपुट को स्ट्रिंग के रूप में नहीं लिया जाता है, बल्कि दिशाओं की सरणी के रूप में

class A{public static void main(String[]a){int x=0,y=0;for(String s:a){char c=s.charAt(0);if(c=='U')y++;if(c=='D')y--;if(c=='L')x++;if(c=='R')x--;}System.out.print(Math.hypot(x,y)*2);}}

संक्षिप्त के बारे में मेरी समझ यह थी कि आपको केवल एक कार्यक्रम की आवश्यकता है, न कि पूरे कार्यक्रम की।
Boann

1

टी-एसक्यूएल, 158

IF PATINDEX('%[^UDLR]%', @s)=0 select 2*sqrt(power(LEN(REPLACE(@s,'U',''))-LEN(REPLACE(@s,'D','')),2)+power(LEN(REPLACE(@s,'L',''))-LEN(REPLACE(@s,'R','')),2))

@S varchar (अधिकतम) प्रकार का इनपुट स्ट्रिंग है


1

ईएस 6, 77 69

परिभाषा:

f=s=>{u=d=l=r=0;for(c of s)eval(c+'++');return 2*Math.hypot(u-d,l-r)}

उपयोग:

>>> f('uuuudrrrl')
7.211102550927979
>>> f( 'uuuudrrrl'.split('') )
7.211102550927979
  • स्ट्रिंग या सरणी (लोअरकेस) स्वीकार करता है
  • काल्पनिक संख्याओं का उपयोग नहीं करता है
  • ओपी द्वारा प्रश्न पोस्ट किए जाने से सिर्फ 3 दिन पहले संभव नहीं था ; यही है, यह केवल फ़ायरफ़ॉक्स 27+ में चलता है (और शायद क्रोम भी प्रयोगात्मक सामग्री के साथ सक्षम है, परीक्षण नहीं किया है :) !!

(Boann के उत्तर से आंशिक रूप से प्रेरित।)


मैं वास्तव में वापसी से छुटकारा पाने के लिए कुछ मुश्किल करना चाहता हूं, जैसे कि पूरी चीज को बूलियन अभिव्यक्ति में बदल दें जो कि बस मूल्यांकन हो जाता है और स्वचालित रूप से वापस आ जाता है, लेकिन मुझे यकीन नहीं है कि ऐसा करने का एक तरीका है जब तक कि मैं forबयान को कुछ के साथ बदल नहीं सकता अभिव्यक्ति (बयानों वाले एक तीर फ़ंक्शन बॉडी के लिए कोष्ठक और स्पष्ट वापसी की आवश्यकता होती है, ऐसे शरीर जो केवल अभिव्यक्ति नहीं हैं) ..
नोयो

1

जावास्क्रिप्ट - 142 वर्ण - कोई eval ()

function r(a){return Math.sqrt(Math.pow(a.match(/u/g).length-a.match(/d/g).length,2)+Math.pow(a.match(/l/g).length-a.match(/r/g).length,2))*2}

जहाँ 'uudrrl' जैसा एक तार है

इस तरह का उपयोग करें -

a='uudrrl'
r(a)

ब्राउज़र कंसोल में परीक्षण करें।

var x = "luluurrrrurd"
r(x)
8.48528137423857

1

सी # - 90 अक्षर

LINQPad से ताजा।

int x=0,y=0;input.Max(i=>i==85?y++:i==82?x++:i==68?y--:x--);(Math.Sqrt(x*x+y*y)*2).Dump();

जहां इनपुट एक वैध स्ट्रिंग है।

>string input = "LULUURRRRURD";

>8.48528137423857

0

बेफुज -93 (65)

इसमें 65 गैर-व्हाट्सएप चरित्र हैं (व्हाट्सएप के साथ 217, हालांकि इसे अधिक कॉम्पैक्ट लेआउट (69/176 वर्णों के लिए) से कम किया जा सकता है)। यह आउटपुट प्रारूप के साथ कुछ उदारता लेता है, लेकिन निर्विवाद रूप से सटीक है। एक वर्गमूल कार्यान्वयन को लागू / चोरी करने के प्रयास के लायक नहीं लगता है।

v                  >$:*\:*+88*4*5-2.,.@
               >3-:|
           >6-:|
       >8-:|
>~"D"-:|
       $   $   $   $
           \   \
       1   1   1   1
       -   -   +   +
           \   \
^      <   <   <   <

echo 'UUDLLUU' | ./befungee.py ../man आउटपुट 2 outputs13 (वास्तव में कार्यान्वयन को विस्तारित ASCII के साथ समस्या है, हालांकि लगता है)।


0

मतलाब, 51 अक्षर

मेरा मतलाब प्रस्तुत, केवल कैप्शन पत्रों के साथ काम करता है। यह एक मजेदार था! सबसे मुश्किल हिस्सा स्ट्रिंग को जटिल संख्याओं के एक सरणी में परिवर्तित किया जा रहा था।

समारोह:

f=@(s)abs(sum(fix((s-76.5)/8.5)+((s-79)*i/3).^-99))

उपयोग:

>> f=@(s)abs(sum(fix((s-76.5)/8.5)+((s-79)*i/3).^-99))
>> f('UURDL')
ans =

     1
>>

0

जावास्क्रिप्ट, 136

function z(a){var x=a.split('u').length-a.split('d').length;var y=a.split('r').length-a.split('l').length;return Math.sqrt(x*x+y*y)*2;};
document.write(z('uuuudrrrwl'));
7.211102550927978

0

जावास्क्रिप्ट, 89

function f(a){U=D=L=R=0;for(d in a)eval(a[d]+'++');return 2*Math.sqrt((U-=D)*U+(L-=R)*L)}

उदाहरण:

<script>
document.write(f(['U', 'U', 'U', 'U', 'D', 'R', 'R', 'R', 'L']));
</script>

>7.211102550927978

0

सी, 120

float d(char *p){int v=0,h=0;while(*p){v+=*p=='U'?1:*p=='D'?-1:0,h+=*p=='R'?1:*p=='L'?-1:0,++p;}return 2*sqrt(v*v+h*h);}

d("LULUURRRRURD") -> 8.485281


0

जावास्क्रिप्ट (कोई ईएस 6, नो एवल) - 131

f=function(h){for(i=0,a=[0,,0,0,0];i<h.length;++i)++a[(h.charCodeAt(i)>>2)-25];x=a[0]-a[4];y=a[2]-a[3];return Math.sqrt(x*x+y*y)*2}

परीक्षा:

console.log(f('uuuudrrrl'));     // 7.211102550927978 
console.log(f('luluurrrrurd'));  // 8.48528137423857
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.