윤곽선을 따라 화살표 이동


28

샌드 박스

화살표가 동일한 시계 방향 또는 시계 반대 방향 (각각의 윤곽에는 고유 한 방향이 있음)으로 일정하게 향하고 닫힌 양의 겹치지 않는 2D 윤곽선 (대각선에서도 1 개 이상의 공간으로 구분됨)과 양수를 지정 n하면 화살표를 움직입니다. n각 방향으로 윤곽을 따라 단계. 화살표는 > v < ^각각 오른쪽, 아래쪽, 왼쪽 및 위쪽 방향으로 표시됩니다. 다른 문자는 -(가로), |(세로) 및 +(코너)입니다. 화살표가 모퉁이에 있으면 현재 방향을 유지하고 회전 한 후에 만 ​​변경됩니다.

두 모서리 사이에 항상 직선 세그먼트 (또는 공백)가있을 것 +-+입니다 (예 : 수평 및 수직과 유사). 즉, 급회전 U이 금지됩니다. 모서리 사이의 세그먼트는 수직 또는 수평이며 모서리의 구부러짐은 항상 90 도입니다.

입력:

  • 양의 정수-- n단계 수
  • 윤곽선의 ASCII 표현-여러 줄 문자열, 문자열 목록, 문자 목록 등이 될 수 있습니다.

산출:

모든 화살표가있는 동일한 윤곽선이 n각 윤곽선의 전체 방향 으로 단계적으로 이동했습니다.

테스트 사례 :

1.

입력:

n = 1

 +----->->            
 |       |            
 |       v---+        
 |           |        
 +---<-------+      

산출:

 +------>+
 |       v
 |       +>--+
 |           |
 +--<--------+

2.

입력:

n = 2

 +-----+ +---+        
 |     | |   |        
 +-->--+ |   v  
         |   | 
 +--->---+   |        
 |           |         
 +------<<---+       

산출:

 +-----+ +---+
 |     | |   |
 +---->+ |   |
         |   | 
 +----->-+   v
 |           |     
 +----<<-----+        

삼.

입력:

n = 3

 +---+   +---+   +-------+      
 |   |   |   v   |       |      
 ^   |   |   |   +-<-+   |      
 |   |   ^   |       |   v      
 |   +---+   +-->----+   |      
 |                       |      
 |   +-------+   +---+   |      
 |   |       |   v   |   |      
 +---+       +---+   +---+      

산출:

 +>--+   ^---+   +-------+
 |   |   |   |   ^       |
 |   |   |   |   +---+   |
 |   |   |   |       |   |
 |   +---+   v----->-+   |
 |                       |
 |   +-------+   +---+   v 
 |   |       |   |   |   |
 +---+       +-<-+   +---+  

4.

입력:

n = 1

+--+ 
|  |
|  +---+
|      |     
+----+ |
     | |
     +-+ 

산출:

+--+ 
|  |
|  +---+
|      |     
+----+ |
     | |
     +-+ 

5.

입력

n = 4

^>>>>
^   v
^   v>>>>
^       v           
<<<<<<<<v

산출:

^>>>>
^   v
^   v>>>>
^       v           
<<<<<<<<v

6.

입력:

n = 1

^->
^ v
<<v

산출:

^>+
^ v
<<v

위의 과제를 해결하는 기능이나 프로그램을 작성하십시오. 모든 언어에서 가장 짧은 바이트 코드가 이깁니다. 골프 언어에 낙심하지 마십시오. 알고리즘 및 코드에 대한 설명은 높이 평가됩니다.


두 개의 등고선이 대각선의 모서리에 닿을 수 있습니까?
xnor

4
"닫히지 않은 겹치지 않는 2D 윤곽선 세트 ... 같은 시계 방향 또는 시계 반대 방향으로 일관된 방향으로 화살표가 있음"모든 윤곽선이 같은 방향으로 향하는 것처럼 들립니다. 화살표는 윤곽 내에서만 일관됩니다.
xnor

3
@xnor 귀하의 의견에 감사드립니다! -아니요, 등고선이 대각선으로 서로 접촉 할 수 없습니다. -각 윤곽에는 고유 한 Directon이 있습니다. 설명을 업데이트하겠습니다.
Galen Ivanov

2
벽 사이에 공간이없는 입력이 가능합니까? 예 : 온라인으로 사용해보십시오! . 나는 당신이 "적어도 하나의 공백으로 분리되었다"고 말했지만 그것이 독립 루프에만 적용되는지 단일 루프에도 적용되는지는 확실하지 않았습니다.
요나

1
@Jonah 아니오, 불가능합니다 :There will always be a straight segment (or a space) between any two corners (like +-+ for the horizontal and similar for the vertical) - in other words the sharp U turns are forbidden.
Galen Ivanov

답변:


14

자바 스크립트 (ES6),  210 ... 182  180 바이트

(m)(n)

m=>g=n=>n?g(n-1,m=m.map((r,y)=>r.map((c,x)=>(i=0,h=$=>~$?(m[Y=y+($-2)%2]||0)[X=x+~-$%2]>h?"-|+"[n+=`;m[${Y}][${X}]=S[${$}]`,i?2:$&1]:h($^++i):c)((S="<^>v").indexOf(c)))),eval(n)):m

온라인으로 사용해보십시오!

방법?

이 링크따라 포맷 된 소스 버전을 볼 수 있습니다 .

