Entrada
Sua entrada é uma única sequência, separada por novas 2n+1
linhas em linhas de comprimento 2n+1
, para alguns números inteiros n ≥ 0
. O número inteiro n
não faz parte da entrada; você terá que calculá-lo a partir da string. As linhas são compostas pelos "caracteres de direção" >^<v
. Se as novas linhas apresentarem um problema, você poderá substituí-las por tubos verticais |
.
A entrada forma uma grade quadrada de tamanho (2n+1)x(2n+1)
e cada célula da grade é interpretada como um roteador de rotor , que aponta em uma das quatro direções principais. Passamos a soltar um token no roteador no centro da grade e os roteadores o moverão da seguinte maneira. Quando o token chega ao roteador, ele gira 90 graus no sentido anti-horário e move o token um passo na nova direção para a qual aponta. Se ele pousar em outro roteador, o processo será repetido, mas, eventualmente, o token cairá da grade.
Resultado
Sua saída é a configuração final dos roteadores, no mesmo formato da entrada.
Exemplo
Como exemplo de entrada, considere a 3x3
grade
<^<
^><
>^v
onde o roteador central foi destacado para indicar o token (é um pouco difícil de ver). O roteador central gira para o norte e move o token para a célula central da linha superior:
<^<
^^<
>^v
Este roteador gira para o oeste e envia o token para o canto superior esquerdo:
<<<
^^<
>^v
O roteador no canto envia o token para o sul, agora está na célula mais à esquerda da linha do meio:
v<<
^^<
>^v
Esse roteador gira para o oeste e envia o token da rede.
v<<
<^<
>^v
Esta é a configuração final da grade, portanto, seu programa deve produzi-la. Observe que, em exemplos mais complexos, o token pode passar pelo mesmo roteador várias vezes antes de cair da grade.
Regras
Você pode escrever uma função ou um programa completo. Isso é código-golfe, então a menor contagem de bytes vence. As brechas padrão não são permitidas. Você pode decidir se há uma nova linha à direita na entrada e / ou saída.
Casos de teste
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
^<<<<<<<<
Respostas:
CJam,
626163 bytesExperimente online
Expandido e comentado:
Minha solução opera na entrada como uma sequência simples, portanto, há apenas um valor de posição para acompanhar e praticamente nenhum pré / pós-processamento; existem apenas 2 bytes de pré-processamento para adicionar nova linha ao início da grade e 2 bytes de pós-processamento para removê-la da saída. Mas esses 4 bytes valem bem o custo, pois me permitem manter as novas linhas e "executá-las" como roteadores, mas elas "rotacionam" para outra nova linha e definem a posição como zero. E o loop principal termina quando a posição se torna zero.
fonte
CJam,
9069 bytesEnorme por enquanto,ainda pode ser reduzido bastante.Experimente online aqui
fonte
JavaScript (ES6) 121
120 127 129Uma função nomeada que obtém a string como um parâmetro de entrada e retorna a saída.
Supondo que a sequência de entrada seja finalizada com uma nova linha.
Editar correção de bug, .search () não funciona bem com
undefined
Ungolfed e explicou
Teste no console Firefox / FireBug
Resultado
fonte