Este desafio é um prêmio para ais523 por vencer a categoria " Novato do ano " em " Melhores do PPCG 2016 ". Parabéns!
O BackFlip é uma linguagem de programação esotérica criada pelo usuário ais523 , que criou mais de 30 outros esolangs interessantes .
O BackFlip é uma linguagem 2D como o Befunge ou > <>, onde o ponteiro da instrução percorre uma grade de texto (o programa), movendo-se para cima, para baixo, para a esquerda e para a direita, mudando de direção dependendo do caractere em que está. Criticamente, a grade em um programa BackFlip muda à medida que ela é atravessada, um pouco como a Ant de Langton .
Para esse desafio, você pode assumir que um programa BackFlip é sempre uma grade retangular de texto (todas as linhas do mesmo comprimento), tamanho 1 × 1 no mínimo, contendo apenas os caracteres ./\<>^V. ( .é usado para mais visibilidade do que espaço). Semanticamente, o BackFlip que usaremos aqui é idêntico à especificação original .
O ponteiro de instrução (IP) no BackFlip sempre inicia logo à esquerda do canto superior esquerdo do programa, indo para a direita. Existem três tipos de comandos que podem ser encontrados:
.é um não-op. O IP continua na direção em que estava indo. O no-op permanece no-op./e\são espelhos. Eles refletem o IP na direção indicada pelo ângulo e depois mudam para o outro tipo de espelho .- Por exemplo, se o IP for deixado em a
\, ele começará a se mover para cima em vez de para a esquerda e\se tornará a/.
- Por exemplo, se o IP for deixado em a
<,>,^, EVsão setas. Eles redirecionam o IP para a direção em que apontam e depois mudam para uma seta que aponta na direção em que o IP veio (oposto à direção em que o IP estava se movendo) .- Por exemplo, se o IP for direcionado para baixo
>, ele começa a se mover para a direita em vez de para baixo e>torna-se um^porque é essa a direção da qual o IP veio.
- Por exemplo, se o IP for direcionado para baixo
Um programa BackFlip termina quando o IP sai dos limites, ou seja, sai da grade. Acontece tudo programas BackFlip eventualmente terminam porque loops infinitos são impossíveis. (Você pode assumir que isso é verdade.)
Seu objetivo neste desafio é escrever um programa ou função que receba um programa BackFlip e produza o número de movimentos que o ponteiro de instruções realiza antes que o programa termine. Ou seja, quantas etapas o IP executa no decorrer da execução de um programa? Isso inclui a etapa inicial na grade e a etapa final dela.
Por exemplo, o ponteiro de instruções executa 5 etapas na grade trivial ....:
.... <- empty 4×1 grid
012345 <- step number of the IP
Então a saída para ....é 5.
Na grade 4 × 2 mais complexa
\...
\.><
o IP sai da grade na sua 9a etapa, portanto a saída é 9:
step grid IP position (@)
0 \... @....
\.>< ....
1 \... @...
\.>< ....
2 /... ....
\.>< @...
3 /... ....
/.>< .@..
4 /... ....
/.>< ..@.
5 /... ....
/.<< ...@
6 /... ....
/.<< ..@.
7 /... ....
/.>< .@..
8 /... ....
/.>< @...
9 /... ....
\.>< ....
@
O código mais curto em bytes vence.
Você pode receber a entrada como uma matriz de linhas ou matriz de caracteres, em vez de uma sequência de múltiplas linhas, se desejar, mas você deve usar os caracteres ./\<>^V(não os códigos de operação inteiros). Você pode usar espaço em vez de. se preferir. Tudo bem se personagens como\ precisam ser escapados na entrada. A saída é sempre um número inteiro mais de um.
Casos de teste
....
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
/fará o IP subir e subir para /a direita fará a direita, como se fosse uma bola quicando na parede. (Mas lembre-se as /alterações à barra invertida após o IP toca.)