Este desafío es un premio para ais523 por ganar la categoría " Novato del año " en " Lo mejor de PPCG 2016 ". ¡Felicidades!
BackFlip es un lenguaje de programación esotérico creado por el usuario ais523 , que ha creado más de 30 interesantes esolangs .
BackFlip es un lenguaje 2D como Befunge o > <> donde el puntero de instrucción atraviesa una cuadrícula de texto (el programa), moviéndose hacia arriba, hacia abajo, hacia la izquierda y hacia la derecha, cambiando de dirección según el carácter en el que se encuentre. Críticamente, la cuadrícula en un programa BackFlip cambia a medida que se atraviesa, un poco como la hormiga de Langton .
Para este desafío, puede suponer que un programa BackFlip es siempre una cuadrícula de texto rectangular (todas las líneas tienen la misma longitud), 1 × 1 de tamaño mínimo, que solo contiene los caracteres ./\<>^V
. ( .
se usa para visibilidad en lugar de espacio). Semánticamente, el BackFlip que usaremos aquí es idéntico a la especificación original .
El puntero de instrucción (IP) en BackFlip siempre comienza justo a la izquierda de la esquina superior izquierda del programa, hacia la derecha. Hay tres tipos de comandos que puede encontrar:
.
es un no-op. La IP continúa en la dirección en que se dirigía. El no-op sigue siendo un no-op./
Y\
son espejos. Reflejan la IP en la dirección indicada por su ángulo, luego cambian al otro tipo de espejo .- Por ejemplo, si la IP se dirige hacia la izquierda
\
, comienza a moverse hacia arriba en lugar de hacia la izquierda y se\
convierte en a/
.
- Por ejemplo, si la IP se dirige hacia la izquierda
<
,>
,^
, YV
son flechas. Redirigen la IP a la dirección en la que apuntan, luego cambian a una flecha que apunta en la dirección de la que proviene la IP (opuesta a la dirección en que se movía la IP) .- Por ejemplo, si la IP se dirige hacia abajo
>
, comienza a moverse hacia la derecha en lugar de hacia abajo y se>
convierte en una^
porque esa es la dirección de la que proviene la IP.
- Por ejemplo, si la IP se dirige hacia abajo
Un programa BackFlip finaliza cuando la IP se sale de los límites, es decir, se desconecta de la red. Resulta que todos los programas BackFlip finalmente terminan porque los bucles infinitos son imposibles. (Puede suponer que esto es cierto).
Su objetivo en este desafío es escribir un programa o función que tome un programa BackFlip y genere el número de movimientos que realiza el puntero de instrucción antes de que finalice el programa. Es decir, ¿cuántos pasos toma la IP en el curso de la ejecución de un programa? Esto incluye el paso inicial en la cuadrícula y el paso final fuera de ella.
Por ejemplo, el puntero de instrucciones toma 5 pasos en la cuadrícula trivial ....
:
.... <- empty 4×1 grid
012345 <- step number of the IP
Entonces la salida a ....
es 5
.
En la cuadrícula 4 × 2 más compleja
\...
\.><
la IP sale de la cuadrícula en su noveno paso, por lo que la salida es 9
:
step grid IP position (@)
0 \... @....
\.>< ....
1 \... @...
\.>< ....
2 /... ....
\.>< @...
3 /... ....
/.>< .@..
4 /... ....
/.>< ..@.
5 /... ....
/.<< ...@
6 /... ....
/.<< ..@.
7 /... ....
/.>< .@..
8 /... ....
/.>< @...
9 /... ....
\.>< ....
@
El código más corto en bytes gana.
Puede tomar la entrada como una matriz de líneas o matriz de caracteres en lugar de una cadena de varias líneas si lo desea, pero debe usar los caracteres ./\<>^V
(no los códigos de operación enteros). Puede usar espacio en lugar de .
si lo prefiere. Está bien si se \
necesita escapar caracteres como en la entrada. La salida es siempre un entero más de uno.
Casos de prueba
....
5
\...
\.><
9
.
2
..
3
.
.
2
\
2
^
2
.^.
3
<.
2
\\
\/
7
>V
^<
6
>\
>/
6
\><
2
\><
\><
7
\><
\><
\><
12
\.V.
\.\<
5
\.V.
\./<
9
V./\
V./\
>./<
..\/
14
\V..
.^..
\/><
.V..
.^..
20
\.V.V.
\./.\<
.>\<..
..^.^.
31
\.V.V.V.
\./>/.\<
.>\>\<..
..^.^.^.
69
\.V.V.V.V.
\./>/>/.\<
.>\>\>\<..
..^.^.^.^.
145
\.V.V.V.V.V.V.V.V.V.V.
\./>/>/>/>/>/>/>/>/.\<
.>\>\>\>\>\>\>\>\>\<..
..^.^.^.^.^.^.^.^.^.^.
9721
/
la IP hará que suba y hacia arriba /
hará que la IP vaya hacia la derecha, como si fuera una pelota que rebota en una pared. (Pero recuerde los /
cambios en la barra invertida después de que la IP lo toque).