Twoje życie może zależeć od tego. Nie mrugaj. Nawet nie mrugaj. Mrugnij i nie żyjesz. Oni są szybcy. Szybciej niż możesz w to uwierzyć. Nie odwracaj się, nie odwracaj wzroku i nie mrugaj! Powodzenia.
Płaczące anioły to obca rasa, która nie może się poruszać, gdy jest obserwowana przez inną istotę (nawet innego anioła). Karmią się, wysyłając swoje ofiary z powrotem w czasie. Ty ( Doktor ) jesteś uwięziony w pokoju z niektórymi i musisz dostać się do swojego TARDIS.
Zadanie
Napisz program, który, biorąc pod uwagę reprezentację ASCII prostokątnego pokoju, wygeneruje ścieżkę, która doprowadzi cię do bezpieczeństwa. Jeśli jakikolwiek Anioł może zaatakować - w dowolnym momencie podczas postępu - ścieżka ta nie jest bezpieczna. Anioł może zaatakować, jeśli może cię zobaczyć, gdy nie jesteś widziany przez ciebie ani innego anioła.
Wejście
Wejście składa się z dwóch części. Po pierwsze, kierunek, w którym jesteś zwrócony (NSEW). Następnie na kolejnych liniach reprezentacja pokoju, pokazująca początkowe / końcowe lokalizacje oraz lokalizację / oblicze wszystkich Aniołów.
Poniższy przykład pokazuje, że jest jeden anioł skierowany na zachód, a ty zaczynasz patrzeć na południe.
S
..........
....D.....
..........
..........
..........
..........
..........
..........
.........W
..........
...T......
.
- Pusta przestrzeńD
- Doktor (pozycja początkowa)T
- TARDIS (pozycja końcowa)N,S,E,W
- Anioł skierowany w określonym kierunku (północ, południe, wschód, zachód)
Linia wzroku
Możesz zobaczyć dowolną przestrzeń z kątem 45 stopni w kierunku, w którym patrzysz. Linia wzroku jest zasłonięta, jeśli na bezpośredniej poziomej, pionowej lub 45-stopniowej przekątnej znajduje się inny byt. Każda inna przekątna nie zasłania widoku. Linia wzroku aniołów działa w ten sam sposób. Na przykład poniżej -
przedstawia twoje pole widzenia, zakładając, że patrzysz na południe.
........
...D....
..---...
.-----..
-------.
---N----
---.--N-
---.----
Wynik
Dane wyjściowe to ciąg znaków reprezentujący ścieżkę, którą przejdziesz do wyjścia. Jeśli istnieje wiele bezpiecznych ścieżek, wybierz dowolną. Jeśli żadna ścieżka nie jest bezpieczna, wyjście 0
. Jeśli mapa jest zniekształcona, rób co chcesz, włączając awarię. Uważaj, że jest zniekształcony, jeśli pokój nie jest prostokątny, nie ma wyjścia itp. Jeśli nie ma Aniołów, nie jest zniekształcony, po prostu łatwe.
Dla każdego kroku możesz zrobić jedną z dwóch rzeczy: przesuwać się w kierunku NSEW lub skręcać w kierunku NSEW (bez zmiany pozycji). Aby się poruszać, po prostu wypisz literę dla tego kierunku. Aby obrócić się w stronę kierunku, F
wydrukuj odpowiednią literę. Na przykład następujące dane wyjściowe:
SSFESSSSSSSW
jest bezpieczną ścieżką dla próbki podanej w sekcji wprowadzania. Poruszasz się dwa razy na południe, twarzą na wschód, aby mieć anioła w zasięgu wzroku, a następnie siedem razy na południe i raz na zachód, aby wejść do TARDIS.
Przypadki testowe
1) Możesz okrążyć wschodniego anioła, aby dostać się do TARDIS. Jeśli nie przejdziesz bezpośrednio między nimi, zablokują się one na swoim miejscu, więc nie ma znaczenia, w którą stronę patrzysz w dowolnym momencie.
W
...D....
........
........
........
.E.....W
........
........
...T....
2) Przegrywasz. Nie da się ich ominąć. Widzą się, dopóki nie przejdziesz między nimi. W tym momencie nie możesz stawić im czoła i gotowe. Równie dobrze może po prostu zamknąć oczy i skończyć z tym.
S
...D....
........
........
........
E......W
........
........
...T....
Zwycięski
Obowiązują standardowe zasady gry w golfa i luki , wygrywa najmniej bajtów. Postaram się wkrótce uzyskać więcej przypadków testowych, ale w międzyczasie możesz zaproponować własne.
Zdjęcie i cytat z Doctor Who.
J
).Odpowiedzi:
Python -
559 565 644633Dane wejściowe należy podać w następujący sposób:
Zasadniczo jest to podejście stosowane do znajdowania wszystkich stanów (pozycji i kierunku), do których Doktor może bezpiecznie dotrzeć, zapamiętywania, jak się tam dostał i drukowania drogi w przypadku sukcesu. Pozycje i kierunki są realizowane za pomocą liczb zespolonych.
Prawdopodobnie mógłbym uratować niektóre znaki przy użyciu arytmetyki liczb zespolonych Sage'a, ale trwałoby to bardzo długo.
Najpierw pomyślałem, że mogę uratować sześć postaci, każąc Doktorowi skręcić w określonym kierunku po dotarciu do Tardis, ale zdałem sobie sprawę, że może to doprowadzić do złych rozwiązań. Również najpierw źle odczytałem zasady.
Oto wersja w większości nie golfowa:
Przypadki testowe
Przypadek testowy 1:
Przypadek testowy 2:
Przypadek testowy VisualMelon:
źródło
C #
17712034196218871347 bajtówPonownie napisałem blokujące sprawdzanie LOS w 1 pętli, dzięki czemu jest dużo bardziej uporządkowane i około 450 bajtów krótsze
Jest to kompletny program, który oczekuje, że dane wejściowe zakończą się EOF i zostaną przekazane do STDIN. (Miejmy nadzieję) wypisuje najkrótszą ścieżkę do TARDIS, lub „0”, jeśli ścieżka nie istnieje. Używa tandetnego Wyszukiwania szerokości, aby podążać wszystkimi możliwymi trasami, a następnie cofa się z TARDIS do Doktora, aby zebrać dane wyjściowe.
Sformatowany kod:
Wyjście na przykład dane wejściowe
Dane wyjściowe dla przypadku testowego 1)
Dane wyjściowe dla przypadku testowego 2)
Na żądanie przedstawiam nowy przypadek testowy:
Mój program generuje
Przypadek testowy 1 WozzeC:
Przypadek testowy 2 WozzeC:
źródło
C #
1454, 1396, 1373, 13031279Dobrze. Postanowiłem więc spróbować, a chłopak zajął trochę czasu. Jest zbudowany głównie za pomocą operatorów logicznych.
Aby uniknąć konieczności sprawdzania wartości Null itp., Postanowiłem użyć pola [MAX_SIZE * 3] * [MAX_SIZE] * 3 i umieściłem planszę blisko środka.
Sprawdzanie pętli jest wykonywane wewnątrz i na zewnątrz do 50 (MAX_SIZE). Więc coś takiego:
Kiedy zostanie znaleziony EWS lub N, robię to samo z ich strony. Jeśli coś zostanie znalezione patrząc na Anioły (nie Doktora), zwracają 15 jako wolne przejście. Jeśli nie zostaną na nie popatrzeni, wracają, w którą stronę Lekarz powinien być bezpieczny. tzn. N zwróci 2 na południe. Chyba że jest to NW lub NE, w którym to przypadku zwróci odpowiednio 6 (2 + 4) i 10 (2 + 8).
Jeśli dwa anioły obserwują Doktora, zwracane przez nie wartości byłyby „AND”, więc w przykładzie testowym 2 crunchpozycje 4 i 8 zmieniłyby się w 0. Oznacza to, że pozycja jest zła i należy jej unikać.
Rozszerzony kod:
Wyniki testu
1 Przykład: FNSSSWNNNWSSSWSSSSENNESES
2 Przykład: Nie ma wyjścia
Przykład VisualMelon: FNSSSSSSSWNNNNNNNWSSSSSSSSSEEEE
Mój przypadek testowy 1: FSSENEEEFWSSFNSWWN
Mój przypadek testowy 2: FSEEEESFWSSSSFNWWWWNFENNFSEES
Jak widać, mój Doktor uwielbia włóczyć się po okolicy, aby pokazać Aniołom, jak fajnie jest się poruszać. Mogę sprawić, że oprogramowanie znajdzie najkrótszą ścieżkę, ale zajmuje to więcej czasu i potrzebuje więcej kodu.
Testy dla was
Inny:
źródło
using S=System.Console;
, lub możesz po prostu usunąć S z kodu i zaoszczędzić 6 bajtówusing System
. Teraz będę musiał spróbować trochę przyciąć moje naiwne podejście ...;)