O peixe amado que nada através do código de > <> (uma linguagem de programação esotérica) foi retirado de seu ambiente natural. Essa mudança o tornou incapaz de se movimentar da maneira que costumava: o que costumava ser um movimento toroidal foi restrito ao simples movimento da esquerda para a direita. Mas os programas ainda são escritos como se os peixes fossem capazes de se mover através deles. É sua tarefa, prezado programador, escrever um programa para linearizar um programa> <>. E faça isso no menor número de bytes possível; peixes não têm memórias muito grandes.
Movimento em> <>
Em> <>, o movimento é toroidal e um caractere de cada vez. Isso significa que o peixe (o ponteiro) pode "enrolar" do final de uma linha até o início. Em> <>, o peixe também é capaz de se mover de cima para baixo, de baixo para cima e da direita para a esquerda, em contraste com a maneira como a maioria dos ponteiros se move. Portanto, esse padrão de movimento seria válido:
>>>^ >>>v
>>>^ v
e terminaria em um loop infinito (retornando à linha superior assim que ultrapassar o fundo infinitamente).
O peixe se move em uma grade de comprimento igual a max (comprimento da linha) e altura igual ao número de linhas.
Como você descobre para onde o peixe se move? Estes comandos alteram o vetor de direção do movimento (por exemplo, (-1,0)
significa da direita para a esquerda):
Command | Direction Change
---------------------------
> | (1,0) (default)
< | (-1,0)
^ | (0,1)
v | (0,-1)
/ | (x,y) -> (y,x)
\ | (x,y) -> (-y,-x)
| | (x,y) -> (-x,y)
_ | (x,y) -> (x,-y)
# | (x,y) -> (-x,-y)
; | (0,0)
Como observado, o peixe começa a se mover da esquerda para a direita, ou seja, com o vetor de direção (1,0)
. O peixe começa a analisar os comandos começando com o primeiro comando que vê e muda de direção se um comando corresponder a um dos alteradores de direção acima mencionados.
O peixe para de se mover quando vê um ;
e termina o programa.
Entrada
A entrada será um programa válido (por exemplo, não em loop infinito) fornecido através do STDIN. Você também pode ler um arquivo, se desejar. As linhas de cada programa não terão necessariamente o mesmo comprimento.
A entrada é fornecida como uma sequência, com novas linhas separando cada linha do programa.
Os programas não serão repetidos, o que também significa que sempre terminarão com a ;
.
Saída
A saída será o programa linearizado. Ou seja, você deve retornar todos os caracteres (incluindo trocadores de direção) que o peixe veria se executasse o programa "normalmente". Este é todos os caracteres em seu caminho para o ;
.
Se a entrada possui linhas de comprimento desigual e o peixe acaba se movendo ao longo de uma linha menor que o comprimento da linha mais longa, você deve tratá-lo como se o peixe estivesse se movendo sobre um espaço (consulte os casos de teste).
Os familiarizados com> <> saberão que os trocadores de direção não são a única maneira de fazer movimento, mas, por uma questão de simplicidade, trate a entrada como se fosse a única maneira de afetar o movimento.
Regras
- Aplicam-se brechas padrão
- Você pode escrever um programa ou função completo
- A entrada é fornecida através de STDIN ou um arquivo como uma sequência que contém as linhas do programa separadas por novas linhas (
\n
)- Você pode entender a entrada de maneira diferente, dentro do razoável (fique à vontade para me perguntar se você tem um tipo específico de entrada em mente). Você não pode preencher a entrada com espaços para que os comprimentos da linha correspondam.
- Consulte esta meta post sobre entrada flexível. No que se refere à publicação, o consenso geral deve ser o mais flexível possível dentro do razoável.
- A saída é uma sequência única através de STDOUT ou retornada pela função (dependendo do que você escolher, consulte a Regra 2)
Casos de teste
v >v
>abcv//;
gfed<^ih
v>abcv<defghi^//>v;
v >v
>abcv//;
gfed<^
v>abcv<defg ^//>v;
abcdef;
abcdef;
abcd|;
abcd|dcba;
abcd#;
abcd#dcba;
abcd\;
_
abcd\_\dcba;
^;
>abcde/
^jihg<
^ >abcde/ <ghij^a;
;
;