Il labirinto della freccia fugge


14

Domanda

Hai un array di 50 per 50 caratteri. Ogni cella ha una freccia che punta in una delle quattro direzioni. Nessuna cella è vuota. Quando si entra in una cella, è necessario uscire nella direzione specificata dalla freccia. La freccia può anche puntare nella stessa direzione da cui provieni, causando un vicolo cieco.

Puoi iniziare da qualsiasi cella sul bordo più esterno del labirinto e trovare un percorso che ti porta nel labirinto e ti fa uscire in un'altra cella. L'input verrà dato come un array contenente <,>, ^ e v. L'output sarà una singola cifra (booleano, intero o carattere, qualsiasi cosa farà) come 0 (che indica che l'attività è impossibile) o 1 (che indica che si ha raggiunto il compito).

Esempio (l'array effettivo sarà più grande di questo)

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

L'output sarà

1
come puoi accedere da <a destra, il che ti farà uscire dalla v inferiore dal percorso "<v v"

Il compito è scrivere il codice più breve possibile che riceverà il labirinto come input e determinare dove esiste un percorso come specificato nelle regole e produrre una singola cifra 0 o 1

È consentita anche l'output TRUE e FALSE anziché le cifre effettive.


6
Sarebbe bello avere alcuni casi di test reali con cui lavorare
Liam

L'input è un array monodimensionale o bidimensionale? E puoi inserire a destra solo con un <oppure puoi anche inserire con un ^?
Bob

@bobbel L'input può essere dato come un array 1 o 2 dimensionale, a seconda di quale sia necessario per un codice più breve. Anche le frecce possono essere inserite come 1 2 3 4 anziché <> ^ v se ciò può abbreviare il codice. E sì, puoi inserire anche tramite ^.
ghosts_in_the_code

1
La probabilità che un array casuale, 50 per 50, non disponga di una soluzione è solo di circa 0. Sarebbe meglio se fosse richiesto che la soluzione avesse almeno un certo numero di passaggi o che l'utente avesse specificato il percorso della soluzione.
David C

1
Questo avrebbe dovuto essere chiamato "Una fuga di frecce" ... Ancora meditando su una soluzione.
bicchiere

Risposte:


6

CJam, 89 81 byte

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

Provalo online nell'interprete CJam .

Come funziona

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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.