Das Pfeillabyrinth entkommt

14

Frage

Sie haben ein Array mit 50 mal 50 Zeichen. Jede Zelle hat einen Pfeil, der in eine von vier Richtungen zeigt. Keine Zelle ist leer. Wenn Sie eine Zelle betreten, müssen Sie sie in der durch den Pfeil angegebenen Richtung verlassen. Der Pfeil kann auch in dieselbe Richtung zeigen, aus der Sie gekommen sind, was zu einer Sackgasse führt.

Sie können an einer beliebigen Zelle am äußersten Rand des Labyrinths beginnen und einen Pfad finden, der Sie in das Labyrinth führt und Sie dazu veranlasst, an einer anderen Zelle auszusteigen. Die Eingabe erfolgt als Array mit <,>, ^ und v. Die Ausgabe erfolgt als einzelne Ziffer (Boolesch, Ganzzahl oder Zeichen, alles ist möglich) mit 0 (was anzeigt, dass die Aufgabe nicht möglich ist) oder 1 (was anzeigt, dass Sie es haben) Aufgabe erfüllt).

Beispiel (tatsächliches Array wird größer sein)

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

Ausgabe wird sein

1
wie Sie von der <auf der rechten Seite eingeben können, was dazu führt, dass Sie die untere v durch den Pfad "<v v" verlassen.

Die Aufgabe besteht darin, den kürzestmöglichen Code zu schreiben, der das Labyrinth als Eingabe empfängt, und zu bestimmen, wo ein Pfad darin vorhanden ist, wie in den Regeln angegeben, und eine einzelne Ziffer 0 oder 1 auszugeben

Die Ausgabe von TRUE und FALSE anstelle der tatsächlichen Ziffern ist ebenfalls zulässig.

ghosts_in_the_code
quelle
6
Es wäre schön, einige aktuelle Testfälle zur Verfügung zu haben
Liam
Ist die Eingabe ein eindimensionales Array oder ein zweidimensionales? Und können Sie nur rechts mit einem <oder auch mit einem ^ eingeben?
Bobbel
@bobbel Die Eingabe kann als 1- oder 2-dimensionales Array erfolgen, je nachdem, was für einen kürzeren Code erforderlich ist. Sogar Pfeile können als 1 2 3 4 anstelle von <> ^ v eingegeben werden, wenn dies den Code verkürzen kann. Und ja, Sie können über das ^ auch eingeben.
ghosts_in_the_code
1
Die Wahrscheinlichkeit, dass ein zufälliges Array mit einer Größe von 50 mal 50 keine Lösung hat, beträgt nur etwa 0. Es ist besser, wenn die Lösung mindestens eine bestimmte Anzahl von Schritten enthält oder der Benutzer den Lösungspfad angibt.
DavidC
1
Dies hätte "Pfeilflucht" heißen sollen ... Ich überlege immer noch eine Lösung.
Becher

Antworten:

6

CJam, 89 81 Bytes

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

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

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
quelle