맨해튼 회전 거리


9

나는 이것이 좋은 도전 일 것이지만 : http://adventofcode.com/2016/day/1

과업 설명

패턴 (L | R) [1-9] [0-9] *에 따른 일련의 회전 및 거리가 주어지면 시작점과 끝점 사이의 맨해튼 거리, 즉 수직 및 수평 이동의 최소 수를 지정하십시오 그리드.

예를 들어, 북쪽으로 향하기 시작했다고 가정하면 :

R2 다음에 L3은 동쪽으로 2 블록, 북쪽으로 3 블록, 또는 5 블록 떨어져 있습니다. R2, R2, R2는 시작 위치의 남쪽으로 2 블록 떨어진 2 블록을 남겨 둡니다. R5, L5, R5, R3은 12 블록 떨어져 있습니다.

기술적 세부 사항

이동 사이의 구분 기호를 선택할 수 있습니다 (예 : "\ n", ","또는 ","). 기수 10의 정수로 답을 제공해야합니다.

중복되지 않습니다!

여러 가지 이유로 중복되지 않습니다.

  • 움직임이 동일하지 않습니다. 여기 방향이 아닌 회전 입니다.
  • 나는 유클리드가 아닌 맨하탄 거리를 원합니다.

3
질문에 맨해튼 거리가 무엇인지에 대한 설명을 포함시켜야합니다. 링크를 게시하는 것은 일종의 끈적입니다.
가브리엘 베 나미

2
매우 다릅니다! 우리는 단지 회전이 있습니다!
Labo

1
@Labo 동의합니다. 여기에 대한 대답은 맨해튼 거리에 있고 다른 하나는 유클리드 거리에 있다는 사실에 관한 것이 아닙니다. 이것은 거북이 스타일의 움직임을 가지고 있으며 다른 하나는 나침반 방향 NSEW를 지정합니다 (UDLR이라고 부르는 사실은 관련이 없습니다.)
Level River St

2
나중에 샌드 박스 를 사용 하여 문제를 주 사이트에 게시하기 전에 문제에 대한 피드백을 받으십시오.
Mego

2
@Labo 괜찮습니다. 새로운 사용자가이 사이트의 모든 내용을 즉시 알 필요는 없습니다. 다음 번에 좋은 제안 일뿐입니다. :)
Mego

답변:


4

파이썬 3 109 99 104 101 바이트

이것은 공백으로 구분 된 문자열 또는 개행으로 구분 된 문자열로 입력하여 복소수를 사용하는 간단한 답변입니다. 골프 제안을 환영합니다!

편집 : Labo 덕분에 -13 바이트. int로 변환하기위한 +5 바이트

d=p=0
for r in input().split():d+=1-2*(r<'R');p+=1j**d*int(r[1:])
print(int(abs(p.real)+abs(p.imag)))

언 골핑

def manhattan_rotation(seq, nsew=0, pos = 0):
    for rot in seq.split():
        # change direction
        if rot[0] == "L":
            nsew += -1 
        else:
            nsew += 1
        # move in that direction rot[1:] times
        pos += 1j ** nsew * int(rot[1:])
    return int(abs(pos.real)+abs(pos.imag))

1-2 * (r [0] < 'R')는 2 바이트를 절약합니다 :)
Labo

기능을 만들지 마십시오. 입력을 읽으면 더 많은 문자를 저장할 수 있습니다!
Labo

같은 줄에 2 개의 변수를 할당하여 2 바이트를 저장합니다. d = p = 0
Labo

나는 다시 당신의 대답을 골프와 99 문자를 만듭니다! pastie.org/private/hm7lejqosdqnkgo000u7q
Labo

2
@Labo 기존 답변을 무효화하는 방식으로 사양을 편집 할 수 있는지 확실하지 않지만 일부 개조를 요청하겠습니다.
Sherlock9

2

PHP, 93 바이트

while($m=$argv[++$i])${chr(80|3&$d+=(P<$m)-(M>$m))}+=substr($m,1);echo abs($P-$R)+abs($Q-$S);

고장

