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
<
,>
,^
, EV
sã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.)