O nie! Nemo, nasza mała ryba klauna zaginęła w tym oceanie ASCII, a jego tata Marlin próbuje go znaleźć.
Twoim zadaniem jest bezpieczne doprowadzenie Marlina do Nemo. Ale uwaga, mamy na wolności szalonego Bruce'a, więc lepiej go unikać za wszelką cenę!
Detale
Otrzymujesz prostokątną siatkę oceaniczną ASCII zawierającą tylko małe litery a-z
. Ten ocean będzie miał nemo
, marlin
a bruce
wewnątrz niego w postaci ciągłego poliomino, zawsze zaczynając od najwyższej komórki w pierwszej kolumnie poliomino. Na przykład spośród wszystkich możliwych tetrominów prawidłowe są wymienione w poniższym fragmencie
Ale takie formularze są nieprawidłowe i nie będą obecne w danych wejściowych:
omen
ne
mo
nem
o
o
m
en
nem
o
n
eo
m
Wreszcie, Twoim zadaniem jest znalezienie ścieżki od marlin
płytki poliomino do płytki nemo
poliomino, upewniając się, że żadna komórka na Twojej ścieżce nie sąsiaduje z bruce
płytką poliomino. Twój wynik powinien zastąpić wszystkie alfabety, które nie są częścią marlin
kafelka, nemo
kafelka i ścieżki łączącej oba znaki znakiem z drukowanego zakresu ASCII (w tym spacją) innym niż małe litery a-z
.
Przykład
Jeśli ocean wejściowy jest następujący:
oxknvvolacycxg
xmliuzsxpdzkpw
warukpyhcldlgu
tucpzymenmoyhk
qnvtbsalyfrlyn
cicjrucejhiaeb
bzqfnfwqtrzqbp
ywvjanjdtzcoyh
xsjeyemojwtyhi
mcefvugvqabqtt
oihfadeihvzakk
pjuicqduvnwscv
(przy czym 3 poliaminy to:
...n..........
.mli..........
.ar...........
..............
....b.........
....ruce......
..............
.....n........
.....emo......
..............
..............
..............
)
W takim przypadku prawidłowe rozwiązanie może wyglądać następująco:
...n..........
.mli..........
.ar...........
.u............
.n............
.i............
.z............
.wvjan........
.....emo......
..............
..............
..............
Poniżej fragment zawiera kilka innych przykładów:
Notatki
- Siatka zawsze będzie idealny prostokąt i będzie zawierać tylko jeden Polyomino płytki z
nemo
,marlin
ibruce
. - Twoja ścieżka nie powinna przechodzić przez
bruce
żadną z 4 sąsiadujących (w górę, w dół, w lewo i w prawo) komórek żadnej komórki nabruce
kafelku. - Zawsze gwarantuje się, że będzie co najmniej jedna poprawna ścieżka od
marlin
donemo
. - Nie ma tu wymogu najkrótszej ścieżki, więc zwariuj!
- Nawet jeśli nie musisz znajdować najkrótszej ścieżki, żadna komórka na ścieżce (ścieżka nie włączając marlina ani nemo) nie może przylegać do więcej niż dwóch innych komórek na ścieżce.
- Ścieżka nie powinna przechodzić przez kafelki
marlin
lubnemo
, ponieważ wówczas mylą małe ryby przy wyborze kierunku. - Jak zwykle, możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższy odpowiednik), argument wiersza poleceń lub parametr funkcji i generując dane wyjściowe przez STDOUT (lub najbliższy odpowiednik), zwracaną wartość lub parametr funkcji (wyjściowej).
- Jeśli wprowadzanie wielu wierszy nie jest możliwe, możesz założyć, że do siatki dołącza
|
znak zamiast\n
. Możesz również wziąć dane wejściowe jako tablicę wierszy siatki.
To jest kod golfowy, więc wygrywa najkrótszy wpis w bajtach.
źródło
k
powyższyl
marlin? (droga odOdpowiedzi:
Matlab 560
560 bajtów podczas usuwania wszystkich niepotrzebnych spacji, wszystkich średników i wszystkich komentarzy. Można grać w golfa o wiele więcej, ale jestem teraz zmęczony (może jutro ...) Dobranoc wszystkim.
PS: Zakładałem, że ścieżka musi mieć 4 sąsiedztwo („+”).
Funkcja wywoływania: (nowe linie nie są konieczne)
Wynik:
Jak to działa
Wyodrębnianie nazw
Pierwszą częścią jest wyodrębnienie nazw np.
nemo
, Które wykonuje funkcjaq()
. Funkcja najpierw oznacza wszystko jako 0, następnie występuje pierwsza litera nazwy jako1
, a następnie druga litera,2
jakby1
w sąsiedztwie była, a następnie trzecia i tak dalej. Potem powinnonemo
być tylko jedno4
. Od tego cofamy się, aż odnajdujemy1
ponownie, a następnie usuwamy wszystkie inne liczby, które były większe, więc otrzymujemy ładną maskę, w której literynemo
są zamaskowane. Robimy to dla wszystkich trzech nazw, a następnie możemy przejść do znalezienia ścieżki.Znalezienie ścieżki
Zaczynamy od pozycji Marlinsa i krok po kroku wysyłamy falę uderzeniową przez „obraz” dziury. Na każdym kroku zwiększamy licznik odległości i zaznaczamy „piksele” pod falą bieżącą odległością. (Jak to zwykle się dzieje z algorytmami najkrótszej ścieżki.) Ten front fali oczywiście zostaje zablokowany przez obszar Bruce'a, dlatego będzie go otaczał. Ten krok powtarza się, aż zostanie osiągnięta górna granica. Ta (co prawda bardzo luźna) górna granica stanowi teraz obwód „obrazu” (w każdym razie najkrótsze ścieżki będą o wiele krótsze). W przypadku testowym wygląda to tak:
Teraz zacznij od
nemo
pikseli i zmniejszaj licznik odległości na każdym kroku i dodaj do ścieżki sąsiada o następnej niższej odległości (zgodnie z obliczoną wcześniej mapą odległości).źródło
Python 2 - 658
Bardzo bardzo nieefektywny zarówno pod względem czasu, jak i pamięci. Funkcją identyfikującą wzorce jest funkcja rekurencyjna S, a funkcją znajdowania ścieżek jest C, co jest w zasadzie strasznie nieefektywną implementacją A *.
Do testowania użyj tego (bardzo nieznacznie) mniej golfowego (który zamiast tego oblicza ścieżkę raz dla każdego kafelka)
źródło