Wprowadzenie
Rodzina fok utknęła na górze lodowej w kole podbiegunowym. Na górze lodowej znajduje się nadajnik radiowy, za pomocą którego foki mogą wezwać pomoc. Jednak tylko pieczęć tatusia wie, jak obsługiwać nadajnik radiowy. Co gorsza, lód jest bardzo śliski o tej porze roku, więc foki będą ślizgały się w sposób niekontrolowany, dopóki nie uderzą w kolejną pieczęć lub ześlizgną się z krawędzi góry lodowej, co utrudnia tatusiowi dotarcie do nadajnika radiowego. Na szczęście jedna z pieczęci jest informatykiem, więc postanawia napisać program, aby dowiedzieć się, jak manewrować pieczęcią tatusia do nadajnika radiowego. Ponieważ na lodzie nie ma dużo miejsca na napisanie programu, postanawia sprawić, by program używał jak najmniej bajtów.
Opis wejścia
Program pieczęci pobiera dane wejściowe z STDIN, argumenty wiersza poleceń lub funkcje wprowadzania danych przez użytkownika (takie jak raw_input()
). Nie można go zainicjować w zmiennej (np. „Ten program oczekuje danych wejściowych w zmiennej x
”).
Pierwszy wiersz danych wejściowych składa się z dwóch liczb całkowitych oddzielonych przecinkiem w formularzu
A,B
Poniżej znajdują się B
wiersze składające się ze A
znaków. Każda linia może zawierać tylko znaki spośród następujących:
.
: Zimno, zimno, ocean. Mapa zawsze będzie miała tę granicę.#
: Część góry lodowej.a
...z
: Pieczęć, która nie jest tatusiem na górze lodowej.D
: Foka tatusia na górze lodowej.*
: Nadajnik radiowy.
(Pamiętaj, że pieczęć tatusia jest zawsze oznaczona wielką D
literą. Mała litera d
jest po prostu zwykłą pieczęcią).
Opis wyjścia
Zgodnie z następującymi zasadami dotyczącymi sposobu przemieszczania się pieczęci, wypisz listę instrukcji dla pieczęci, w jaki sposób powinny się one poruszać, aby dostać pieczęć tatusia do nadajnika radiowego.
- Reguła: Wszystkie pieczęcie mogą poruszać się w górę (
U
), w dół (D
), w lewo (L
) i w prawo (R
). Nie mogą się przesuwać po przekątnej. - Reguła: Podczas ruchu pieczęć będzie się poruszać w tym samym kierunku, aż zderzy się z inną pieczęcią lub wpadnie do morza.
- Jeśli pieczęć zderzy się z inną pieczęcią, przestanie się poruszać. Pieczęć, z którą zderzył się, nie będzie się poruszać.
- Jeśli foka wpadnie do morza, utonie i zniknie z mapy. Oznacza to, że nie działa on jako zderzacz dla innych pieczęci i nie można go ponownie przenieść.
- Reguła: Dwie pieczęcie nie mogą się poruszać w tym samym czasie, nie można też przesunąć pieczęci, gdy inna jest w ruchu. Następną pieczęć można przenieść dopiero, gdy poprzednia pieczęć przestanie się poruszać.
- Reguła: Nie ma ograniczeń dotyczących wielokrotnego przenoszenia pieczęci lub liczby tonących pieczęci.
- Reguła: Prawidłowe rozwiązanie będzie miało koniec pieczęci na nadajniku radiowym. Tatuś nie może po prostu przejść nadajnika podczas przesuwania.
Wynik będzie składał się z kilku wierszy, każdy w formie
A,B
Gdzie A
jest uszczelka przenieść ( D
dla tatusia uszczelki, a
... z
dla innych), i B
jest to kierunek, aby przesunąć uszczelkę (albo U
, D
, L
, lub R
). Pamiętaj, że nie musisz znajdować najkrótszej trasy. Każda droga, która prowadzi pieczęć tatusia do celu, jest akceptowalnym wyjściem.
Przykładowe wejścia i wyjścia
Wejście:
25,5
.........................
.#######################.
.####D#############*k###.
.#######################.
.........................
Wynik:
D,R
Wejście:
9,7
.........
.a#####b.
.#####d#.
.##l*###.
.###m#p#.
.#D#.#c#.
.........
Wyjście (jedno możliwe wyjście z wielu):
m,R
b,L
D,U
D,R
D,D
D,L
Wejście:
26,5
..........................
.###..................###.
.l*##########v#########D#.
.###..................###.
..........................
Wyjście (jedno możliwe wyjście z wielu):
v,D
D,L
Jeśli masz inne pytania, zadaj je w komentarzach.
Odpowiedzi:
Python 3, 520 bajtów
Bardziej szczegółowe wyjaśnienie mogę zrobić później, jeśli ludzie tego chcą, ale w zasadzie uruchamia to wyszukiwanie w pierwszej kolejności z iteracyjnym pogłębianiem w przestrzeni stanów możliwych ruchów. Jeśli ruch powoduje odpadnięcie pieczęci tatusia, jest on natychmiast odrzucany. Jeśli tata kończy się obok nadajnika, sekwencja ruchów jest drukowana, a program dzieli się przez zero, aby wymusić wyjście.
Mogę sprawić, że kod będzie działał znacznie szybciej, dodając
if G!=g:
na początku drugiego ostatniego wiersza dla 8 dodatkowych bajtów - to odrzuca ruchy, które niczego nie zmieniają, na przykładk,L
w pierwszym przypadku testowym.Środowisko wykonawcze różni się zauważalnie w zależności od przebiegu, nawet przy tych samych danych wejściowych - najwyraźniej wynika to z faktu, że wybieram następną pieczęć, aby przejść przez iterację nad
set
nieuporządkowanym typem. Drugą skrzynkę testową wyregulowałem na 5 minut i 30 sekund, chociaż nie wydawało mi się, że przy pierwszym uruchomieniu tak długo to trwało. Przy wspomnianej wyżej optymalizacji, to więcej niż 40 sekund.źródło
JavaScript (ES6) 322
334 323Edycja2 Dodano animację we fragmencie
Edytuj poprawkę, zapamiętaj początkową pozycję „*”, więc znajduję ją nawet wtedy, gdy pieczęć zsuwa się na nią i kasuje.
Zaimplementowano jako funkcję z ciągiem wejściowym jako parametrem (prawdopodobnie niepoprawnym, ale czekającym na wyjaśnienie). Wyjście przez wyskakujące okienko.
Problem z wprowadzaniem ciągów wielowierszowych w JavaScript polega na tym,
prompt
że nie radzi sobie z tym dobrze.Co do algorytmu: BFS, powinien znaleźć optymalne rozwiązanie. Trzymam kolejkę statusu gry w zmiennej
l
, status jest oparty na siatce postacig
i sekwencji ruchóws
. Poza tym istnieje zestaw siatek uzyskanych do tej pory w zmiennejk
, aby uniknąć eksploracji tej samej siatki raz za razem.Główna pętla to
Uruchom Snippet, aby przetestować w FireFox
Pokaż fragment kodu
źródło
C ++, 628 bajtów
Cóż, nie okazało się to bardzo krótko:
Wybrałem C ++, ponieważ chciałem użyć struktur danych (
set
,string
), ale z natury jest dość gadatliwy. Rozwiązanie dość dobrze radzi sobie z wydajnością, rozwiązując test 2 w nieco ponad 2 sekundy na MacBooku Pro, nawet jeśli nie jest zoptymalizowany pod kątem czasu działania.Kod, zanim zaczniesz eliminować białe znaki i niektóre inne skróty długości:
Podstawową ideą algorytmu jest utrzymanie dwóch zestawów:
q
to zestaw konfiguracji oczekujących na przetworzenie.p
to zestaw przetworzonych konfiguracji.Algorytm rozpoczyna się od początkowej konfiguracji w
q
. Na każdym etapie tworzona jest konfiguracjaq
, dodawanap
, generowane są wszystkie możliwe ruchy uszczelnienia, a powstałe nowe konfiguracje wstawianeq
.Testowe uruchomienie:
źródło
q
byłoby z pewnością lepsze pod tym względem. Powodem, dla którego użyłem zestawu było to, że chciałem uniknąć wielokrotnego wpisywania tego samego wpisu. Ale zacząłem się zastanawiać, kiedy zobaczyłem wynik.