Twoim zadaniem jest stworzenie programu, który określa, czy dany ciąg jest prawidłowym wyrażeniem regularnym, czy też nie używa fragmentów kodu pochodzących z witryn w sieci StackExchange.
Dla celów tego wyzwania, dialekt wyrażenie regularne będzie okrojona i przeważnie minimalny zestaw meta-znaki: ()*?|\
. W związku z tym nie będzie można używać wbudowanych analizatorów wyrażeń regularnych.
\
służy do ucieczki od meta-znaków. Po nim musi być meta-znak.- Nierozpoznane nawiasy muszą być zrównoważone
*
i?
musi być poprzedzony albo niemeta-znakiem, grupą w nawiasach okrągłych lub meta-znakiem ucieczki.- Wszystkie inne drukowalne znaki ASCII oraz znak nowej linii, tabulator i spacja muszą być obsługiwane jako znaki niemeta. To, co dzieje się z ciągiem zawierającym inne znaki, jest niezdefiniowane.
- Rzeczywiste znaczenie wyrażenia regularnego nie jest ważne dla tego wyzwania.
Przykłady
Truthy:
abc
a?
(a|)*
()
a|b*
\*
\\
\\*
a*b?(cd|e)
+
[
}
(123\))*
\|
(a(b(c|d)*e)*f)*
(|\)*)
(abc)+*
(abc)+
+abc
^ last test case is an actual newline
Falsy:
?abc
*
**
\
(
a*?
a?*
?
a)
(\)
(|\)*
\()
|*
(?:abc)
\\**
\n
Punktacja
Twój ogólny wynik to liczba urywków z pytań i odpowiedzi dotyczących StackExchange.
- Powtarzane fragmenty liczą się tyle razy, ile są używane.
- Białe spacje można dowolnie dodawać i usuwać (z powodu języka Python, Haskell i innych języków wrażliwych na spacje) i nie są wliczane do liczby urywków.
- Wyjątkiem byłby fakt, że kod jest rzeczywiście napisany w białej spacji .
- Fragmenty są dozwolone z dowolnej witryny StackExchange, o ile pochodzą one z pytań, odpowiedzi i komentarzy starszych (w tym według czasu edycji - w razie potrzeby użyj starszych wersji) niż to wyzwanie. (24 września 2019 o 15:30 UTC)
- Fragmenty mogą pochodzić z dowolnego miejsca w treści pytania, odpowiedzi lub komentarza, niezależnie od tego, czy znajdują się we wstępnie sformatowanym bloku kodu, czy nie.
- Łączenie fragmentu w środku innego powoduje, że fragment zewnętrzny liczy się jako dwa fragmenty
Najniższy wynik wygrywa!