불필요하고 복잡한 이야기
나는 맨해튼을 걸어 다니며 블록 단위로 발이 피곤해져 집으로 돌아가고 싶습니다.
교통은 꽤 나쁘지만 다행히도 나는 매우 부자이며 호텔에 헬리콥터가 있습니다. 그러나 나는 그들이 비행을 위해 얼마나 많은 연료를 포장해야하는지 알 필요가있다. 나는 내가 어느 블록을 걸어 갔는지 기억하고 내가 어떤 길을 갔는지 말할 수 있었다. 이 거리는 정확해야합니다. 만약 너무 짧으면 다시 만들지 않을 것이며 너무 길어서 사용할 수없는 연료를 구입했습니다.
날 데려 오기 위해 비행기로 여행해야 할 거리로 변환하는 프로그램을 작성할 수 있습니까?
사양:
나에게 다음과 같은 기능을 작성하십시오.
- 임의의 그리드를 기준으로 한 블록 또는 블록 목록을 허용합니다.
- U , D 소유, 왼쪽 및 오른쪽 .
- 대문자 또는 소문자 일 수 있습니다 (예 : 짧은 그 경우 것은 사용하는
u
대신U
이동에 앞서. - 잘못된 방향으로 정의되지 않은 동작이 있습니다 (예 : X 방향은 고장을 일으킬 수 있습니다.
- 원점으로부터 직선 거리의 두 배인 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