Das Ziel dieser Herausforderung ist es, die Richtung und das Gebiet zu finden, die von einer Schleife umschlossen sind.
Eingang:
Ein rechteckiges Raster, das ausschließlich aus folgenden Zeichen besteht: ^v<>
(Optional können Sie auch die Abmessungen des Rasters vor dem Raster selbst als Dezimalzahl mit einem Präfix, Suffix und Trennzeichen Ihrer Wahl angeben.)
Eine Schleife im Raster ist eine Menge der oben genannten Zeichen, sodass eines zum nächsten zeigt, auf das nächste zeigt und schließlich auf das erste Zeichen zurück zeigt. Beispielsweise:
<>>v> >>v
^^<>v ^ >v
>^<<< ^<<<
>^<v>
Das linke Gitter ist die Beispieleingabe. das rechte Gitter ist die Schleife isoliert.
Das Eingabegitter enthält entweder überhaupt keine oder nur eine Schleife. Sie müssen sich keine Sorgen machen, wenn das Raster mehr als eine Schleife enthält.
Ausgabe:
Wenn das Raster keine Schleife enthält, wird ausgegeben X
.
Wenn das Raster zwei aufeinander zeigende Pfeile enthält, wird ausgegeben 0
.
Wenn das Raster eine Schleife gegen den Uhrzeigersinn enthält, zählen Sie die von der Schleife eingeschlossenen Zeichen einschließlich des Rahmens. Gib diese Nummer aus.
Wenn das Raster eine Schleife im Uhrzeigersinn enthält, befolgen Sie den gleichen Vorgang für die Schleife gegen den Uhrzeigersinn, geben Sie jedoch das Negativ dieser Zahl aus. Zum Beispiel würde das obige Eingaberaster eine Ausgabe von -11
: 10 von der Schleife selbst und 1 von dem von der Schleife eingeschlossenen Zeichen haben.
Das ist Code-Golf . Kürzester Code gewinnt.
Testfälle:
<<^
^>v
^v<
Ausgabe X
.
<<<<
><<<
>>^>
Ausgabe 0
.
<>^^<
>>>v>
<^^>v
<^>>v
>^<<<
Ausgabe -15
.
v<<<<
>v>>^
v<^<<
>>>>^
Ausgabe 20
.
Antworten:
C #, 604 Bytes
Komplettes Programm, akzeptiert Eingaben (zeilenbegrenztes Layout, keine Bemaßungen) von STDIN, gibt an STDOUT aus.
Das Programm arbeitet nach dem ersten Lesung im Layout, unnötig zu sagen, und dann jede Zelle iterieren. Wir lassen dann eine "Schlange" aus jeder Zelle laufen, die den Pfeilen folgt, bis sie vom Rand abläuft oder in sich selbst hineinläuft. Wenn es in sich zusammenläuft, wissen wir, dass wir eine Schleife (oder eines dieser "> <" Dinge) gefunden haben, und es weiß auch, wie viel von der Schlange in der Schleife ist.
Sobald wir wissen, dass wir eine Schleife haben, wissen wir, welche Zellen sich in der Schleife befinden, und erstellen eine Zuordnung von jeder Zelle (aus Gründen +1) zu sich selbst
-1
(bedeutet, dass sie sich in der Schleife befindet) oderW
(über die gesamte Breite). wenn es auf den Rand (oder die + 1 (die am Index istW
) zu vereinfachen , die Dinge weiter eins).Während wir dies tun, finden wir auch die Richtung, die das 'letzte' Element der Schleife hat (dh das letzte Element der Schleife in der letzten Zeile, die Elemente aus der Schleife enthält). Dieses Element muss ein "<" oder ein "^" sein und gibt die Taktung (CW / CCW) der Schleife an (übersetzt in -1 / + 1).
Wir führen dann einen Disjoin Set Pass durch, der alle Elemente, die sich außerhalb der Schleife befinden, dem zuordnet
W
Set . Wir subtrahieren dann, wie viele davon vorhanden sindW
, um die auf und in der Schleife enthaltene Zahl zu erhalten. Wenn diese Zahl kleiner als 3 ist, ersetzen wir sie durch 0. Wir multiplizieren dies mit der Taktung, stellen sie als Ergebnis ein und entkommen irgendwie den for-Schleifen, in denen das Ergebnis ausgegeben wird.Wenn jedoch das meiste der oben genannten Ereignisse nie eintritt (weil sich nie eine Schlange findet), bleibt das Ergebnis als "X" und das wird ausgegeben.
quelle