Oto mapa, powiedzmy, lochu ...
##########
# #####
# #####
##########
##########
##########
##########
#### ##
#### ##
##########
Powiedzmy, że bohater jest w pokoju A (w lewym górnym rogu), a jego cel (książę w niebezpieczeństwie?) Znajduje się w pokoju B (w prawym dolnym rogu). Nasza mapa nie pozwala bohaterowi przejść do celu.
Musimy dodać przejście ...
##########
# #####
# #####
####.#####
####.#####
####.#####
####.#####
#### ##
#### ##
##########
Tam, o wiele lepiej!
Zasady
- Program lub funkcja, która akceptuje mapę lochów (złożoną z skrótów i spacji, z wierszami oddzielonymi znakami nowej linii).
- Wyświetli mapę z kropkami dodanymi w celu oznaczenia przejść we wszystkich przestrzeniach, które znajdują się na bezpośredniej ścieżce między znakami spacji.
- Nie zmieni długości ani liczby linii.
- Wszystkie przejścia są w linii prostej od spacji do spacji.
- Przejścia nie mogą zawracać za rogami
- Nie będą one znajdować się między spacjami a krawędzią mapy.
- Użyj dowolnego języka.
- Spróbuj wykonać konwersję w jak najmniejszej liczbie bajtów.
- Jeśli nie można narysować żadnych przejść, zwróć mapę bez zmian.
- Mapa powinna zawsze mieć skróty wokół wszystkich krawędzi (nie musisz obsługiwać spacji na krawędzi).
- Mapy wejściowe są zawsze prostokątne, każdy rząd powinien mieć tę samą szerokość.
Przypadki testowe
#### ####
# # => # #
# # # #
#### ####
########## ##########
# ##### # #####
# ##### # #####
########## ####.#####
########## => ####.#####
########## ####.#####
########## ####.#####
#### ## #### ##
#### ## #### ##
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## ##########
########## => ##########
########## ##########
########## ##########
###### ## ###### ##
###### ## ###### ##
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## ####.#####
########## => ####.#####
#### ### #### ###
########## ######.###
###### ## ###### ##
###### ## ###### ##
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## ##..######
########## => ##..######
########## ##..######
########## ##..######
## ####### ## .######
## ###### ## ######
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## #.########
########## => #.########
########## #.########
####### # #.##### #
####### # #.##### #
# ##### # # ..... #
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## #.########
##### ### => #.### ###
##### ### #.### ###
####### # #.##### #
####### # #.##### #
# ##### # # ..... #
########## ##########
########## ##########
## # ## #
########## ##......##
########## ##......##
########## => ##......##
########## ##......##
########## ##......##
########## ##......##
# ## # ##
########## ##########
########## ##########
#### #### #### ####
####### ## ####..# ##
###### ### ####.. ###
# ### ## # => # ... .. #
# ## ### # # .. ... #
### ###### ### ..####
## ####### ## #..####
#### #### #### ####
########## ##########
#
i.
?Odpowiedzi:
Galaretka , 17 bajtów
Wypróbuj online!
Podstępne -1 dzięki user202729 .
Wyjaśnienie:
źródło
Perl 5
-p0
, 56 bajtówWypróbuj online!
źródło
APL + WIN, 87 bajtów
Monity o matrycę znaków:
źródło
Haskell ,
209165162 bajtów.Wypróbuj online!
Nie jestem najbardziej efektywnym sposobem na zrobienie tego w Haskell, jestem tego pewien.
Mam na to za dużo nawiasów, ale nie jestem pewien, jak je usunąć.źródło
$
((k(take 2 c))
staje się(k$take 2 c)
). Możesz również użyć!!0
zamiasthead
w niektórych przypadkach.(k(take 2 c))
możesz po prostu usunąć zewnętrzne nawiasy, nie są one potrzebne. Ale w przypadkudrop(length(head d))
możesz nadal korzystać z$
, zastępując godrop(length$head d)
(a nawetdrop(length$d!!0)
).k
zamiast tego++
, możesz znacznie zmniejszyć ostatnią linię.k[' '<$k(take 2 c),'.'<$d!!0,drop(length$d!!0)$f$k$d]
.f b|(e:g:d@(h:_:_))<-group b=k[' '<$e++g,'.'<$h,drop(length h)$f$k d]|1>0=' '<$b
, to używa dopasowania wzoru, aby wykonać wiele ciężkich podnoszenia, które były wykonywane wcześniej.Python 2 ,
173148 bajtówWypróbuj online!
źródło
Retina 0.8.2 , 95 bajtów
Wypróbuj online! Wyjaśnienie:
Szuka
#
znaków znajdujących się nad spacjami lub.
s i zamienia je w kropki, dopóki nie zostaną żadne. Lookbehind znajduje#
kolumnę, a następnie lookahead przeskakuje do następnej linii i atomowo do tej samej kolumny poniżej, aby spacja lub.
pasowała tylko wtedy, gdy jest dokładnie poniżej#
.Wyszukuje
.
s, które nie znajdują się poniżej spacji lub.
s i zamienia je z powrotem w#
s, dopóki nie zostaną żadne. Lookahead znajduje.
kolumnę, a następnie lookbehind przeskakuje do poprzedniej linii i atomowo do tej samej kolumny powyżej w bardzo podobny sposób, aby spacja lub.
mogła się dopasować tylko, jeśli jest dokładnie powyżej#
. Zastosowano ujemny wygląd, więc działa to również dla.
s w górnym rzędzie.(Zwróć uwagę na końcowe spacje w obu wierszach) To po prostu wyszukuje wszystkie przebiegi znaków spacji między spacjami i zapewnia, że wszystkie są
.
s.źródło
Rubinowy , 104 bajty
Wypróbuj online!
Cóż, to nie jest świetne, ale przynajmniej jest skomplikowane. Jestem pewien, że można to poprawić.
źródło
Stax , 19 bajtów
Uruchom i debuguj
źródło
JavaScript (Node.js) ,
205193190186181175172 bajtówWypróbuj online!
Skomentował
źródło