Jest to oczywiście właściwy język dla zadania. : ^ D
s:({c<L>}{c<R>}0[(<R> <L>)(<L> <R>)_?])%{30}
c:0 *$
Dopasowuje całe dane wejściowe, jeśli jest to prawidłowy wąż; nie pasuje, jeśli tak nie jest. Wypróbuj tutaj!
Wyjaśnienie
SnakeEx to język dopasowywania wzorców 2D . Program składa się z listy definicji „węży”, które pełzają wokół pasujących znaków, zmieniają kierunki i spawnują inne węże. W naszym programie definiujemy dwa węże si c.
Zaczniemy od, cbo to jest prostsze. Jego definicja to 0 *$, co powinno być dość czytelne, jeśli znasz regex: match 0, po którym następuje zero lub więcej spacji, a następnie krawędź siatki. Główny haczyk: dopasowanie może przebiegać w dowolnym kierunku. Użyjemy czarówno węża w górę, jak i w dół, aby sprawdzić, czy 0w każdej kolumnie nie ma dodatkowych s.
Teraz do głównego węża s. Przybiera formę (...)%{30}, co oznacza „dopasuj treść nawiasów 30 razy” - raz dla każdego 0w wężu. Jak na razie dobrze. Co znajduje się w nawiasach?
{c<L>}
Odradza się nowy cwąż, skręcony w lewo o 90 stopni. Kierunek odnosi się dos węża, więc nowy wąż przesuwa się w kierunku szczytu siatki (główny wąż przesuwa się w prawo). Te ckontrole snake że bieżąca komórka jest siatka 0i że każda komórka nad nią jest przestrzeń. Jeśli się nie powiedzie, całe dopasowanie się nie powiedzie. Jeśli się powiedzie, kontynuujemy
{c<R>}
który robi to samo, tylko skręcił w prawo (w kierunku dolnej części siatki).
Zauważ, że te spawny nie wpływają na pozycję wskaźnika dopasowania w głównym wężu. W wyrażeniach regularnych są trochę jak „lookaheads”. (Może tutaj moglibyśmy nazwać je „lookbesides”?) Więc po sprawdzeniu, że wskazujemy na a, 0a reszta kolumny zawiera tylko spacje, musimy faktycznie dopasować0 :
0
Teraz wskaźnik dopasowania znajduje się na znaku po prawej stronie 0 . Musimy sprawdzić trzy różne opcje: wąż ustawia się pod kątem, wąż ustawia się pod kątem lub wąż idzie prosto. W tym celu możemy użyć wyrażenia OR:
[...]
W naszej sali operacyjnej mamy trzy możliwości:
(<R> <L>)
Skręć w prawo, dopasuj spację i ponownie skręć w lewo (kąty węża w dół).
(<L> <R>)
Skręć w lewo, dopasuj spację i ponownie skręć w prawo (kąty węża w górę).
_?
Dopasuj zero lub jeden znak podkreślenia. Ponieważ na wejściu nie ma podkreślników, zawsze będzie to puste dopasowanie (wąż idzie prosto).
Po dopasowaniu jednej z powyższych trzech opcji wskaźnik dopasowania powinien wskazywać 0na następną kolumnę, gotowy do ponownego dopasowania wyrażenia w nawiasach.