Spraw, by wąż wypełnił dowolny labirynt (aż utknie).
Wąż
Wąż zaczyna się w danym punkcie początkowym, wskazując WSCHÓD . Porusza się, zawsze mając ścianę lub część ciała bezpośrednio po LEWEJ stronie swojej głowy („ zwolennik reguły ściany lewej ”), dopóki nie utknie, ponieważ wszystkie cztery kierunki wokół jego głowy są zajęte. (Uwaga: utknięty wąż może nie wypełnić całej dostępnej przestrzeni, ale to nie jest cel!)
Wyzwanie
Napisz program lub funkcję, która akceptuje labirynt jako dane wejściowe w postaci tekstu 2D:
- Dane wejściowe mogą być w dowolnym rozsądnym formacie: np. Lista ciągów, pojedynczy ciąg znaków z nowymi liniami, plik.
- Labirynt ma ściany („
#
”), puste przestrzenie („”) i dokładnie jeden punkt początkowy („
o
”). Możesz to zrobić
- albo przyjąć, że pierwszy i ostatni rząd i kolumna są całkowicie ścianami;
- lub załóżmy, że każdy wkład ma domyślną zewnętrzną warstwę ścian
Możesz założyć, że punkt początkowy ma ścianę (lub ukrytą ścianę) bezpośrednio nad nią (PÓŁNOC) i że wąż może wykonać prawidłowy ruch początkowy w kierunku WSCHODNIM lub POŁUDNIOWYM.
- Możesz założyć, że w tekście nie ma żadnych innych znaków (oprócz znaków nowej linii, jeśli ich potrzebujesz).
- Możesz założyć, że wszystkie linie mają tę samą długość.
i drukuje / zwraca „wypełniony labirynt” jako dane wyjściowe, wraz z migawką węża w momencie, gdy utknął :
- Ciało węża jest reprezentowane przez postacie
>v<^
wskazujące, gdzie jest jego następny segment - Punktem początkowym węża jest albo jego kierunek na początku („
>
”, chyba że musiał natychmiast skręcić), alboo
postać (nie trzeba być konsekwentnym) - Punktem końcowym węża jest
o
postać
Punktacja
Zwykły kod golfowy: wygrywa najkrótszy kod
Przykład
in:
#################################
# o #
# #
# ## ### ## #
# ## ## ## ## #
# ## ## ## ## #
# ## ## ## ## #
# ## ## ## ## #
# ## ### ## #
# ## ##### ## #
# ## ##### ## #
# ## ### ## #
# ## ## #
# #
# #
#################################
out:
#################################
#>>>>>>>>>>>>>>>>>>>v>>>>>>>>>>v#
#^>>>>>>>>>>>>>>>>>v>>>>>>>>>>vv#
#^^ ##>>>>>>v###o>>>>>v## vv#
#^^ ##>^ ##>>>>^## >v## vv#
#^^ ##^ ## ## v## vv#
#^^ ##^ ## ## v## vv#
#^^ ##>^ ## ## >v## vv#
#^^ ##^< ### v<## vv#
#^^ ##^ ##### v## vv#
#^^ ##^ ##### v## vv#
#^^ ##^< ### v<## vv#
#^^ ##^<<<<<<<<<<<<<<<<## vv#
#^^<<<<<<<<<<<<<<<<<<<<<<<<<<<<v#
#^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#
#################################
Animowane (w celach ilustracyjnych):
Edycja: Należy zauważyć, że w razie wątpliwości, wąż powinien „trzymać swoją lewą rękę” na ścianie już jest, w następstwie kątach, nie skacze do ściany 1 przecznicę od hotelu.
Dziękuję Jonathanowi Allanowi za jego poruszenie, a Draco'owi za powyższą migawkę wyjaśniającą.
Inne przykłady
in:
####################
# o# #
# ###
# #
# ## #
# ###
####################
out:
####################
#>>>>>>>>>>>>>>vv# #
#^>>>>>>>>>>>>vvv###
#^^ v<<<o<<<<v>>v#
#^^<<<<##^<<<<<<v<<#
#^<<<<<<<<<<<<<<<###
####################
in:
####################
# o #####
# #####
# #
# ##
####################
out:
####################
# >>>>v#####
# v#####
# >>>>o#
# ##
####################
in:
################
#o #
# ########## #
# # # #
# # # #
# # # #
# # # # #
# # # #
# # # #
# # # #
# ############ #
# #
################
out:
################
#>>>>>>>>>>>>>v#
#>>v##########v#
#^#>>>>>>>>>v#v#
#^#>>>>>>>>vv#v#
#^#^>>>>>>vvv#v#
#^#^^# vvv#v#
#^#^^o<<<<<vv#v#
#^#^^<<<<<<<v#v#
#^#^<<<<<<<<<#v#
#^############v#
#^<<<<<<<<<<<<<#
################
Odpowiedzi:
Węgiel drzewny ,
9468 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Slurpuj dane wejściowe w ciągu. Można tego uniknąć, stosując mniej dogodny format wejściowy.
Wydrukuj dane wejściowe bez przesuwania kursora, a następnie wydrukuj do góry
o
, aby kursor znalazł się pod nim.Zainicjuj bieżący kierunek.
Powtarzaj, dopóki w pewnym kierunku jest jeszcze wolne miejsce.
Oblicz, czy wąż może skręcić w lewo, czy jest zmuszony skręcić w prawo. Kod
≦⊖θW¬⁼§KVθ ≦⊕θ
działa również w tym przypadku dla tej samej liczby bajtów, chociaż uważa się0
za up zamiast zamiast prawo, więc reszta kodu musi zostać dostosowana.Wypisz odpowiedni charakter ciała we właściwym kierunku.
Przywróć głowę. Można to również zapisać jako
Po
wypisujące głowę bez przesuwania kursora za każdym razem, gdy przechodzi ona przez pętlę (ale umożliwia to niejawne zamknięcie pętli dla tej samej liczby bajtów).źródło
Python 2 ,
273253242 bajtów-11 bajtów dzięki ArBo
Wypróbuj online!
Działa to poprzez przeszukanie łańcucha
'o '
i zastąpienie go'[>v<^]o'
, jeśli jest w labiryncie.Ta sama kontrola zostanie również wykonana w obróconym labiryncie, drukując wypełniony labirynt, gdy struny już nie ma.
Funkcja
t=lambda g,k=1:'\n'.join(map(j,zip(*g.split('\n')[::k])[::-k]))
służy do obracania siatkiźródło
Galaretka ,
7256 bajtówWypróbuj online!
Pełny program, który przyjmuje dane wejściowe jako listę ciągów i zwraca listę ciągów wraz z końcowym wężem. Zauważ, że stopka na TIO konwertuje pojedynczy ciąg oddzielony nową linią na pożądane dane wejściowe i przywraca nowe linie na końcu; jest to wyłącznie dla wygody.
Rozwiązanie nieco zainspirowane metodą zastosowaną w odpowiedzi na pytanie Pytona 2 @ Rod , choć implementacja jest zupełnie inna.
źródło
Rubin ,
126118 bajtów-8 bajtów zapisanych przez nadużywanie
+=
zamiast ręcznego wyszukiwaniao
po zmianie położenia.Wypróbuj online!
źródło
Zapytanie T-SQL 2008,
373371366 bajtówMiałem listę priorytetów, zawsze ślizgającą się w lewo, prosto, w prawo. Zmieniłem ten priorytet na zawsze ślizgający się do tyłu, w lewo, prosto, w prawo. Cofanie zawsze będzie blokowane, więc priorytet pozostaje taki sam, z wyjątkiem pierwszego slitheru. Obracając węża początkowo w dół (C = 4), próbuje się ślizgać w górę podczas cofania. Ten mały wyczyn zaoszczędził mi 2 bajty. Ponieważ nie musiałem dodawać 1 do ~ - ~ -c% 4.
Wstawiłem 2 podziałki linii, aby było czytelne
Musiałem wprowadzić drobne poprawki, aby wykonać to online, opublikowana wersja działa w studiu zarządzania serwerem MS-SQL.
Naciśnij Ctrl-T przed uruchomieniem w studiu zarządzania serwerem MS-SQL, to pokaże wynik jako tekst.
Wypróbuj online
źródło
Python 3 , 343 bajty
Wypróbuj online!
-11 bajtów dzięki ArBo
-4 bajtów dzięki Jonathanowi Frechowi
źródło
X
,Y
iF
abyX=0,1,0,-1;F,*Y=*X,0
, jeśli się nie mylę. Ponadtoimport*
koszty są większe niż w bajtach.*g,=map(...)
. Asys.stdin.readlines()
może działa?input()
.if C=="o"
~>if"o"==C
,if g[r+X[L]][c+Y[L]]==" "
,elif g[r+X[F]][c+Y[F]]>" "
,if g[r-X[L]][c-Y[L]]>" "
Odpowiednio.05AB1E ,
5452 bajtyI / O jako jeden ciąg wielu linii.
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Pyth , 161 bajtów
Wypróbuj online!
Port rozwiązania Python 3 dla HyperNeutrino . Teraz, gdy już z tym skończyłem, myślę, że powinienem był przenieść port Pythona 2 na Rod, ale spędziłem już na tym zbyt dużo czasu.
źródło