Wyzwanie
Biorąc pod uwagę poprawną regex, wypisz regex, który pasuje do tego samego zestawu ciągów, ale jest odwrócony.
Zadanie
To wyzwanie wykorzystuje najbardziej podstawowe operacje regex: ^
, $
, ?
, +
, *
, []
, {}
, |
. Nie ma czegoś takiego jak grupy przechwytywania lub jakiekolwiek inne skomplikowane rzeczy. Znaki specjalne można uciec.
Przykładowe wejście / wyjście
Uwaga: Niepoprawne dane wejściowe nigdy nie zostaną podane i dla wielu danych istnieje wiele możliwych odpowiedzi!
Input | Sample Output
-----------|-------------
abc | cba
tuv? | v?ut
a(b|c) | (c|b)a
1[23] | [23]1
a([bc]|cd) | (dc|[bc])a
^a[^bc]d$ | ^d[^bc]a$
x[yz]{1,2} | [yz]{1,2}x
p{2} | p{2}
q{7,} | q{7,}
\[c[de] | [de]c\[
ab[c | <output undefined>
a(?bc) | <output undefined>
a[]]bc | <output undefined>
Próbny
Działające demo, które pokazuje prawidłowe wejścia / wyjścia. Ma to pewną dodatkową logikę do sprawdzania poprawności danych wejściowych, które nie są konieczne w prawdziwej odpowiedzi. Uważaj niepoprawne dane wejściowe za niezdefiniowane zachowanie.
Specyfika
Dla uproszczenia wszystkie znaki specjalne mają albo specjalne znaczenie, albo uciekają; to [[]
znaczy nie jest zasięgiem postaci [
. Zakresy długości pochodzą ze standardowych POSIX ERE; to znaczy {n}
, {n,}
i {n,m}
są obsługiwane. Zakresy znaków []
i [^]
są obsługiwane. Z powodu tych reguł i ponieważ nie podano niepoprawnych danych wejściowych, naprawdę potrzebujesz tylko ich zawartości bezpośrednio na dane wyjściowe. Wreszcie, zachłanność nie ma znaczenia, tzn. Nie ma znaczenia, czy odwrotna regex znajdzie najpierw inne dopasowanie, musi tylko znaleźć dopasowanie dla tego samego zestawu ciągów.
Punktacja
Najmniejszy program w bajtach (z wyjątkiem oszustw, takich jak żądania sieciowe) wygrywa. Program może użyć rzeczywistego We / Wy lub po prostu zdefiniować funkcję.
?
przyczepić. Spróbuj wpisać/a(?bc)/
w konsoli przeglądarki.(^a|b)(c$|d)
jak przypadek testowy.(a)?(b)+
↦(b)+(a)?
?()
, która jest używana w twoim przykładzie.Odpowiedzi:
Siatkówka ,
136114110 bajtówYo dawg, słyszałem, że lubisz wyrażenia regularne ...
Gdzie
<empty>
reprezentuje pustą linię końcową. Uruchom kod z jednego pliku z-s
flagą.... kiedy chcesz odwrócić regex, powinieneś użyć regex. Jeśli chcesz użyć wyrażenia regularnego, powinieneś użyć języka programowania opartego na wyrażeniach regularnych.
Kod ten zakłada, że wejście nie zawiera
;
ani!
nie obowiązuje. Chociaż zgadzam się, że jest to dość mocne i potencjalnie nieprawidłowe założenie, możesz zastąpić te trzy w kodzie dowolnymi trzema niedrukowalnymi znakami (np. Bajtami zerowymi, znakiem dzwonka,<DEL>
jak go nazwiesz) i nie wpłynie to na rozmiar ani funkcjonalność kodu w ogóle.Dodam wyjaśnienie, kiedy skończę grać w golfa.
źródło
]]]
Tak czy inaczej, ta odpowiedź nie będzie wymagać wielu modyfikacji.)JavaScript ES6, 574 bajty
Prawdopodobnie mogę usunąć kilka
var
instrukcji.JS ES6, nieprzetestowane, 559 bajtów
Testuje w domu.
JavaScript ES5, bez golfa, 961 bajtów
źródło
JavaScript ES6, 343 bajty
Oryginalny kod (funkcje, ale bez
prompt
):Kod jest implementowany jako rekursywny analizator składni z góry na dół, więc może powodować przepełnienie stosu przy głęboko zagnieżdżonych danych wejściowych.
Kod może powodować nieskończoną pętlę w niepoprawnych przypadkach, ponieważ nie testuję ich, wykorzystując klauzulę „niezdefiniowane zachowanie”.
źródło
Python 3, 144 bajty
(Ten nie obsługuje kwalifikatorów w grupie takiej jak
(a)+(b)*(cde)?
.)Przypadki testowe:
Wynik:
źródło