그리드의 로터 라우터


10

입력

입력은 하나의 문자열이며, 일부 2n+1줄은 개행으로 길이 줄로 구분됩니다 . 정수 는 입력의 일부가 아닙니다. 문자열에서 계산해야합니다. 행은 "방향 문자"로 구성 됩니다. 줄 바꿈에 문제가있는 경우 세로 줄로 바꿀 수 있습니다 .2n+1n ≥ 0n>^<v|

입력은 크기의 정사각형 그리드를 형성하며 (2n+1)x(2n+1), 그리드의 각 셀은 네 개의 기본 방향 중 하나를 가리키는 로터 라우터 로 해석됩니다 . 우리는 드롭 진행 토큰 그리드의 중심에 라우터를 다음 라우터는 다음과 같은 방법으로 주위를 이동합니다. 토큰이 라우터에 도달하면 라우터는 시계 반대 방향으로 90도 회전하고 새 방향으로 토큰을 한 단계 이동합니다. 다른 라우터에 연결되면 프로세스가 반복되지만 결국 토큰은 그리드에서 떨어집니다.

산출

출력은 입력과 동일한 형식으로 라우터의 최종 구성입니다.

예제 입력으로 3x3그리드를 고려하십시오.

<^<
^><
>^v

중앙 라우터가 토큰을 표시하도록 강조 표시되어 있습니다 (보기가 어렵습니다). 중앙 라우터가 북쪽을 향하도록 회전하고 토큰을 맨 위 행의 중앙 셀로 이동합니다.

<^<
^^<
>^v

이 라우터는 서쪽을 향하도록 회전하고 토큰을 왼쪽 상단으로 보냅니다.

<<<
^^<
>^v

모퉁이의 라우터는 토큰을 남쪽으로 보내므로 이제 가운데 줄의 가장 왼쪽 셀에 있습니다.

v<<
^^<
>^v

이 라우터는 서쪽을 향하도록 회전하고 토큰을 그리드 밖으로 보냅니다.

v<<
<^<
>^v

이것이 최종 그리드 구성이므로 프로그램에서 출력해야합니다. 보다 복잡한 예에서 토큰은 그리드에서 떨어지기 전에 동일한 라우터를 여러 번 전달할 수 있습니다.

규칙

함수 또는 전체 프로그램을 작성할 수 있습니다. 이것은 코드 골프이므로 가장 낮은 바이트 수가 이깁니다. 표준 허점은 허용되지 않습니다. 입력 및 / 또는 출력에 후행 줄 바꿈이 있는지 여부를 결정할 수 있습니다.

테스트 사례

Input:
v
Output:
>

Input:
<^<
^><
>^v
Output:
v<<
<^<
>^v

Input:
>>^>>
v<vv<
>^>^<
^<>>^
vvv>>
Output:
>>^>>
>v>>v
^>>vv
^^>>>
v^<<^

Input:
<^^^^^^^^
<<^^^^^^>
<<<^^^^>>
<<<<^^>>>
<<<<^>>>>
<<<vv>>>>
<<vvvv>>>
<vvvvvv>>
vvvvvvvv>
Output:
>>>>>>>>v
^>>>>>>vv
^^>>>>vvv
^^^>>vvvv
<<<<<vvvv
^^^^<<vvv
^^^<<<<vv
^^<<<<<<v
^<<<<<<<<

"동쪽으로 회전"의 두 인스턴스가 "서쪽을 향하여 회전"이라고 말해야합니까?
피터 테일러

@PeterTaylor 잘 잡았습니다. 나는 항상 두 가지를 혼동하는 것 같습니다.
Zgarb

입력 문자열이 개행으로 종료됩니까?
edc65

@ edc65 출력에 대해서도 스스로 결정할 수 있습니다. 그러나 이전 줄 바꿈은 없습니다.
Zgarb 2019

답변:


3

CJam, 62 61 63 바이트

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

Nq_N#):D;+_,2/{:P"^<v>^

"_P4$=#:X)=t_,0PX[1DW*WDSP]=-e>e<}h;1>

확장 및 의견 :

