맨해튼을 걸어 다니고 있는데 호텔에서 얼마나 멀어요? 않을 것이며 너무 길어서 사용할 수없는 연료를

불필요하고 복잡한 이야기

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

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

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

사양:

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

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

예와 설명을 위해 :

내 여행

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



답변

J, 17 자

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

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

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

예:

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

답변

파이썬 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

답변

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
  • +/: 합
  • |: 규모

답변

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

답변

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

멋지고 짧은 하나, 이것은 복잡한 숫자를 사용하여 비행기를 밟습니다.

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

DSM과 Abhijit에게 다른 질문에 대한 제안으로 1j이것을 계산 하는 데 사용 했습니다.


답변

매스 매 티카 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