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;
;
;
Odpowiedzi:
Röda ,
405393392391371366361236234232230223200 bajtówWypróbuj online!
Sprawdź wyjścia!
Wyjaśnienie (nieaktualne)
Edycje
%
zamiast sprawdzania, czy x lub y przekracza granice, co utorowało drogę dla 2 kolejnych!`\`
zamiast"\\"
c=""
do drugiego wiersza, a następnie usunięty po nim nowy wierszwhile
Użyłem składni nawiasów klamrowych (dzięki @fergusq za wykrycie tego)a=X
z instrukcji if+1
na końcuindexOf
i zrestrukturyzowano, aby zapisać 2 bajtyuntil[c=";"]
zamiastwhile[c!=";"]
l.=[" "]*L
źródło
x=((x+X)%#l)
zamiastx+=X
. Niestety(-1)%#l
wciąż powraca-1
.y
za:y=y%#f
.key
zamiastcmp
i używaj{...}while[...]
zamiastwhile[...]do ... done
.Python 2,
262243237235234233231221219218217 bajtówPobiera dane wejściowe jako
['<line_1>', '<line_2>', ...]
Wypróbuj online!
-19 bajtów dzięki @math_junkie
-6 bajtów dzięki @ThisGuy
-2 bajtów przez wyodrębnienie
max(map(L,i))
do zmiennej (ponieważ teoretycznie jest używana dwukrotnie).-1 bajt poprzez zmniejszenie liczby
i[y][x]
wyświetleń.-1 bajt przy użyciu,
'\x00'
więc nie muszę wykonywać[1:]
częścio[1:]
wyjściowej-2 bajtów przy użyciu
\0
zamiast\x00
-10 bajtów dzięki @KritixiLithos za uświadomienie sobie, że mogę wstawić tyle, ile chcę po prawej stronie, ponieważ dodatkowe zostaną zignorowane
(bez zmiany bajtów) naprawiony błąd, ponieważ wyodrębniona zmienna była poza pętlą
-2 bajtów, ponieważ teraz używam tylko
len
2 razy, więc ponowne przypisanie zajmuje 2 dodatkowe bajty-2 bajty za pomocą
while';'not in o
zamiastwhile o[-1]!=';'
i używanieo=''
zamiasto='\0'
. To nie tylko oszczędza 2 bajty, ale także pozbywa się wiodącego bajtu zerowego, który technicznie nie był tak naprawdę ważny.Wyjaśnienie
źródło
try
odfind
zwrotów-1
jeśli nie znaleziono: TIOlen
do zmiennej, np.L
Aby zapisać 3 bajty i kolejne 4, zmieniając przypisanie wielowierszowe0
na 1 linięx=y=k=0
.Rubin,
274200187183Ogolił zaledwie kilka więcej znaków przez upuszczenie tablicę rozpędu
d
.Jestem z tego dość dumny. To była zabawa! Pobiera tablicę ciągów i zwraca odpowiedni ciąg.
Skomentowano poniżej.
źródło
PHP 7,
291260 bajtówźródło
JavaScript,
242236235231220 bajtówWypróbuj online!
źródło