El querido pez que nada a través del código de > <> (un lenguaje de programación esotérico) ha sido sacado de su entorno natural. Este cambio lo ha vuelto incapaz de moverse de la forma en que solía hacerlo: lo que solía ser un movimiento toroidal se ha restringido a un simple movimiento de izquierda a derecha. Pero los programas> <> todavía se escriben como si el pez fuera capaz de moverse a través de ellos. Es su tarea, querido programador, escribir un programa para linealizar un programa> <>. Y hazlo en el menor número de bytes posible; Los peces no tienen recuerdos muy grandes.
Movimiento en> <>
En> <>, el movimiento es toroidal y un carácter a la vez. Esto significa que el pez (el puntero) puede "envolverse" desde el final de una línea hasta el principio. En> <>, el pez también es capaz de moverse de arriba hacia abajo, de abajo hacia arriba y de derecha a izquierda, en contraste con la forma en que se mueven la mayoría de los punteros. Entonces este patrón de movimiento sería válido:
>>>^ >>>v
>>>^ v
y terminaría en un bucle infinito (volviendo a la línea superior una vez que pasa infinitamente por la inferior).
El pez se mueve en una cuadrícula de longitud igual al máximo (longitud de la fila) y la altura igual al número de filas.
¿Cómo sabes de qué manera se mueve el pez? Estos comandos cambian el vector de dirección del movimiento (por ejemplo, (-1,0)
significa de derecha a izquierda):
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 se señaló, el pez comienza a moverse de izquierda a derecha, es decir, con el vector de dirección (1,0)
. El pez comienza a analizar los comandos comenzando con el primer comando que ve y cambia su dirección si un comando coincide con uno de los cambiadores de dirección mencionados anteriormente.
El pez deja de moverse cuando ve a ;
y finaliza el programa.
Entrada
La entrada será un programa válido (por ejemplo, no de bucle infinito) dado a través de STDIN. También puede leer un archivo si lo desea. Las líneas de cada programa no serán necesariamente de la misma longitud.
La entrada se da como una cadena, con nuevas líneas que separan cada línea en el programa.
Los programas no se repetirán, lo que también significa que siempre terminarán con a ;
.
Salida
La salida será el programa linealizado. Es decir, debe devolver todos los caracteres (incluidos los cambiadores de dirección) que el pez vería si ejecutara el programa "normalmente". Estos son todos los personajes en su camino hacia el ;
.
Si la entrada tiene líneas de longitud desigual y el pez termina moviéndose a lo largo de una línea más corta que la longitud de la línea más larga, debe tratar eso como si el pez se moviera sobre un espacio (ver casos de prueba).
Aquellos familiarizados con> <> sabrán que los cambiadores de dirección no son la única forma de hacer movimiento en él, sino que, por simplicidad, tratan la entrada como si fueran la única forma de afectar el movimiento.
Reglas
- Se aplican lagunas estándar
- Puede escribir un programa completo o una función
- La entrada se proporciona a través de STDIN o un archivo como una cadena que contiene las líneas del programa separadas por líneas nuevas (
\n
)- Puede tomar la entrada de manera diferente, dentro de lo razonable (no dude en preguntarme si tiene un tipo específico de entrada en mente). No puede rellenar la entrada con espacios para que las longitudes de línea coincidan.
- Consulte esta meta publicación con respecto a la entrada flexible. Tal como están las publicaciones, el consenso general debe ser lo más flexible posible dentro de lo razonable.
- La salida es una sola cadena a través de STDOUT o devuelta por la función (dependiendo de lo que elija hacer, consulte la Regla 2)
Casos de prueba
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;
;
;