싸개

1=0

업데이트 방법

업데이트되지 않은 화살표로 업데이트되지 않은 화살표를 덮어 쓸 위험이 있으므로 각 화살표를 한 번에 하나씩 안전하게 이동할 수 없습니다. 대신, 먼저 모든 화살표를 제거하고 새로운 위치를 계산합니다. 우리는 두 번째로 새로운 직책을 적용합니다.

"1;m[0][7]=S[2];m[1][8]=S[3];m[2][9]=S[2];m[4][3]=S[0]"

새로운 직책은을 수행함으로써 적용됩니다 eval(n).

지도

$

10+2

엑스와이

 d | dx = (d - 1) % 2 | dy = (d - 2) % 2
---+------------------+------------------
 0 |        -1        |         0
 1 |         0        |        -1
 2 |        +1        |         0
 3 |         0        |        +1

코너

hxor1xor

+-|

h$h"$""$""$"

애니메이션 버전


설명 감사합니다!
Galen Ivanov

8

K (NGN / K) , 183 (161) 157 바이트

{A:"^>v<";D,:-D:(-1 0;!2);s:(#x;#*x);c:~^x;r:" -+|"c*+/'3'0,c,0;$[#p:+s\&~^t:A?,/x;;:r];q:q@'*'&'~^x ./:/:q:+p+/:D@4!(t^0N)+/:0 1 3;s#@[,/r;s/+q;:;A@D?q-p]}/

온라인으로 사용해보십시오!

{ }/int left arg n으로 호출하면 함수 { }가 오른쪽 arg 에 n 번 적용됩니다.

A:"^>v<" 화살

D,:-D:(-1 0;!2) 4 개의 기본 방향에 대한 ∆y, ∆x

s:(#x;#*x) 입력 형태 : 높이, 너비

c:~^x countours-공백이 아닌 위치를 나타내는 부울 행렬

r:" -+|"c*+/'3'0,c,0각 셀에 대해 self + upper + lower를 세고 c1-> -, 2-> +, 3->를 대체 하여 countour를 사용하지만 화살표가없는 문자 행렬을 다시 만듭니다.|

t:A?,/x화살표 유형 : 0 1 2 3의 경우 ^>v<다른 모든 셀은 0N(널) 로 표시됩니다.

p:+s\&~^t 화살표의 좌표

$[#p ;;:r] 화살표가없는 경우 반환 r

q:+p+/:D@4!(t^0N)+/:0 1 3 각 화살표에 대해 가능한 새로운 위치 3 개-계속 진행하는 경우, 왼쪽으로 회전하는 경우 및 오른쪽으로 회전하는 경우

q:q@'*'&'~^x ./:/:q 각 화살표에 대해 카운트에 도달하는 첫 번째 옵션을 선택하십시오.

@[,/r;s/+q;:;A@D?q-p]평평하게 r해서 화살표를 새 위치와 새 방향으로

s# 원래 모양으로 재구성


2
너 빠르구나! 골프를 마치고 코드를 설명해 주셨으면합니다.
Galen Ivanov

설명 감사합니다!
Galen Ivanov

4

, 105 바이트

W¬ΦυΣκ⊞υS≔⊟υη≔⪫υ⸿θ≔⟦⟧υ≔>^<vζPθFθ¿№ζι«⊞υ⟦⌕ζιⅉⅈ⟧§+|-↨EKV›κ ²»ιFυ«J⊟ι⊟ι≔⊟ιιFIη«≔⊟Φ⁴∧﹪⁻⊖ι⊕λ⁴›§KV⁻⁵λ ιM✳⊗黧ζι

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 번거로운 입력 형식이 필요하지 않도록 22 바이트를 포함합니다. 설명:

W¬ΦυΣκ⊞υS≔⊟υη≔⪫υ⸿θ≔⟦⟧υ

윤곽선과 단계 수를 편리하게 입력하십시오.

≔>^<vζ

방향 문자는 여러 번 사용되므로 문자열이 여기에 캐시됩니다. 이 문자열에서 방향 문자의 색인을 방향이라고합니다.

Pθ

커서를 움직이지 않고 원래 윤곽을 인쇄합니다.

Fθ

윤곽선의 문자를 반복합니다.

¿№ζι«

현재 문자가 방향 문자 인 경우 ...

⊞υ⟦⌕ζιⅉⅈ⟧

... 그런 다음 방향과 위치를 목록에 저장하십시오 ...

§+|-↨EKV›κ ²

... 문자를 적절한 줄 문자로 바꿉니다.

»ι

그렇지 않으면 캐릭터를 출력하고 다음 캐릭터로 넘어갑니다.

Fυ«

저장된 위치를 반복합니다.

J⊟ι⊟ι

저장된 위치로 이동하십시오.

≔⊟ιι

저장된 방향을 추출하십시오.

FIη«

적절한 단계 수만큼 반복하십시오.

≔⊟Φ⁴∧﹪⁻⊖ι⊕λ⁴›§KV⁻⁵λ ι

다음 단계의 방향을 찾으십시오. 반대 방향이거나 비어 있지 않은 방향입니다.

M✳⊗ι

그 방향으로 나아가십시오. ( Move명령에 대한 숯 방향 지수 는 내 방향 값의 두 배입니다.)

»§ζι

적절한 방향 문자를 인쇄하십시오.


설명 감사합니다!
Galen Ivanov

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.