Tôi đang đi dạo quanh manhattan, cách khách sạn của tôi bao xa?


27

Câu chuyện không cần thiết và phức tạp

Tôi đang đi dạo quanh manhattan, từng khối một và đôi chân của tôi đã mệt mỏi và muốn trở về nhà.

Giao thông khá tệ, nhưng may mắn là tôi rất giàu và tôi có một máy bay trực thăng ở chế độ chờ tại khách sạn. Nhưng tôi cần họ biết bao nhiêu nhiên liệu để đóng gói cho chuyến bay và họ cần biết khoảng cách trực tiếp của tôi từ khách sạn. Tôi đã nhớ những khối tôi đã đi và có thể cho họ biết tôi đã đi theo con đường nào. Khoảng cách này cần phải chính xác, nếu chúng quá ngắn, chúng tôi sẽ không quay trở lại, quá lâu và tôi đã mua nhiên liệu mà tôi không thể sử dụng.

Bạn có thể viết cho tôi một chương trình để chuyển đổi nó thành khoảng cách họ sẽ phải di chuyển trên chuyến bay của họ để lấy tôi không?

Đặc điểm kỹ thuật:

Viết cho tôi một chức năng:

  1. Chấp nhận một danh sách hoặc chuỗi các khối được đặt tương đối với một lưới tùy ý:
    • U p, D riêng, L eft và R ight.
    • Có thể là chữ hoa hoặc chữ thường - vd. nếu nó ngắn hơn để sử dụng uthay vì Uđi trước.
    • Một hướng không hợp lệ có hành vi không xác định - ví dụ. một hướng của X có thể gây ra một thất bại.
  2. Trả về số float / thập phân / double gấp đôi khoảng cách đường thẳng từ điểm gốc.

Để minh họa và làm rõ:

Chuyến đi của tôi

Chuyến đi của tôi có thể dễ dàng được ghi lại bằng "luluu..."hoặc ['l','u','l'...]nhưng nó phải được ghi lại là Lên, Xuống, Trái, Phải.


15
Bạn đủ giàu để có một máy bay trực thăng nhưng bạn quan tâm nếu mua thêm nhiên liệu? : O
Fez Vrasta

8
@fezvrasta vì tôi keo kiệt.

7
Cách để gây rối với đầu của tôi bằng cách không làm điều này về khoảng cách Manhattan.
Kendall Frey

25
Câu trả lời đúng là "Không thành vấn đề. Bạn là một người giàu có, vì vậy bạn thò tay vào túi của bạn, rút ​​ra một tờ 20 đô la và vẫy nó trong không khí để thu hút sự chú ý của một chiếc taxi; sau đó bị một nhóm côn đồ mẫu giáo cướp đi và đánh bạn đến tanh máu. Sau đó, bạn bị bắt vì xả rác bừa bãi và công khai, bị buộc tội khủng bố vì cố gắng gây ra sự hoảng loạn lớn và đại dịch bằng cách lây lan cơ thể của bạn ra công chúng vỉa hè, bị kết án, được gửi đến nhà tù, và bị nhốt với một bạn tù có biệt danh là Brutus người mất một thực theo ý thích mạnh mẽ cho bạn. Chào mừng bạn đến New York!"
Bob Jarvis - Phục hồi lại

2
@McKay Tôi hiểu nó là chỉ đường trên bản đồ, dù sao đi nữa (nếu không nó có thể là "chuyển tiếp" và "quay lại") và thước đo khoảng cách khá rõ ràng "gấp đôi khoảng cách đường thẳng từ điểm gốc", vì vậy không khoảng cách manhattan).
FireFly

Câu trả lời:


32

J, 17 ký tự

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

Sử dụng thực tế, rằng quyền hạn jđại diện cho các hướng thích hợp.

  • 'urdl'i. lấy chuỗi và tính các chỉ số (0 cho 'u', 1 cho 'r', ...)
  • 0j1^biến đổi thành hướng trong mặt phẳng phức sử dụng công suất tương ứng của j.
  • +/ tổng hợp các bước đơn
  • 2*| hai lần mô-đun

Thí dụ:

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

5
Công việc tốt. Toán kiến ​​thức cho chiến thắng. :-)
Gareth

Tạo ASCII "không mở rộng" này và sau đó chỉ là 15 byte (vì bạn không sử dụng bit thứ tám).
TimTech

11

Con trăn 2.7 56 58 56 51 48

Với Dime Number One bị đánh cắp từ Scrooge McDuck , tôi đã tạo ra tài sản của mình và giờ có nhiều tài sản hơn Scrooge.

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

