Celem tego wyzwania jest znalezienie kierunku i obszaru zamkniętego w pętli.
Wkład:
Prostokątna siatka składająca się całkowicie z tych znaków: ^v<>
(Opcjonalnie możesz otrzymać wymiary siatki przed samą siatką dziesiętnie z wybranym prefiksem, sufiksem i separatorem).
Pętli w sieci jest zbiorem wspomnianych znaków takich, że jeden punktów do następnego, wskazując na następnej, ostatecznie skierowany z powrotem na pierwszym znaku. Na przykład:
<>>v> >>v
^^<>v ^ >v
>^<<< ^<<<
>^<v>
Lewa siatka to przykładowe dane wejściowe; prawa siatka to izolowana pętla.
Siatka wejściowa nie będzie zawierać żadnych pętli ani jednej pętli; nie musisz się martwić o żadne przypadki, w których siatka zawiera więcej niż jedną pętlę.
Wydajność:
Jeśli siatka nie zawiera pętli, wyjdź X
.
Jeśli siatka zawiera dwie strzałki skierowane do siebie, wyjdź 0
.
Jeśli siatka zawiera pętlę przeciwną do ruchu wskazówek zegara, policz znaki zawarte w pętli, w tym ramkę. Podaj tę liczbę.
Jeśli siatka zawiera pętlę zgodną z ruchem wskazówek zegara, wykonaj tę samą procedurę dla pętli przeciwnej do ruchu wskazówek zegara, ale wypisz wartość ujemną tej liczby. Na przykład powyższa siatka wejściowa miałaby wynik -11
: 10 pochodzi z samej pętli, a 1 z znaku zawartego w pętli.
To jest golf golfowy . Najkrótszy kod wygrywa.
Przypadki testowe:
<<^
^>v
^v<
Wyjście X
.
<<<<
><<<
>>^>
Wyjście 0
.
<>^^<
>>>v>
<^^>v
<^>>v
>^<<<
Wyjście -15
.
v<<<<
>v>>^
v<^<<
>>>>^
Wyjście 20
.
Odpowiedzi:
C #, 604 bajty
Kompletny program, przyjmuje dane wejściowe (układ rozdzielany liniami, bez wymiarów) ze STDIN, wyjścia do STDOUT.
Program działa, najpierw czytając układ, nie trzeba dodawać, a następnie iterując po każdej komórce. Następnie uruchamiamy „węża” z każdej komórki, która podąża za strzałkami, dopóki nie opuści krawędzi lub nie wpadnie w siebie. Jeśli wpada w siebie, to wiemy, że znaleźliśmy pętlę (lub jedną z tych „> <” rzeczy), a także wie, ile węża znajduje się w pętli.
Kiedy wiemy, że mamy pętlę, wiemy, które komórki są w pętli, i tworzymy mapę z każdej komórki (+1, z przyczyn) do siebie,
-1
(oznacza, że jest w pętli) lubW
(na całej szerokości) jeśli jest na krawędzi (lub +1 (który jest na indeksieW
), aby jeszcze bardziej uprościć sprawę ).Robiąc to, znajdujemy również kierunek, jaki ma „ostatni” element pętli (to znaczy ostatni element pętli w ostatnim rzędzie, który zawiera elementy z pętli). Ten element musi być „<” lub „^”, a to mówi nam o zegarowości (CW / CCW) pętli (przetłumaczonej na -1 / + 1).
Następnie wykonujemy przejście zestawu rozłączającego, które przypisuje wszystkie elementy znajdujące się poza pętlą do
W
zestawu. Następnie odejmujemy od ich liczby,W
aby uzyskać liczbę zawartą w pętli. Jeśli liczba ta jest mniejsza niż 3, zamieniamy ją na 0. Mnożymy to przez zegarowość, ustawiamy jako wynik i jakoś uciekamy od pętli for, gdzie wynik jest wyprowadzany.Jeśli jednak większość z powyższych nigdy się nie wydarzy (ponieważ żaden wąż nigdy się nie znajdzie), wynik pozostaje jako „X” i jest on generowany.
źródło