Nq              "Read the input grid";
_N#):D;         "Calculate the vertical delta (line length + 1)";
+               "Prepend a newline to the grid";
_,2/            "Calculate the initial position as the length of the grid
                 string divided by 2";
{               "Do...";
  :P"^<v>^

"
  _P4$=           "Get the character indexed by the position in the grid";
  #:X             "Map the character to an operation number:
                   '^'=>0, '<'=>1, 'v'=>2, '>'=>3, '^'=>4, '\n'=>5, '\n'=>6
                   (the unreachable duplicate mappings are important below)";
  )=t             "Set the character indexed by the position in the grid to
                   the result of mapping the operation number + 1 backwards";
  _,0PX[1DW*WDSP]="Map the operation number to a negated delta (this occurs
                   after rotating routers, which means that operation n should
                   act like the character corresponding to operation n + 1):
                   0=>1, 1=>-delta, 2=>-1, 3=>delta, 5=>position";
  -e>e<           "Subtract the negated delta from the position and clamp it to
                   [0, length of the grid string] (array indices are circular,
                   so the length of the grid string will act like the index 0
                   and point to the initial newline next iteration, which will
                   *really* set the position to 0)";
}h              "... while the position is not 0 (i.e. not at the initial
                 newline)";
;1>             "Clean up and remove the initial newline";

내 솔루션은 입력에서 플랫 문자열로 작동하므로 추적하기 위해 하나의 위치 값만 있고 사전 / 사후 처리는 거의 없습니다. 그리드의 시작 부분에 개행을 추가하기위한 2 바이트의 전처리와 출력에서 ​​제거하기위한 2 바이트의 후 처리가 있습니다. 그러나이 4 바이트는 개행을 유지하고 라우터처럼 "실행"할 수 있기 때문에 비용이 많이 들지만 다른 개행으로 "회전"하여 위치를 0으로 설정합니다. 그리고 위치가 0이되면 메인 루프가 종료됩니다.


나는 불행하게도 앞의 개행을 가야한다는 것을 지배 할 것이다. 후행 만 허용됩니다.
Zgarb 2019

@Zgarb 고정, +2 바이트.
Runer112

귀하의 링크의 출력이 정확하지 않은 것 같다
aditsu 종료 SE는 사악한이기 때문에

@aditsu 당신은 실제로 맞습니다. 나는 무엇을 만졌는지 확실하지 않으며, 잘 작동한다고 맹세합니다. 내가 살펴볼 게
Runer112

@aditsu 뺄셈은 정식이 아닙니다. 고장 났다고 지적 해 주셔서 감사합니다. 그러나 이제 주석 중 하나가 코드에 닿습니다. :(
Runer112


1

자바 스크립트 (ES6) 121 120 127 129

문자열을 입력 매개 변수로 가져오고 출력을 리턴하는 명명 된 함수입니다.
입력 문자열이 줄 바꾸기로 종료되었다고 가정합니다.

버그 수정 편집 . .search ()가 제대로 작동하지 않습니다undefined

F=s=>(o=~s.search('\n'),s=[...s],
R=p=>~(u='^<v>'.indexOf(s[p]))?R(p+[-1,-o,1,o][u],s[p]='<v>^'[u]):s)(-~o*o/2-1)
.join('')

언 골프 및 설명

F=s=>{
  o = s.search('\n')+1; // offset to next row
  s = [...s]; // string to array
  R=p=>{ // recursive search functiom, parameter p is current position in grid
    u = '^<v>'.indexOf(s[p]); // find direction
    if (u<0) return s; // if no direction found, out of grid -> stop recursion
    s[p] = '<v>^'[u] // set new direction into the array cell 
    return R(p+[-1,o,1,-o][u]) // call recursive function with new position
  }
  return R((o-1)*o/2-1) // start recursive search with initial position at grid center
  .join('') // array to string
}

Firefox / FireBug 콘솔에서 테스트

s='<^^^^^^^^\n\
<<^^^^^^>\n\
<<<^^^^>>\n\
<<<<^^>>>\n\
<<<<^>>>>\n\
<<<vv>>>>\n\
<<vvvv>>>\n\
<vvvvvv>>\n\
vvvvvvvv>\n'
console.log(F(s))

산출

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