Python 2.7 - 61 53 50 (không phân biệt chữ hoa chữ thường)

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

Thực hiện

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

Tôi đang nhận được IndexError: list index out of range. Những hình thức đầu vào nên có?
plannapus

@plannapus: Tôi đã thêm một phần triển khai
Abhijit

Ah và nó đã %5không được %8. Ok nó có ý nghĩa hơn bây giờ :)
plannapus

5

APL (29)

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

ví dụ

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

Giải trình:

  • +/'URDL'∘.=⍵: xem tần suất URDLxuất hiện của các ký tự trong đối số
  • -⌿2 2⍴: trừ Ugiá trị khỏi Dgiá trị và Rgiá trị từ Lgiá trị
  • 2 0j2×: nhân giá trị dọc với 2và giá trị ngang với2i
  • +/: tổng
  • |: cường độ

4

Ruby 1.9+ (67)

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

Thí dụ

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

3

perl6: 44 ký tự

2*abs [+] i <<**>>%(<U R D L>Z ^4){get.comb}
  • get.comb được một dòng đầu vào và chia thành các ký tự
  • <U R L D> là một danh sách các từ, ký tự trong trường hợp này
  • (1,2,3) Z (4,5,6)== (1,2), (2,5), (3,6), do đó, nó kéo 2 danh sách vào nhau, tạo một danh sách các bưu kiện %()biến thành hàm băm
  • <<**>>không ghép đôi **, mở rộng danh sách ngắn hơn để phù hợp với dài hơn. Danh sách ngắn hơn chỉ xảy rai
  • [+]tính tổng tất cả các phần tử của một danh sách, abslấy mô-đun cho các số phức

Vâng, tôi đã loại bỏ tất cả các không gian có thể.


2

Con trăn 2.7 - 65

Đẹp và ngắn, cái này sử dụng số phức để bước qua mặt phẳng:

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

Đạo cụ cho DSM và Abhijit trong các câu hỏi khác cho tôi thấy việc sử dụng 1jđể tính toán điều này.


Có thể 1jđược viết là j, -1jnhư -j? Ngoài ra, điều này xử lý đầu vào trên và dưới, hoặc chỉ trên?
DavidC

1
Bác Scrooze , cháu ghét cháu. Bạn ít nhất nên để lại một số tiền cho cháu trai của bạn.
Abhijit

1
@DavidCarraher: Không bạn không thể. Không thể phân biệt giữa biến jvà đơn vị tưởng tượngj
Abhijit

Bạn không nói rằng nó được cho là xuất ra hai lần khoảng cách sao? Khi thử với UUUUDRRRL, tôi nhận được 3.606 với chức năng này thay vì 7.21.
plannapus

4
Bạn có thể lưu thêm 2 ký tự, bằng cách nhân các hằng số 2thay vì nhân kết quả cuối cùng.
Abhijit

2

Toán học 92 49

Calle xứng đáng tín dụng đầy đủ để hợp lý hóa mã.

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

Thí dụ

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

7.211


1
Bạn đang làm rất nhiều công việc mà OP không yêu cầu, f@l_ := 2 N@Norm[Tr[l /. {"r" -> 1, "l" -> -1, "u" -> I, "d" -> -I}]]sẽ đủ.

Tôi nhận được 2 Norm[(2. + 2. I) + "U" + "X"]như là đầu ra cho mã của bạn.
DavidC

1
Có, nhưng OP nói rằng không thể thất bại với đầu vào như vậy. Đó là cách tôi và mọi người giải thích nó. Tôi không thể đọc các ngôn ngữ khác, nhưng bạn sẽ thấy rằng chúng thường mã hóa cứng cho u, r, l và d.

Được. Hiểu rồi. Cảm ơn đã chỉ ra rằng.
DavidC

Nếu bạn thay thế hai cặp dấu ngoặc đơn còn lại bằng @s, bạn sẽ nhận được hai ký tự khác ít hơn.
shrx

2

PHP, 67

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

Thí dụ:

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

>float(7.211102550928)

2

Julia, 45

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

Lấy trộm iđể quyền hạn lừa. Ngoài ra tất cả các ký tự ngoại trừ d có các giá trị hoạt động như các quyền hạn được chấp nhận i.


1

J, 29 ký tự

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

Chỉ làm việc với hướng chữ thường và bất kỳ nhân vật khác hơn r, u, l, và dsẽ gây ra nó để đưa ra một câu trả lời sai.

Sử dụng:

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

Giải trình:

