ฉันเดินไปรอบ ๆ แมนฮัตตันไกลจากโรงแรมของฉันมากแค่ไหน?


27

เรื่องราวที่ไม่จำเป็นและซับซ้อน

ฉันกำลังเดินไปรอบ ๆแมนฮัตตันบล็อกโดยบล็อกและเท้าของฉันเหนื่อยและต้องการกลับบ้าน

การจราจรค่อนข้างแย่ แต่โชคดีที่ฉันรวยมากและมีเฮลิคอปเตอร์รอรับสายที่โรงแรม แต่ฉันต้องการให้พวกเขารู้ว่าเชื้อเพลิงเท่าไหร่ที่จะบรรจุสำหรับเที่ยวบินและเพื่อที่พวกเขาจำเป็นต้องรู้ระยะทางโดยตรงจากโรงแรม ฉันจำได้ว่าช่วงไหนที่ฉันเดินและสามารถบอกเส้นทางที่ฉันไปได้ ระยะทางนี้ต้องแม่นยำแม้ว่าถ้าพวกมันสั้นเกินไปเราจะไม่ทำให้มันกลับมานานเกินไปและฉันก็ซื้อเชื้อเพลิงฉันไม่สามารถใช้

คุณสามารถเขียนโปรแกรมเพื่อแปลงให้เป็นระยะทางที่พวกเขาจะต้องเดินทางด้วยเที่ยวบินของพวกเขาเพื่อดึงฉันได้หรือไม่?

รายละเอียด:

เขียนฟังก์ชั่นที่:

  1. ยอมรับรายการหรือสตริงของบล็อกที่มีการเดินซึ่งสัมพันธ์กับกริดแบบกำหนดเอง:
    • U p, Dของตัวเอง, L eft และR ight
    • สามารถเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก - เช่น ถ้ามันสั้นกว่าที่จะใช้uแทนที่จะUไปข้างหน้า
    • ทิศทางที่ไม่ถูกต้องมีพฤติกรรมที่ไม่ได้กำหนดเช่น ทิศทางของXอาจทำให้เกิดความล้มเหลว
  2. ส่งคืนทศนิยม / ทศนิยม / คู่ที่เป็นสองเท่าของระยะทางตรงจากจุดกำเนิด

สำหรับภาพประกอบและความกระจ่าง:

ทริปของฉัน

การเดินทางของฉันจะได้อย่างง่ายดายเพียงแค่ได้รับการบันทึกเป็น"luluu..."หรือ['l','u','l'...]แต่มันจะต้องถูกบันทึกเป็นขึ้น, ลง, ซ้าย, ขวา


15
คุณรวยพอที่จะมีเฮลิคอปเตอร์ แต่คุณสนใจว่ามีการซื้อน้ำมันเชื้อเพลิงเพิ่มเติมหรือไม่? : O
Fez Vrasta

8
@fezvrasta เพราะฉันตระหนี่

7
วิธีที่จะยุ่งกับหัวของฉันโดยไม่ทำเรื่องระยะแมนฮัตตัน
Kendall Frey

25
คำตอบที่ถูกต้องคือ "ไม่สำคัญคุณเป็นคนรวยดังนั้นคุณจึงเข้าไปในกระเป๋าของคุณดึงเงิน 20 เหรียญและโบกมือบนอากาศเพื่อดึงดูดความสนใจของคนขับรถแท็กซี่คุณเป็น จากนั้นกลุ่มนักเลงอนุบาลที่ปล้นคุณและทุบตีคุณให้เป็นเลือดนองเลือดจากนั้นคุณจะถูกจับกุมเพราะการทิ้งขยะและความไม่พอใจในที่สาธารณะ ทางเท้าตัดสินส่งตัวเข้าคุกและถูกล็อคขึ้นกับเพื่อนร่วมห้องขังชื่อเล่นบรูตัสที่ใช้จริงความชอบที่แข็งแกร่งให้กับคุณ. ยินดีต้อนรับสู่นิวยอร์ก!"
Bob Jarvis - Reinstate Monica

