Ukochana ryba, która przepływa przez kod > <> (ezoteryczny język programowania) została wyjęta ze swojego naturalnego środowiska. Ta zmiana sprawiła, że nie jest w stanie poruszać się tak, jak kiedyś: ruch toroidalny był ograniczony do prostego ruchu od lewej do prawej. Ale programy> <> są nadal pisane tak, jakby ryby mogły się przez nie przemieszczać. Drogi programatorze, Twoim zadaniem jest napisanie programu linearyzującego program> <>. I zrób to w jak najmniejszej liczbie bajtów; ryby nie mają bardzo dużych wspomnień.
Ruch w> <>
W> <> ruch jest toroidalny i jedna postać na raz. Oznacza to, że ryba (wskaźnik) może „owinąć się” od końca linii z powrotem do początku. W> <> ryba może również poruszać się od góry do dołu, od dołu do góry i od prawej do lewej, w przeciwieństwie do ruchu większości wskaźników. Tak więc ten wzór ruchu byłby prawidłowy:
>>>^ >>>v
>>>^ v
i kończy się na nieskończonej pętli (zapętla się z powrotem do górnej linii, gdy nieskończenie minie dno).
Ryba porusza się po siatce o długości równej maksimum (długość rzędu) i wysokości równej liczbie rzędów.
Jak ustalić, w którą stronę porusza się ryba? Te polecenia zmieniają wektor kierunku ruchu (np. (-1,0)
Oznaczają od prawej do lewej):
Command | Direction Change
---------------------------
> | (1,0) (default)
< | (-1,0)
^ | (0,1)
v | (0,-1)
/ | (x,y) -> (y,x)
\ | (x,y) -> (-y,-x)
| | (x,y) -> (-x,y)
_ | (x,y) -> (x,-y)
# | (x,y) -> (-x,-y)
; | (0,0)
Jak wspomniano, ryba zaczyna się poruszać od lewej do prawej, tj. Z wektorem kierunku (1,0)
. Ryba rozpoczyna analizowanie poleceń, zaczynając od pierwszego polecenia, które widzi i zmienia kierunek, jeśli polecenie pasuje do jednego z wyżej wymienionych zmieniaczy kierunku.
Ryba przestaje się poruszać, gdy widzi a ;
i kończy program.
Wejście
Dane wejściowe będą prawidłowym (np. Nieskończenie zapętlonym) programem podanym przez STDIN. Możesz także przeczytać plik, jeśli chcesz. Linie każdego programu niekoniecznie muszą być tej samej długości.
Dane wejściowe są podawane jako ciąg znaków, z nowymi liniami oddzielającymi każdą linię w programie.
Programy nie zapętlają się, co oznacza również, że zawsze kończą się na ;
.
Wynik
Wyjście zostanie zlinearyzowane przez program. Oznacza to, że powinieneś zwrócić wszystkie znaki (w tym zmieniacze kierunku), które ryba zobaczyłaby, gdyby uruchomiła program „normalnie”. To są wszystkie postacie na drodze do ;
.
Jeśli dane wejściowe mają linie o nierównej długości, a ryba ostatecznie porusza się wzdłuż linii krótszej niż długość najdłuższej linii, powinieneś traktować to tak, jakby ryba poruszała się po przestrzeni (patrz przypadki testowe).
Osoby zaznajomione z> <> będą wiedzieć, że zmieniacze kierunku nie są jedynym sposobem wykonywania w nim ruchu, ale dla uproszczenia traktuj dane wejściowe tak, jakby były jedynym sposobem wpływania na ruch.
Zasady
- Obowiązują standardowe luki
- Możesz napisać pełny program lub funkcję
- Dane wejściowe są dostarczane przez STDIN lub plik jako ciąg znaków zawierający linie programu oddzielone znakami nowej linii (
\n
)- Możesz przyjmować dane wejściowe inaczej, w granicach rozsądku (nie wahaj się zapytać mnie, czy masz na myśli konkretny rodzaj danych wejściowych). Nie można dopełniać wejścia spacjami, aby dopasować długości linii.
- Zobacz ten meta post dotyczący elastycznego wprowadzania danych. W obecnej sytuacji ogólny konsensus powinien być możliwie jak najbardziej elastyczny w granicach rozsądku.
- Dane wyjściowe to pojedynczy ciąg znaków przez STDOUT lub zwracany przez funkcję (w zależności od tego, co wybierzesz, patrz Zasada 2)
Przypadki testowe
v >v
>abcv//;
gfed<^ih
v>abcv<defghi^//>v;
v >v
>abcv//;
gfed<^
v>abcv<defg ^//>v;
abcdef;
abcdef;
abcd|;
abcd|dcba;
abcd#;
abcd#dcba;
abcd\;
_
abcd\_\dcba;
^;
>abcde/
^jihg<
^ >abcde/ <ghij^a;
;
;