'ruld'i.'uuuudrrrl'Dạng dyadic i.tìm chỉ mục của các mục từ đối số bên phải trong đối số bên trái. Trong trường hợp này:

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

/:~ sắp xếp danh sách này theo thứ tự tăng dần:

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

#/.~ đếm số lần xuất hiện của mỗi số:

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

_2[\ chia thành 2 hàng:

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

-/ trừ đáy từ trên xuống

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

+&.*:mượn một mẹo từ một câu trả lời J khác mà tôi đã thấy sáng nay , và bình phương các mục, sau đó tính tổng chúng, sau đó thực hiện một căn bậc hai. Xem dưới&. tài liệu:

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

+: nhân đôi kết quả:

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

1

R, 86 74 56 ký tự

Ok nó thực sự ngắn hơn với những con số tưởng tượng thực sự:

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

Sử dụng:

> 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

Giải pháp cũ với 74 ký tự với xy coords:

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

Sử dụng:

> 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

Lấy đầu vào là stdin, cần phải viết thường và phân tách không gian. Sử dụng tọa độ xy bắt đầu từ (0,0).


1

k ( 50 49)

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

Thí dụ

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

Tôi đã giả sử rằng mỗi "U" là "1 lên", vì vậy hai đơn vị trở lên sẽ là "UU"

Chỉnh sửa: hoán đổi công tắc cho 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);}}

Đã chuyển cho iterator

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

Không còn nhận đầu vào dưới dạng chuỗi, thay vào đó là mảng chỉ đường

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

Sự hiểu biết của tôi về bản tóm tắt là bạn chỉ cần một chức năng, không phải toàn bộ chương trình.
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 là chuỗi đầu vào của kiểu varchar (max)


1

ES6, 77 69

Định nghĩa:

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

Sử dụng:

>>> f('uuuudrrrl')
7.211102550927979
>>> f( 'uuuudrrrl'.split('') )
7.211102550927979
  • Chấp nhận chuỗi HOẶC mảng (chữ thường)
  • Không sử dụng số ảo
  • Sẽ không thể có được chỉ 3 ngày trước khi OP đăng câu hỏi ; nghĩa là, nó chỉ chạy trong Firefox 27+ (và có thể cả Chrome với các công cụ thử nghiệm được bật, chưa được thử nghiệm :) !!

(Lấy cảm hứng một phần bởi câu trả lời của Boann.)


Tôi thực sự muốn làm một cái gì đó khéo léo để thoát khỏi sự trở lại, như biến toàn bộ thành một biểu thức boolean vừa được đánh giá và trả lại tự động, nhưng tôi không chắc có cách nào để làm điều này trừ khi tôi có thể thay thế forcâu lệnh bằng một số biểu thức (phần thân hàm mũi tên chứa các câu lệnh yêu cầu dấu ngoặc và trả về rõ ràng, phần thân chỉ là biểu thức không) ..
Noyo

1

JavaScript - 142 ký tự - không có 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}

trong đó a là một chuỗi như 'uudrrl'

sử dụng như thế này -

a='uudrrl'
r(a)

Kiểm tra trong bảng điều khiển trình duyệt.

var x = "luluurrrrurd"
r(x)
8.48528137423857

1

C # - 90 ký tự

Mới từ 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();

Trong đó đầu vào là một chuỗi hợp lệ.

>string input = "LULUURRRRURD";

>8.48528137423857

0

Befunge-93 (65)

Nó có 65 ký tự không phải khoảng trắng (217 với khoảng trắng, mặc dù có thể giảm bớt bằng cách bố trí nhỏ gọn hơn (đối với 69/176 ký tự)). Nó có một số tự do với định dạng đầu ra, nhưng không thể phủ nhận chính xác. Có vẻ như không xứng đáng với nỗ lực để thực hiện / đánh cắp việc thực hiện căn bậc hai.

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

echo 'UUDLLUU' | ./befungee.py ../man đầu ra 2√13 (thực tế việc triển khai dường như có vấn đề với ASCII mở rộng).


0

Matlab, 51 ký tự

Trình Matlab của tôi, chỉ hoạt động với các chữ cái bị giam cầm. Đây là một niềm vui! Phần khó nhất là chuyển đổi chuỗi thành một chuỗi các số phức được tổng hợp.

Chức năng:

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

Sử dụng:

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

Thí dụ:

<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 (không ES6, không eval) - 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}

Kiểm tra:

console.log(f('uuuudrrrl'));     // 7.211102550927978 
console.log(f('luluurrrrurd'));  // 8.48528137423857
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.