To wyzwanie jest nagrodą dla ais523 za zwycięstwo w kategorii „ Świeżak roku ” w „ Best of PPCG 2016 ”. Gratulacje!
BackFlip to ezoteryczny język programowania stworzony przez użytkownika ais523 , który stworzył ponad 30 innych interesujących esolangów .
BackFlip to język 2D, taki jak Befunge lub > <>, w którym wskaźnik instrukcji przemierza siatkę tekstu (program), poruszając się w górę, w dół, w lewo i w prawo, zmieniając kierunek w zależności od znaku, na którym jest ustawiony. Krytycznie siatka w programie BackFlip zmienia się w trakcie ruchu, trochę jak Ant Langtona .
W przypadku tego wyzwania można założyć, że program BackFlip jest zawsze prostokątną siatką tekstu (wszystkie linie tej samej długości) o rozmiarze co najmniej 1 × 1, zawierającym tylko znaki ./\<>^V
. ( .
służy do widoczności, a nie do przestrzeni.) Semantycznie BackFlip, którego tu użyjemy, jest identyczny z oryginalną specyfikacją .
Wskaźnik instrukcji (IP) w BackFlip zawsze zaczyna się na lewo od lewego górnego rogu programu, na prawo. Istnieją trzy rodzaje poleceń, które może napotkać:
.
jest zakazem. IP kontynuuje w kierunku, w którym zmierza. No-op pozostaje no-op./
i\
są zwierciadłami. Odbijają IP w kierunku wskazanym przez ich kąt, a następnie zmieniają się w inny rodzaj lustra .- Na przykład, jeśli IP zmierza w lewo
\
, zaczyna przesuwać się w górę zamiast w lewo i\
staje się/
.
- Na przykład, jeśli IP zmierza w lewo
<
,>
,^
, IV
są strzałkami. Przekierowują adres IP w kierunku, w którym wskazują, a następnie zmieniają się w strzałkę wskazującą kierunek, z którego pochodzi adres IP (przeciwnie do kierunku, w którym poruszał się adres IP) .- Na przykład, jeśli IP zmierza w dół
>
, zaczyna się przesuwać w prawo zamiast w dół i>
staje się,^
ponieważ jest to kierunek, z którego pochodzi IP.
- Na przykład, jeśli IP zmierza w dół
Program BackFlip kończy się, gdy IP wykracza poza granice, tzn. Znika z siatki. Okazuje się, że wszystkie programy BackFlip ostatecznie się kończą, ponieważ nieskończone pętle są niemożliwe. (Możesz założyć, że to prawda).
Twoim celem w tym wyzwaniu jest napisanie programu lub funkcji, która pobierze program BackFlip i wyświetli liczbę ruchów, jakie wskaźnik instrukcji wykona przed zakończeniem programu. To znaczy, ile kroków wykonuje IP w trakcie uruchamiania programu? Obejmuje to wstępny krok na siatkę i ostatni krok z niej.
Na przykład wskaźnik instrukcji wykonuje 5 kroków w trywialnej siatce ....
:
.... <- empty 4×1 grid
012345 <- step number of the IP
Więc wyjściem ....
jest 5
.
W bardziej złożonej siatce 4 × 2
\...
\.><
IP opuszcza siatkę na 9 kroku, więc wynik jest następujący 9
:
step grid IP position (@)
0 \... @....
\.>< ....
1 \... @...
\.>< ....
2 /... ....
\.>< @...
3 /... ....
/.>< .@..
4 /... ....
/.>< ..@.
5 /... ....
/.<< ...@
6 /... ....
/.<< ..@.
7 /... ....
/.>< .@..
8 /... ....
/.>< @...
9 /... ....
\.>< ....
@
Najkrótszy kod w bajtach wygrywa.
W razie potrzeby dane wejściowe można traktować jako tablicę wierszy lub macierzy znaków zamiast ciągu wielowierszowego, ale należy użyć tych znaków ./\<>^V
(nie liczb całkowitych). Możesz użyć spacji zamiast, .
jeśli wolisz. W porządku, jeśli takie znaki \
wymagają zmiany znaczenia na wejściu. Wyjście jest zawsze liczbą całkowitą więcej niż jedną.
Przypadki testowe
....
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
/
spowoduje, że IP wzrośnie, a skierowanie do góry /
sprawi, że IP pójdzie w prawo, jakby to była piłka odbijająca się od ściany. (Ale pamiętaj o /
zmianach w odwrotnym ukośniku po tym, jak IP ich dotknie.)