맨해튼을 걸어 다니고 있는데 호텔에서 얼마나 멀어요?


27

불필요하고 복잡한 이야기

나는 맨해튼을 걸어 다니며 블록 단위로 발이 피곤해져 집으로 돌아가고 싶습니다.

교통은 꽤 나쁘지만 다행히도 나는 매우 부자이며 호텔에 헬리콥터가 있습니다. 그러나 나는 그들이 비행을 위해 얼마나 많은 연료를 포장해야하는지 알 필요가있다. 나는 내가 어느 블록을 걸어 갔는지 기억하고 내가 어떤 길을 갔는지 말할 수 있었다. 이 거리는 정확해야합니다. 만약 너무 짧으면 다시 만들지 않을 것이며 너무 길어서 사용할 수없는 연료를 구입했습니다.

날 데려 오기 위해 비행기로 여행해야 할 거리로 변환하는 프로그램을 작성할 수 있습니까?

사양:

나에게 다음과 같은 기능을 작성하십시오.

  1. 임의의 그리드를 기준으로 한 블록 또는 블록 목록을 허용합니다.
    • U , D 소유, 왼쪽오른쪽 .
    • 대문자 또는 소문자 일 수 있습니다 (예 : 짧은 그 경우 것은 사용하는 u대신 U이동에 앞서.
    • 잘못된 방향으로 정의되지 않은 동작이 있습니다 (예 : X 방향은 고장을 일으킬 수 있습니다.
  2. 원점으로부터 직선 거리의 두 배인 float / decimal / double을 반환합니다.

예와 설명을 위해 :

내 여행

나의 여행은 그냥 간단하게 기록 될 수 있었다 "luluu..."또는 ['l','u','l'...]하지만, 위, 아래, 왼쪽, 오른쪽으로 기록해야합니다.


15
당신은 헬리콥터를 갖기에 충분한 부자이지만 여분의 연료를 사면 관심이 있습니까? : O
Fez Vrasta

8
나는 인색하기 때문에 @fezvrasta.

7
맨해튼 거리에 대해 이것을하지 않아서 내 머리를 어지럽히는 방법.
Kendall Frey

25
정답은 "중요하지 않습니다. 당신은 부자입니다. 주머니에 손을 뻗어 $ 20를 뭉쳐서 공중에 날려 캐비의 관심을 끄십시오. 그런 다음 유치원 깡패들이 당신을 강탈하고 피의 펄프에 맞서게합니다. 보도 감옥에 보내, 유죄 판결을하고, 소요 브루투스 별명 감방 동료와 함께 갇혀 실제 당신에게 강력한 좋아한다. 뉴욕에 오신 것을 환영합니다! "
밥 자비스-복원 모니카

2
@McKay 어쨌든 그것을지도상의 방향으로 해석합니다 (그렇지 않으면 아마도 "앞으로"와 "뒤로"일 것입니다). 맨해튼 거리).
FireFly

답변:


32

J, 17 자

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

의 힘이 j올바른 방향 을 나타낸다 는 사실을 사용합니다 .

  • 'urdl'i. 문자열을 가져 와서 인덱스를 계산하십시오 ( 'u'의 경우 0, 'r'의 경우 1, ...)
  • 0j1^의 대응하는 거듭 제곱을 사용하여 복소 평면의 방향으로 변환합니다 j.
  • +/ 단일 단계를 요약
  • 2*| 계수의 두 배

예:

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

5
좋은 작업. 승리를위한 수학 지식. :-)
Gareth

이 "확장되지 않은"ASCII를 만든 다음 15 바이트입니다 (8 번째 비트를 사용하지 않기 때문에).
Timtech

11

파이썬 2.7 56 58 56 51 48

Scrooge McDuck 의 도난당한 One One Dime 으로 , 나는 재산을 만들었고 지금은 Scrooge보다 더 많은 재산을 가지고 있습니다.

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

@ plannapus : 구현 섹션을 추가했습니다
Abhijit

아 그리고 %5아니었다 %8. 좋아, 이제 더 이해가
되겠다

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)이므로 두 목록을 서로 압축 %()하여 해시로 변하는 소포 목록을 만듭니다.
  • <<**>>pairwise **, 짧은 목록을 더 길게 확장합니다. 짧은 목록은i
  • [+]리스트의 모든 요소를 abs합하고, 복소수에 대한 계수를 취합니다.

예, 가능한 모든 공간을 제거했습니다.


2

파이썬 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
Scrooze 아저씨 , 난 당신이 싫어요. 적어도 조카를 위해 돈을 남겨 두어야합니다.
Abhijit

1
@DavidCarraher : 아니요. 변수 j단위와 허수 단위 를 구별하는 것은 불가능합니다.j
Abhijit

거리의 두 배 를 출력한다고 가정하지 않았습니까 ? UUUUDRRRL로 시도 할 때 7.21 대신이 함수로 3.606을 얻습니다.
plannapus

4
2최종 결과를 곱하는 대신 상수를 곱하여 문자를 2 개 더 저장할 수 있습니다 .
Abhijit

2

매스 매 티카 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는 그러한 입력으로 실패해도 괜찮습니다. 그것이 저와 다른 사람들이 그것을 해석하는 방식입니다. 이 다른 언어를 읽을 수는 없지만 종종 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'이진 형태 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[\#/.~/:~'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

XY 코드가있는 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

입력을 stdin으로 취하고 소문자와 공백으로 구분해야합니다. (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);}}

각 "U"가 "1 up"이라고 가정했기 때문에 두 대의 "up"은 "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

티 -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
  • 문자열 OR 배열을 받아들입니다 (소문자)
  • 허수를 사용하지 않습니다
  • OP가 질문을 게시하기 3 일 전에는 불가능했을 것입니다 . 즉, Firefox 27 이상에서만 실행됩니다 (실험적 기능을 사용하는 Chrome도 테스트하지 않았습니다)!

(Boann의 답변에서 부분적으로 영감을 얻었습니다.)


정말 반환 없애 까다로운 일을 할 싶어, 같은 단지 평가를 얻고 자동적으로 반환하는 부울 표현식으로 모든 일을 설정,하지만 난 아니에요 확실히 나는 대체 할 수있는 경우가 아니면이 할 수있는 방법이 for몇 가지로 문을 표현 (문을 포함하는 화살표 함수 본문은 대괄호와 명시적인 반환이 필요합니다. 표현식 인 본문은 그렇지 않습니다.)
Noyo

1

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

여기서 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();

여기서 input은 유효한 문자열입니다.

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

자바 스크립트, 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

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

자바 스크립트 (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.