Jesteś podróżnikiem przemierzającym pustynię między dwoma miastami. Nie możesz nosić wystarczającej ilości wody, aby przejść bez zatrzymywania się. To odmiana klasycznej układanki.
Zasady
Pustynia wygląda tak: siatka WxH składająca się głównie z pustej przestrzeni. Oznaczone miejsce S
to miejsce, w którym zaczynasz, E
to miejsce, w którym chcesz zakończyć, a kwadrat oznaczony liczbą N zawiera N jednostek wody. Kwadraty oznaczone .
zatrzymaną wodą.
.....................................
........S............................
.....................................
.........7...........................
.....................................
.......................3.............
.....5...............................
................................2....
.....................................
.....................................
.....................................
...............................E.....
.....................................
....................7................
.....................................
.....................................
Zaczynasz w S z 5 jednostkami wody.
Możesz nosić maksymalnie 5 jednostek wody.
Każda kolej
- przesuń o jedno pole w górę, w dół, w lewo lub w prawo,
- zużyj 1 jednostkę wody, którą nosisz,
- podnieś lub upuść pewną liczbę jednostek wody.
Obrót jest zanotowana w ten sposób: (direction)(+|-)(units of water)
, +
wskazuje jesteś podnoszenia wody, -
które spadają go.
Przykładowe zwroty:
D+0 Move Down
R+0 Move Right
D+2 Move Down, pick up two units of water.
U-1 Move Up, drop one unit of water.
Jeśli wykonasz te ruchy, zaczynając od litery S w powyższym przykładzie, pustynia będzie wyglądać później.
.....................................
........S............................
.........1...........................
.........5...........................
.....................................
.......................3.............
.....5...............................
................................2....
.....................................
.....................................
.....................................
...............................E.....
.....................................
....................7................
.....................................
.....................................
Nie możesz zebrać więcej wody niż jest na twoim placu. Kiedy podnosisz wodę, odejmij tę liczbę jednostek od liczby płytek.
Możesz zbierać wodę, aby pomieścić maksymalnie 5 jednostek.
Żaden żeton nie może pomieścić więcej niż 9 jednostek, z wyjątkiem S, która zawiera jednostki nieskończoności.
Możesz upuścić tylko tyle wody, ile aktualnie trzymasz.
Woda na ziemi pozostaje niezmieniona, dopóki nie podniesiesz jej ponownie.
Jeśli wrócisz do S, możesz zebrać dowolną ilość wody bez jej wyczerpywania.
Jeśli osiągniesz E, wtedy wygrasz . Nadal wygrywasz, jeśli spożyjesz ostatnią jednostkę wody na E.
Jeśli po swojej turze masz zero wody i nie jesteś na E, umierasz .
Wejście i wyjście
Twój program otrzyma mapę początkową o dowolnym rozmiarze STDIN
jako grafikę ASCII w powyższym formacie. Możesz założyć, że jest prostokątny, tzn. Wszystkie linie mają tę samą długość, że jest dokładnie jeden S
i jeden E
kwadrat, wszystkie linie są zakończone \n
, a cały STDIN będzie zgodny z tym wyrażeniem regularnym:/^[SE1-9\.\n]+$/
Twój program zapisze następujące dane wyjściowe do STDOUT:
- lista ruchów,
- ostateczny stan mapy.
Możesz wypisać listę ruchów w dowolnym dogodnym formacie.
Ostateczny stan mapy zostanie wydrukowany w tym samym formacie co dane wejściowe, z tym wyjątkiem, że dodatkowo pokaże trasę, którą przeszedłeś przez pustynię , zaznaczając wszystkie odwiedzane kafelki symbolem #
, jeśli ten kafelek nie zawiera wody i nie jest S ani E (tj. to jest .
).
PRZYKŁADOWE wejście:
.....S.
.......
.......
E......
....8..
PRZYKŁAD zwycięska produkcja:
D+0
D+0
D+0
D+0
L+5
L+0
L+0
L+0
L+0
U+0
.....S.
.....#.
.....#.
E....#.
####3#.
Nietrywialność
Po opublikowaniu kodu opublikuj przykładowe dane wejściowe mapy, dla których Twój kod znajdzie rozwiązanie, które spełnia następujące warunki nietrywialności:
- S i E są oddalone o co najmniej 10 ruchów.
- Każdy kwadrat, który początkowo zawiera N jednostek wody, musi być otoczony ramką o szerokości N, w której znajdują się wszystkie kwadraty
.
(bez wody, nie S lub E)
PRZYKŁAD
........2.
..........
..........
S.1..2....
..........
..........
........1.
..3.......
.........E
Jeśli zwiększysz ilość wody na dowolnym kafelku, powyższe stanie się banalne.
Wymagania
Prawdopodobnie twój program napotka szereg nieudanych prób, zanim znajdzie rozwiązanie, jeśli w ogóle.
- Twój program musi ostatecznie rozwiązać wszelkie możliwe do rozwiązania dane wejściowe.
- Chcę patrzeć, jak umierasz - twój program wyświetli ruchy i ostateczną mapę trasy na śmierć za każdą nieudaną próbę znalezienia rozwiązania.
- Jeśli napotkasz zwycięskie rozwiązanie, wydrukuj dla niego pełne wyjście i zakończ.
- Biegaj, aż znajdziesz rozwiązanie, ale nie próbuj dwukrotnie tego samego rozwiązania - wszystkie zgony powinny odbywać się różnymi drogami.
- Użyj tego wejścia testowego:
(wymaga co najmniej jednego ruchu, aby upuścić bufor wody w pewnym punkcie środkowym).
S........
.........
.........
........E
Najkrótszy kod, który jest opublikowany z nietrywialnym wejściem demonstracyjnym, który rozwiązuje, wygrywa.