Questa sfida è un premio per ais523 per aver vinto la categoria " Rookie of the Year " in " Best of PPCG 2016 ". Congratulazioni!
BackFlip è un linguaggio di programmazione esoterico creato dall'utente ais523 , che ha creato ben oltre 30 altri esolang interessanti .
BackFlip è un linguaggio 2D come Befunge o > <> in cui il puntatore dell'istruzione attraversa una griglia di testo (il programma), si sposta in alto, in basso, a sinistra e a destra, cambiando direzione a seconda del carattere su cui si trova. Criticamente, la griglia in un programma BackFlip cambia mentre viene attraversata, un po 'come la formica di Langton .
Per questa sfida puoi supporre che un programma BackFlip sia sempre una griglia rettangolare di testo (tutte le righe hanno la stessa lunghezza), almeno 1 × 1, contenente solo i caratteri ./\<>^V
. ( .
è usato per la visibilità piuttosto che per lo spazio.) Semanticamente la BackFlip che useremo qui è identica alla specifica originale .
Il puntatore di istruzioni (IP) in BackFlip inizia sempre a sinistra dell'angolo in alto a sinistra del programma, andando a destra. Esistono tre tipi di comandi che può incontrare:
.
è una no-op. L'IP continua nella direzione in cui stava andando. Il no-op rimane no-op./
e\
sono specchi. Riflettono l'IP nella direzione indicata dal loro angolo, quindi cambiano nell'altro tipo di specchio .- Ad esempio, se l'IP punta a sinistra in a
\
, inizia a spostarsi verso l'alto anziché a sinistra e\
diventa a/
.
- Ad esempio, se l'IP punta a sinistra in a
<
,>
,^
, EV
sono frecce. Reindirizzano l'IP nella direzione in cui puntano, quindi si trasformano in una freccia che punta nella direzione da cui proveniva l'IP (opposta alla direzione in cui si stava muovendo l'IP) .- Ad esempio, se l'IP si dirige verso il basso
>
, inizia a spostarsi a destra anziché verso il basso e>
diventa a^
perché è la direzione da cui proviene l'IP.
- Ad esempio, se l'IP si dirige verso il basso
Un programma BackFlip termina quando l'IP esce dai limiti, ovvero esce dalla griglia. Si scopre che alla fine tutti i programmi BackFlip finiscono perché i loop infiniti sono impossibili. (Puoi presumere che sia vero.)
Il tuo obiettivo in questa sfida è quello di scrivere un programma o una funzione che accetta un programma BackFlip ed emette il numero di mosse che il puntatore dell'istruzione esegue prima che il programma termini. Questo è, quanti passi compie l'IP durante l'esecuzione di un programma? Ciò include il passaggio iniziale sulla griglia e il passaggio finale di esso.
Ad esempio, il puntatore dell'istruzione esegue 5 passaggi nella griglia banale ....
:
.... <- empty 4×1 grid
012345 <- step number of the IP
Quindi l'output a ....
è 5
.
Nella griglia 4 × 2 più complessa
\...
\.><
l'IP esce dalla griglia al suo nono passo, quindi l'output è 9
:
step grid IP position (@)
0 \... @....
\.>< ....
1 \... @...
\.>< ....
2 /... ....
\.>< @...
3 /... ....
/.>< .@..
4 /... ....
/.>< ..@.
5 /... ....
/.<< ...@
6 /... ....
/.<< ..@.
7 /... ....
/.>< .@..
8 /... ....
/.>< @...
9 /... ....
\.>< ....
@
Vince il codice più breve in byte.
Se lo si desidera, è possibile utilizzare l'input come una matrice di righe o matrice di caratteri anziché come una stringa multilinea, ma è necessario utilizzare i caratteri ./\<>^V
(non i codici operativi interi). È possibile utilizzare lo spazio anziché .
se preferito. Va bene se ai personaggi piacciono\
devono essere evitati in input. L'output è sempre un numero intero più di uno.
Casi test
....
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à salire l'IP e salendo su /
farà andare l'IP a destra, come se fosse una palla che rimbalza su un muro. (Ma ricorda le /
modifiche alla barra rovesciata dopo che l'IP l'ha toccato.)