2
@McKay ฉันตีความว่ามันเป็นทิศทางบนแผนที่ต่อไป (ไม่อย่างนั้นมันอาจจะเป็น "ไปข้างหน้า" และ "ย้อนกลับ") และการวัดระยะทางค่อนข้างไม่ชัดเจน "สองครั้งที่ระยะทางตรงจากจุดกำเนิด" ดังนั้นไม่มี ระยะทางแมนฮัตตัน)
FireFly

คำตอบ:


32

J, 17 ตัวอักษร

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

ใช้ความจริงว่าพลังของการjเป็นตัวแทนทิศทางที่เหมาะสม

  • 'urdl'i. ใช้สตริงและคำนวณดัชนี (0 สำหรับ 'u', 1 สำหรับ 'r', ... )
  • 0j1^jเปลี่ยนเป็นทิศทางในระนาบที่ซับซ้อนโดยใช้อำนาจที่สอดคล้องกันของ
  • +/ สรุปขั้นตอนเดียว
  • 2*| สองเท่าของโมดูลัส

ตัวอย่าง:

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

5
งานที่ดี. ความรู้ทางคณิตศาสตร์สำหรับการชนะ :-)
Gareth

ทำให้ ASCII แบบ "ไม่ขยาย" นี้เป็นเพียง 15 ไบต์ (เพราะคุณไม่ได้ใช้บิตที่แปด)
Timtech

11

Python 2.7 56 58 56 51 48

ด้วยหมายเลขหนึ่งที่ถูกขโมยจากScrooge McDuckฉันทำโชคของฉันและตอนนี้มีความมั่งคั่งมากกว่า Scrooge

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

Python 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

@plannapus: ฉันได้เพิ่มส่วนการนำไปใช้
อภิสิทธิ์

Ah และมันก็ไม่ได้%5 %8ตกลงมันทำให้รู้สึกมากขึ้นในขณะนี้ :)
plannapus

5

