Ucieczka labirynt strzał

14

Pytanie

Masz tablicę 50 na 50 znaków. Każda komórka ma strzałkę skierowaną w jednym z czterech kierunków. Żadna komórka nie jest pusta. Po wejściu do komórki musisz wyjść z niej w kierunku wskazanym przez strzałkę. Strzała może również wskazywać w tym samym kierunku, z którego przybyłeś, powodując ślepy zaułek.

Możesz zacząć od dowolnej komórki na najbardziej zewnętrznej granicy labiryntu i znaleźć ścieżkę, która zaprowadzi cię do labiryntu i spowoduje wyjście z innej komórki. Dane wejściowe będą podawane jako tablica zawierająca <,>, ^ i v. Dane wyjściowe będą jednocyfrowe (wartość logiczna, liczba całkowita lub znak, cokolwiek zrobi) jako 0 (wskazując, że zadanie jest niemożliwe) lub 1 (wskazując, że masz zrealizowane zadanie).

Przykład (rzeczywista tablica będzie większa od tej)

^ v < >
> < v <
v > v ^

Wyjście będzie

1
jak możesz wejść od <po prawej stronie, co spowoduje wyjście z dolnej części v ścieżką „<v v”

Zadanie polega na napisaniu jak najkrótszego kodu, który otrzyma labirynt jako dane wejściowe, i ustaleniu, gdzie istnieje ścieżka, jak określono w regułach i wygenerowaniu pojedynczej cyfry 0 lub 1

Dozwolone jest również wyświetlanie wartości PRAWDA i FAŁSZ zamiast rzeczywistych cyfr.

ghosts_in_the_code
źródło
6
Byłoby miło mieć kilka rzeczywistych przypadków testowych do pracy
Liam
Czy dane wejściowe to tablica jednowymiarowa czy dwuwymiarowa? I czy możesz wpisać tylko po prawej stronie <lub czy możesz także wpisać ^?
bobbel
@ Bobbel Dane wejściowe można podać w postaci 1 lub 2-wymiarowej tablicy, w zależności od tego, co jest wymagane w przypadku krótszego kodu. Nawet strzałki można wprowadzić jako 1 2 3 4 zamiast <> ^ v, jeśli może to skrócić kod. I tak, możesz wejść również przez ^.
ghosts_in_the_code
1
Prawdopodobieństwo, że losowa tablica 50 na 50 nie będzie miała rozwiązania, wynosi tylko około 0. Lepiej byłoby, gdyby wymagało, aby rozwiązanie miało co najmniej określoną liczbę kroków lub aby użytkownik określił ścieżkę rozwiązania.
DavidC
1
Powinno to być nazwane „ucieczką od strzały” ... Wciąż zastanawiam się nad rozwiązaniem.
zlewka

Odpowiedzi:

6

CJam, 89 81 bajtów

q~"><v^":A2/{f{\*}z}/sA[1W52-52]er:T,,{[52md]51f%0e=1=},:E{[2704{__T=+}*]\-E&},,g

Wypróbuj online w interpretatorze CJam .

Jak to działa

q~        e# Read and evaluate all input. This pushes an array of strings.
"><v^":A  e# Push that string and save it in A.
2/        e# Split it into ["><" "v^"].
{         e# For each chunk:
  f{      e#   For each input string, push the string and the chunk; then:
    \*    e#     Join the chunk, using the string as separator.
  }       e#
  z       e#   Transpose rows and columns.
}/        e#
s         e# Flatten the resulting array of strings.
A         e# Push "><v^".
[1W52-52] e# Push [1 -1 52 -52].
er        e# Perform transliteration.
:T        e# Save the result in T.
,,        e# Push [0 ... 2703].
{         e# Filter; for each integer I in [0 ... 2703]:
  [52md]  e#   Push [I/52 I%52].
  51f%    e#   Take both integers modulo 51 to map 51 to 0.
  0e=     e#   Count the number of resulting zeroes.
  1=      e#   Check if the count is 1.
},        e# If it is, keep I.
:E        e# Save the filtered array in E.
{         e# For each integer I in E:
  [2704{  e#   Do 2704 times:
    __    e#     Push two copies of the integer on the stack.
    T=    e#     Select the corresponding element from T.
    +     e#     Add it to the first copy.
  }*]     e#   Collect all results in an array.
  \-      e#   Remove I from that array.
  E&      e#   Intersect with E.
},        e# If the intersection is non-empty, keep the integer.
,g        e# Push the sign of the length of the filtered array.
Dennis
źródło