L'évasion du labyrinthe de flèches

14

Question

Vous disposez d'un tableau de 50 par 50 caractères. Chaque cellule a une flèche pointant dans l'une des quatre directions. Aucune cellule n'est vide. En entrant dans une cellule, vous devez la quitter dans le sens indiqué par la flèche. La flèche peut également pointer dans la même direction que vous, d'où une impasse.

Vous pouvez commencer à partir de n'importe quelle cellule sur la bordure la plus à l'extérieur du labyrinthe et trouver un chemin qui vous emmène dans le labyrinthe et vous amène à sortir dans une autre cellule. L'entrée sera donnée sous forme de tableau contenant <,>, ^ et v. La sortie sera un seul chiffre (booléen, entier ou caractère, n'importe quoi fera) comme 0 (indiquant que la tâche est impossible) ou 1 (indiquant que vous avez accompli la tâche).

Exemple (le tableau réel sera plus grand que cela)

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

La sortie sera

1
comme vous pouvez entrer par le <à droite, ce qui vous fera sortir du bas v par le chemin "<v v"

La tâche consiste à écrire le code le plus court possible qui recevra le labyrinthe en entrée, à déterminer où il existe un chemin d'accès comme spécifié dans les règles et à sortir un seul chiffre 0 ou 1

La sortie TRUE et FALSE au lieu des chiffres réels est également autorisée.

ghosts_in_the_code
la source
6
Ce serait bien d'avoir des cas de test réels avec
lesquels
L'entrée est-elle un tableau unidimensionnel ou bidimensionnel? Et pouvez-vous entrer uniquement à droite par un <ou pouvez-vous également entrer par un ^?
bobbel
@bobbel L'entrée peut être donnée sous la forme d'un tableau à 1 ou 2 dimensions, selon ce qui est requis pour un code plus court. Même les flèches peuvent être saisies comme 1 2 3 4 au lieu de <> ^ v si cela peut raccourcir le code. Et oui, vous pouvez également entrer via le ^.
ghosts_in_the_code
1
La probabilité qu'un tableau aléatoire, 50 par 50, n'ait pas de solution est d'environ 0. Il serait préférable que vous exigiez que la solution ait au moins un certain nombre d'étapes ou que l'utilisateur spécifie le chemin de la solution.
DavidC
1
Cela aurait dû être appelé "Une échappée de flèche" ... Réfléchissant toujours à une solution.
bécher

Réponses:

6

CJam, 89 81 octets

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

Essayez-le en ligne dans l' interpréteur CJam .

Comment ça fonctionne

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
la source