while($m=$argv[++$i])       // loop through arguments:
    ${                      // 5. use as variable name
        chr(                // 4. cast to character (P,Q,R,S) 
        80|                 // 3. add 80
        3&                  // 2. modulo 4
        $d+=(P<$m)-(M>$m)   // 1. change direction depending on letter
    )}+=substr($m,1);       // 6. add number to variable
echo abs($P-$R)+abs($Q-$S); // calculate distance, print

2

파이썬 2, 86 바이트

x=y=0
for d in input().split():c=cmp(d,'M');x,y=int(d[1:])-y*c,x*c
print abs(x)+abs(y)

현재 트랙 xy좌표. 회전 할 때 방향을 업데이트하는 대신 모션이 항상 x- 양방향으로되도록 현재 값을 회전시킵니다. 복소수는 좌표를 추출하기에는 너무 많은 비용이 듭니다.


1

파이썬 2, 103102 바이트

l=c=0
for i in input().split():c+=cmp(i[0],'N');l+=1j**c*int(i[1:])
print int(abs(l.imag)+abs(l.real))

반복

입력은 공백으로 구분 된 방향의 문자열입니다 (예 :) "R5 L5 R5 R3".
출발지와 목적지 사이의 맨해튼 거리를 인쇄합니다.

어떻게?

복잡한 평면의 원점에서 시작합니다 l=0.

누적 1 / 4- 우회전 카운터 c=0;

각 명령어를 들어 i, 파싱 회전이 문자 방향의 첫 번째 문자를 비교하여 인 'N', 그리고 c그에 따라 조정된다.

여행 할 거리로 파싱 int(i[1:])하고 상기 명령은 여러 블록이 촬영에 의해 주어진 방향으로의 단계 크기 것을 고려하여 제정 c의 승 0+1j으로이 1j**c.

마지막 맨해튼 거리는 가상과 실제 두 방향에서 원점으로부터의 절대 거리의 합입니다. 달성abs(l.imag)+abs(l.real)


1
@ Sherlock9-오, 음 수렴입니다. Python 2로 전환하고 cmp내 대답처럼 사용하여 2 바이트를 절약 하면 알려 주시면 삭제하겠습니다.
Jonathan Allan

0

자바 스크립트 (ES2016), 98 (100)

2 바이트 @Neil 저장

d=>d.replace(/.(\d+)/g,(d,l)=>(o+=d>'M'||3,l*=~-(o&2),o&1?x-=l:y+=l),x=y=o=0)&&(x*x)**.5+(y*y)**.5

ES6의 경우 100 바이트

d=>d.replace(/.(\d+)/g,(d,l)=>(o+=d>'M'||3,l*=~-(o&2),o&1?x-=l:y+=l),x=y=o=0)&&(x>0?x:-x)+(y>0?y:-y)

덜 골프

d => d.replace(/.(\d+)/g,
  (d,l)=>( // L or R in d, distance in l
    o += d>'M' || 3, // orientation in o, used %4
    l *= ~-(o&2), // convert to number and change sign if needed
    o&1 ? x -= l : y += l // move based on orientation
  ), x = y = o = 0)
&& (x>0?x:-x) + (y>0?y:-y)

테스트 (ES6)

F=
d=>d.replace(/.(\d+)/g,(d,l)=>(o+=d>'M'||3,l*=~-(o&2),o&1?x-=l:y+=l),x=y=o=0)&&(x>0?x:-x)+(y>0?y:-y)

function update() {
  O.textContent=F(I.value)
}

update()
<input id=I value='R5, L5, R5, R3' oninput='update()'><pre id=O></pre>


1
내 ES6 답변은 원래 106 바이트였습니다. 중간 변수를 복사하면 3 바이트가 절약되었습니다. 당신의 교체 나에게 구원을 2 바이트 경기에서 전환과 동시에 방향과 거리를 처리하여 복사하면이 결과, 나에게 마지막 바이트를 저장 : s=>s.replace(/.(\d+)/g,(c,n)=>(d+=c<'R'||3,n*=~-(d&2),d&1?x+=n:y+=n),x=y=d=0)&&(x<0?-x:x)+(y<0?-y:y)두 당신의 ES6 응답보다 짧은 바이트 이제 인의 감사 c<'R'||3n*=~-(d&2)트릭을 .
Neil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.