Jesteś Ruby, inżynierem kolei. Twoim zadaniem jest położyć ślad w dowolnej dolinie, tak aby odwiedzała każdą stację ( M
). Ilość ułożonych torów nie jest ważna, ale musi być ułożona na jednej ciągłej ścieżce, która zaczyna się i kończy w punkcie wejścia / wyjścia doliny ( >
) i nie przecina się w żadnym punkcie. Jest jeszcze kilka innych ograniczeń: góry ( ^
) są nieprzejezdne, więc musisz je ominąć, rzeki ( ~
) należy przekroczyć za pomocą mostu ( X
), a także krawędź doliny ( #
) jest nieprzejezdna.
Zasady toru
Jeśli tor nie zostanie prawidłowo ułożony, wystąpią wykolejenia i nikt tego nie chce, więc oto zasady dotyczące rozmieszczania torów.
Istnieją cztery rodzaje toru: -
|
/
\
.
Oto jak każdy z nich może być łączony z innymi:
Dozwolone kombinacje z -
(w środku każdego przykładu):
##### ##### ##### ##### ##### ##### #####
# # # # #\ # # # # /# #\ /# # #
#---# # --# # --# #-- # #-- # # - # # - #
# # #/ # # # # \# # # # # #/ \#
##### ##### ##### ##### ##### ##### #####
-
nigdy nie może być łączony z |
. To zbyt ostry zakręt, aby pociągi mogły bezpiecznie jechać.
Dozwolone kombinacje z /
(w środku każdego przykładu):
##### ##### ##### ##### ##### ##### #####
# /# # -# # |# # /# # /# # -# # |#
# / # # / # # / # # / # # / # # / # # / #
#/ # #/ # #/ # #| # #- # #| # #- #
##### ##### ##### ##### ##### ##### #####
\
nigdy nie może być łączony z /
. To zbyt ostry zakręt, aby pociągi mogły bezpiecznie jechać.
Dozwolone kombinacje z \
(w środku każdego przykładu):
##### ##### ##### ##### ##### ##### #####
#\ # #- # #| # #\ # #\ # #- # #| #
# \ # # \ # # \ # # \ # # \ # # \ # # \ #
# \# # \# # \# # |# # -# # |# # -#
##### ##### ##### ##### ##### ##### #####
Dozwolone kombinacje z |
(w środku każdego przykładu):
##### ##### ##### ##### ##### ##### #####
# | # #\ # # /# # | # # | # # /# #\ #
# | # # | # # | # # | # # | # # | # # | #
# | # # | # # | # #/ # # \# # \# #/ #
##### ##### ##### ##### ##### ##### #####
Tory mogą łączyć się ze stacjami, mostami i wejściem / wyjściem do doliny w następujący sposób:
##### ##### #####
#\|/# #\|/# #/ #
#-M-# #-X-# >- #
#/|\# #/|\# #\ #
##### ##### #####
Stacje mają stoły obrotowe, więc można opuścić stację pod ostrym kątem (choć nie w tę samą stronę, z której przybyłeś - nie chciałbyś wskoczyć do następnego zaplanowanego pociągu jadącego w drugą stronę!).
Mosty służą do przekraczania rzek, więc musisz wyjść z mostu po przeciwnej stronie rzeki, do której wpłynąłeś.
Wejście
Dane wejściowe będą przez STDIN dla programów lub argument funkcji dla funkcji. Jeśli twoja funkcja potrzebuje nazwy, aby uruchomić ją na moich danych wejściowych, deklaracja nazwy powinna zostać uwzględniona w liczbie bajtów.
Dane wejściowe będą stanowić pojedynczy ciąg znaków z podziałem wierszy. Każda linia w twoim wejściu będzie zawsze miała taką samą długość jak inne, co daje prostokątne wejście. Krawędź wejścia będzie zawsze solidna i nieprzejezdna ( #
), z wyjątkiem punktu wejścia. Każde dane wejściowe będą miały co najmniej jedną prawidłową odpowiedź.
Wynik
Twój wynik powinien zostać zwrócony jako pojedynczy ciąg znaków z podziałem wierszy funkcji lub wydrukowany / wyświetlony na ekranie dla pełnych programów.
Dane wyjściowe powinny być takie same jak dane wejściowe, ale z dodanymi znakami ścieżki.
Punktacja
Zwycięzcą będzie najkrótszy kod w bajtach.
Przypadki testowe
###########
# M #
# ^ #
> ^^ M #
# ^ #
#~~~~~~~~~#
# M #
# ^^ #
# M#
###########
#################
# #
# M M #
# ^ #
# ^ M #
#~~~~~~~^ #
# #
# ^ #
# M^ #
# ^ #
> ^^^ M#
# #
# M #
#################
###############
# M ~ #
# ~ #
> ~ M #
# ~ #
# ~ #
# ~ #
###############
Możliwe rozwiązania przypadków testowych
###########
# ---M #
#/ ^ \ #
> ^^ M #
#\ ^ | #
#~X~~~~X~~#
# M \ #
# \ ^^ |#
# -----M#
###########
#################
# #
# M---------M #
# | ^ / #
# / ^ M- #
#~X~~~~~^ | #
# | \ #
# \^ \ #
# --M^ \ #
#/ ^ |#
> ^^^ M#
#\ / #
# -------M---- #
#################
###############
# M ~ #
#/ \ ~ #
> --X----M #
#\ ~ | #
# \ ~ / #
# ---X--- #
###############
Odpowiedzi:
Python 2 ,
3990343044124313 bajtówJest to w zasadzie A * z brzydką heurystyczną i brzydką
getChildren
metodą. Aby uruchomić 3 przypadki testowe kolejno, uruchamia się6.5s
na moim komputerze. Funkcjaf
jest tutaj rozwiązaniem. Bierze mapę jako ciąg i zwraca rozwiązaną mapę jako ciąg.Wypróbuj online!
Przypadki testowe
Test 1
Test 2
Test 3
Kod źródłowy
A * State + A * Klasa solvera
Grałem w golfa z mojego rozwiązania. Ale istnieją w mojej „czytelnej” wersji. Klasa państwowa jest ogólna i ma być zaimplementowana. Klasa Solver przyjmuje stan początkowy, a następnie podąża za tym stanem heurystycznym
getDist
.Klasa Stanowa
Jest to implementacja klasy stanu A *. Najważniejszą metodą jest tutaj
getDist
heurystyka do określania, jak bliskoself
celu jest cel. Jest to w zasadzie minimalna odległość do odwiedzenia wszystkich pozostałych miejsc docelowych i powrotu do rozpoczęcia.Klasa mapy
Ta klasa przechowuje i przetwarza mapę. Ta
isConnected
metoda jest prawdopodobnie najważniejsza. Sprawdza, czy 2 kawałki toru są połączone.Aktualizacje
;
sźródło
elif e!=""and e in"MX>"
mogą być połączone w jedną linię z trójskładnikiemif else
. Również niektóre z twoichdef
mogą byćlambda
. Jakdef A(s):return str(s)
może byćA=lambda s:str(s)
, lub jeśli zmieni się z__str__
celu__repr__
można użyćA=lambda s:`s`
, w którym momencie, to nie będzie nawet warto miećA
w swojej funkcji, gdyż wymaga nawiasów do wywołania. Zamiast tego użyj po prostu backicksa.