APL (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

Python 2.7 - 65

ดีและสั้นอันนี้ใช้ตัวเลขที่ซับซ้อนเพื่อก้าวผ่านระนาบ:

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

อุปกรณ์ประกอบฉากเพื่อ DSM และ Abhijit ในคำถามอื่น ๆ ที่แสดงให้ฉันใช้ใน1jการคำนวณนี้


สามารถ1jเขียนเป็นj, -1jเป็น-j? นอกจากนี้ยังจัดการกับการป้อนข้อมูลบนและล่างหรือด้านบนเท่านั้น?
DavidC

1
ลุงสครูจฉันเกลียดคุ ​​ณ อย่างน้อยคุณควรทิ้งเงินไว้ให้หลานชายของคุณ
อภิสิทธิ์

1
@DavidCarraher: ไม่สามารถทำได้ มันจะเป็นไปไม่ได้ที่จะแยกแยะความแตกต่างระหว่างตัวแปรjและหน่วยจินตภาพj
Abhijit

คุณไม่ได้บอกหรือว่ามันควรจะส่งออกเป็นระยะทางสองเท่า เมื่อลองใช้ UUUUDRDRRL ฉันได้รับ 3.606 ด้วยฟังก์ชันนี้แทนที่จะเป็น 7.21
plannapus

4
คุณสามารถบันทึกอักขระได้อีก 2 ตัวโดยการคูณค่าคงที่โดย2แทนที่จะคูณผลลัพธ์สุดท้าย
อภิสิทธิ์

2

Mathematica 92 49

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
คุณกำลังทำงานมากมายที่ OP ไม่ต้องการซึ่งf@l_ := 2 N@Norm[Tr[l /. {"r" -> 1, "l" -> -1, "u" -> I, "d" -> -I}]]จะเพียงพอ

ฉันได้รับ2 Norm[(2. + 2. I) + "U" + "X"]เป็นผลลัพธ์สำหรับรหัสของคุณ
DavidC

1
ใช่ แต่ OP บอกว่าตกลงเพื่อล้มเหลวด้วยอินพุตดังกล่าว นั่นคือวิธีที่ฉันและทุกคนตีความมัน ฉันไม่สามารถอ่านภาษาอื่น ๆ เหล่านี้ แต่คุณจะเห็นว่าพวกเขามักจะ hardcode สำหรับ u, r, l และ d

ตกลง. เข้าใจแล้ว ขอบคุณสำหรับการชี้ให้เห็นว่า
DavidC

หากคุณแทนที่วงเล็บที่เหลือสองคู่ด้วย@s คุณจะได้อักขระน้อยลงอีกสองตัว
shrx

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

จูเลียอายุ 45 ปี

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

ขโมยiไปยังพลังหลอกลวง นอกจากนี้ยังมีตัวละครทั้งหมดยกเว้น d iมีค่าที่ทำงานเป็นอำนาจที่ยอมรับได้สำหรับ


1

J, 29 ตัวอักษร

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

ใช้งานได้เฉพาะกับทิศทางกรณีที่ต่ำกว่าและตัวละครอื่น ๆ กว่าใด ๆr, u, lและdจะทำให้มันให้คำตอบที่ไม่ถูกต้อง

การใช้งาน:

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

คำอธิบาย:

'ruld'i.'uuuudrrrl'รูปแบบของ dyadic 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

+&.*:ยืมเคล็ดลับจากคำตอบ J อีกข้อที่ฉันเห็นเมื่อเช้านี้และสแควร์สไอเท็มจากนั้นก็บวกพวกเขาแล้วทำการสแควร์รูท ดูภายใต้&.เอกสาร:

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

+: เพิ่มผลลัพธ์เป็นสองเท่า:

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

1

R, 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

โซลูชันเก่าที่มี 74 ตัวอักษรพร้อม xy coords:

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

รับอินพุตเป็น stdin จำเป็นต้องเป็นตัวพิมพ์เล็กและคั่นด้วยช่องว่าง ใช้พิกัด xy เริ่มต้นจาก (0,0)


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

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

ฉันสันนิษฐานว่าแต่ละ "U" คือ "1 ขึ้น" ดังนั้นสองหน่วยขึ้นไปจะเป็น "UU"

แก้ไข: เปลี่ยนสลับเป็น ifs

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

T-SQL, 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 (max)


1

ES6, 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 วันก่อน OP โพสต์คำถาม ; นั่นคือมันทำงานเฉพาะใน Firefox 27+ (และอาจเป็น Chrome ที่เปิดใช้งานสิ่งทดลองไม่ได้ทดสอบ :) !!

(ได้รับแรงบันดาลใจบางส่วนจากคำตอบของ Boann)


ฉันอยากทำสิ่งที่ยุ่งยากเพื่อกำจัดผลตอบแทนเช่นเปลี่ยนทุกสิ่งให้เป็นนิพจน์บูลีนที่เพิ่งได้รับการประเมินและส่งคืนโดยอัตโนมัติ แต่ฉันไม่แน่ใจว่ามีวิธีการทำเช่นนี้เว้นแต่ฉันจะแทนที่forคำสั่งด้วย การแสดงออก (ร่างกายฟังก์ชั่นที่มีลูกศรงบต้องวงเล็บและผลตอบแทนที่ชัดเจนร่างกายที่มีการแสดงออกเพียงแค่ทำไม่ได้) ..
Noyo

1

JavaScript - 142 ตัวอักษร - ไม่มีหลักฐาน ()

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}

โดยที่ a เป็นสตริงเช่น 'uudrrl'

ใช้แบบนี้ -

a='uudrrl'
r(a)

ทดสอบในคอนโซลของเบราว์เซอร์

var x = "luluurrrrurd"
r(x)
8.48528137423857

1

C # - 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

Befunge-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-13 (การใช้งานจริงดูเหมือนว่าจะมีปัญหากับการขยาย ASCII แม้ว่า)


0

Matlab, 51 ตัวอักษร

การส่ง Matlab ของฉันใช้งานได้เฉพาะกับตัวอักษรที่มีคำบรรยาย นี่เป็นเกมที่สนุกมาก! ส่วนที่ยากที่สุดคือการแปลงสตริงให้เป็นอาร์เรย์ของจำนวนเชิงซ้อนที่จะหาผลรวม

ฟังก์ชั่น:

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

Javascript, 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

JavaScript, 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

C, 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

JavaScript (ไม่มี ES6 ไม่มีการวิวัฒนาการ) - 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.