Uwaga: W ślad za popularnym żądaniem nieco złagodziłem zasady:
- Maksymalny rozmiar wyrażenia regularnego rośnie o 1 bajt co 5 odpowiedzi . Odpowiedź N może wykorzystywać do 29 + ⌈N / 5⌉ bajtów.
- Wynik każdej odpowiedzi będzie wynosić (M / (30 + N / 5)) N
W regex golfu otrzymujesz dwa zestawy ciągów i zostajesz poproszony o utworzenie najkrótszego wyrażenia pasującego, który pasuje do wszystkich ciągów w pierwszym zestawie, ale zawodzi w przypadku wszystkich ciągów w drugim zestawie.
Tak właśnie zrobimy, ale za każdym razem, gdy ktoś odpowie, jego wyrażenie regularne zostanie dodane do jednego z dwóch zestawów ciągów (według własnego wyboru). Dlatego w tym wyzwaniu istnieje ścisła kolejność odpowiedzi.
Przejdźmy przez przykład:
- Powiedzmy, że zaczynam to
abc
(czego nie zrobię) i umieszczam w zestawie meczów . - Wtedy poprawna druga odpowiedź byłaby
a
, ponieważ pasuje do powyższego (i nie ma żadnych ciągów, które jeszcze nie powinny zawieść). Powiedz, że ta odpowiedź trafia do zestawu błędów . - Teraz trzecia odpowiedź musi się zgadzać,
abc
ale nie działaa
. Możliwa jest trzecia odpowiedźb
. Umieśćmy to w zestawie meczów . - Czwarta odpowiedź musi teraz pasować
abc
ib
, ale się nie powiedziea
. Nie zezwalamy na powielanie odpowiedzi, więc prawidłowym wyrażeniem regularnym byłobyc|b
.
Ważne jest, aby twoja odpowiedź była jak najkrótsza. Może to być trywialne w przypadku pierwszych kilku odpowiedzi, ale gdy otrzymamy kilka odpowiedzi, powinno być coraz trudniej uzyskać pożądane dopasowanie w jak najmniejszej liczbie znaków.
W przypadku rzeczywistego wyzwania, początkowo zestaw meczów zawiera, PPCG
a zestaw błędów zawiera [PPCG]
, a ja już podałem pierwszą odpowiedź.
Odpowiadanie
Kluczową rzeczą do zrozumienia w tym wyzwaniu jest to, że tylko jedna osoba może odpowiedzieć na raz, a każda odpowiedź zależy od poprzedniej .
Nigdy nie powinny być dwie odpowiedzi z tym samym N
. Jeśli dwie osoby jednocześnie odpowiedzą na niektóre N
, osoba, która odpowiedziała później (nawet jeśli jest to różnica kilku sekund), powinna uprzejmie usunąć swoją odpowiedź.
Aby ten przebieg przebiegał nieco płynniej, postaraj się przestrzegać następujących kroków podczas publikowania odpowiedzi:
- Upewnij się, że ktoś niezależnie zweryfikował poprawność poprzedniej odpowiedzi (i zostawił odpowiedni komentarz).
- Weź dwa zestawy testowe znalezione w poprzedniej odpowiedzi i napisz wyrażenie regularne pasujące do wszystkich łańcuchów w jednym zestawie, a żaden w drugim.
Opublikuj swoją odpowiedź w następującym formacie:
# N. [regex flavour] - [regex size in bytes] [regex] [link to online regex tester] [notes, explanation, observations, whatever] ### The next answer has to match the following strings: [match set] ### And fail on these strings: [fail set]
gdzie
N
jest numer twojej odpowiedzi. Proszę skopiować[match set]
i[fail set]
od poprzedniej odpowiedzi, i dołączyć swój regex do jednego z nich.Jest to absolutnie niezbędne do podjęcia wyzwania! Udostępniłem narzędzie pulpitu nawigacyjnego dla wyzwania, które pomaga w prowadzeniu księgowości i opiera się na powyższym szablonie. (Zobacz dół posta.)
- Inny użytkownik powinien teraz przejrzeć przesłane zgłoszenie i zostawić komentarz „Poprawność zweryfikowana”, jeśli odpowiedź jest zgodna ze wszystkimi zasadami (patrz poniżej). Jeśli nie, powinni zostawić komentarz wskazujący na wszelkie wady. Masz wtedy 15 minut na rozwiązanie tych problemów. Jeśli tego nie zrobisz, twoja odpowiedź zostanie uznana za nieważną, powinna zostać usunięta, a ktoś inny może opublikować odpowiedź uzupełniającą na poprzednią. (Jeśli tak się stanie, możesz przesłać nową odpowiedź w dowolnym momencie).
Przepisy te mogą wydawać się dość surowe, ale są konieczne, aby uniknąć nieprawidłowych odpowiedzi gdzieś w łańcuchu.
Zasady
- Użytkownik może przesłać tylko jedną odpowiedź na okres 4 godzin. (Ma to na celu uniemożliwienie użytkownikom ciągłego oglądania pytania i udzielania jak największej odpowiedzi).
- Użytkownik nie może przesłać dwóch odpowiedzi z rzędu. (np. odkąd przesłałem odpowiedź 1, nie mogę odpowiedzieć 2, ale mógłbym zrobić 3)
- Nie edytuj odpowiedzi, które zostały zweryfikowane. (Nawet jeśli znajdziesz sposób, aby go skrócić!)
- W przypadku wykrycia błędu na wcześniejszym etapie łańcucha (tj. Po opublikowaniu odpowiedzi uzupełniających), obraźliwa odpowiedź powinna zostać usunięta i zostanie usunięta z zestawu ciągów, w których nowe zgłoszenia powinny zawieść. Jednak wszystkie odpowiedzi, które zostały opublikowane od tego czasu, nie powinny być zmieniane w celu odzwierciedlenia.
- Wyraźnie określ jeden smak, w którym wyrażenie regularne jest ważne. Możesz wybrać dowolny smak, który można swobodnie testować online. Na StackOverflow znajduje się dobra lista testerów online . W szczególności powinny być przydatne Regex101 i RegexPlanet , ponieważ obsługują one szeroką gamę smaków. W odpowiedzi podaj link do testera, który wybrałeś. Dzięki przejściu na
g
skroniowe im
ultiline modyfikatory w testerze, można przetestować wszystkie struny naraz, po jednym z każdej linii (te modyfikatory nie są wliczane do Twojego regex wielkości, ponieważ nie są one potrzebne na każdym indywidualnym ciąg). - Wyrażenie regularne nie może być puste.
- Twoje wyrażenie regularne dla odpowiedzi N nie może być dłuższe niż 29 + ⌈N / 5⌉ bajtów. Tj. Odpowiedzi od 1 do 5 mogą wykorzystywać do 30 bajtów (włącznie), odpowiedzi od 6 do 10 mogą wykorzystywać do 31 bajtów ... odpowiedzi od 31 do 35 mogą wykorzystywać do 36 bajtów. Sprawdź pulpit nawigacyjny, aby zobaczyć, ile znaków może użyć następna odpowiedź.
- Wyrażenie regularne nie może być identyczne z żadnym łańcuchem w żadnym zestawie testowym.
- Nie umieszczaj ograniczników w przesyłanych danych ani liczbie bajtów, nawet jeśli używa ich odpowiedni język hosta. Jeśli wyrażenie regularne używa modyfikatorów, dodaj jeden bajt na modyfikator do rozmiaru wyrażenia regularnego. Np.
/foo/i
Miałby 4 bajty.
Punktacja
Wynik każdej odpowiedzi jest obliczany jako (M / (30 + N / 5)) N , gdzie M to wielkość wyrażenia regularnego w bajtach, a N to liczba. Wynik każdego użytkownika jest iloczynem wszystkich jego odpowiedzi. Użytkownik z najniższym ogólnym wynikiem wygrywa. W mało prawdopodobnym przypadku remisu wygrywa użytkownik z najnowszym przesłaniem. Zaakceptuję najnowszą odpowiedź tego użytkownika.
Jeśli wolisz sumowanie wyników, możesz obliczyć wynik każdej odpowiedzi jako N * (log (M) - log (30)) i zsumować je dla wszystkich odpowiedzi. To da taką samą kolejność liderów.
Nie ma potrzeby, aby obejmować ocenę odpowiedzi na odpowiedź, tylko zgłosić M . Pulpit zadań w dolnej części pytania obliczy wyniki, a w przypadku dwóch bardzo bliskich wyników dokładnie sprawdzę wyniki przy użyciu typów o dowolnej dokładności.
Pamiętaj, że wynik każdej odpowiedzi jest mniejszy niż 1, więc możesz poprawić swój ogólny wynik, podając nową odpowiedź. Im krótsze są wszystkie zgłoszenia, tym bardziej skutecznie możesz obniżyć swój wynik. Co więcej, późniejsze odpowiedzi mogą osiągnąć niższy wynik, chociaż są dłuższe, ze względu na rosnący wykładnik.
Deska rozdzielcza
Napisałem małe narzędzie Dashboard, wykorzystujące fragmenty stosu, oparte na pracy Optymalizatora tutaj . Mam nadzieję, że pomoże nam to uporządkować te wyzwania zależne od odpowiedzi.
Spowoduje to wyświetlenie bieżącego statusu wyzwania - w szczególności, jeśli istnieją sprzeczne odpowiedzi, jeśli odpowiedź wymaga weryfikacji lub jeśli można opublikować następną odpowiedź.
Tworzy również listę wszystkich odpowiedzi z wynikami, a także tabelę wyników wszystkich użytkowników. Trzymaj się powyższego formatu wyzwania, aby pulpit nawigacyjny mógł odczytać odpowiednie ciągi z twoich odpowiedzi. W przeciwnym razie możesz nie zostać uwzględniony w tabeli wyników.
Daj mi znać ( najlepiej na czacie ), jeśli zauważysz jakieś błędy lub masz jakieś pomysły, w jaki sposób można poprawić użyteczność narzędzia.
źródło
Odpowiedzi:
42. Smak Pythona - 38
Testowane na Regex101
Brak entropii w ostatnich kilku odpowiedziach dotarł do mnie ... (powinienem to zrobić wcześniej)
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
28. Smak Python - 29
Testowane na Regex101
Wiele manipulacji zostało zrobionych - numer 4 w zestawie przepustek jest prawdopodobnie największym bólem, ponieważ jest to podciąg wyrażenia regularnego w zestawie błędów, a także dzieli sufiks z innym wyrażeniem regularnym w zestawie błędów.
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
24 - smak Pythona - 29
Testowane tutaj
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
10. Smak Python - 19
Testowane na Regex101 .
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
8. Smak ECMAScript - 14 bajtów
Próbny
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
2. Smak ECMAScript - 6 bajtów
Sprawdź to tutaj
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
9. Smak Python - 28
Testowane na Regex101
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
23. Smak PCRE - 28
Testowane na Regex101.
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
[^]
zrobić?]
jako pierwszy element klasy znaków (po opcjonalnej negacji), jest tylko]
wewnątrz klasy znaków i nie zamyka się (ponieważ puste klasy znaków są nieco bezcelowe). Więc[^]]
pasuje do wszystkiego oprócz]
. Godnym uwagi wyjątkiem jest ECMAScript, który dopuszcza puste klasy znaków. W takim przypadku[]
nic nie pasuje, działa jak(?!)
i[^]
pasuje do dowolnego znaku, co jest wygodne, ponieważ ECMAScript nie mas
modyfikatora i trudno[\s\S]
jest wpisać odczyt.11. Python - 29
► Test w RegexPlanet
Prawie wszystkie nieprawidłowe odpowiedzi mają inną długość niż wszystkie prawidłowe. Ten wyrażenie regularne wykorzystuje to.
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
29. Smak PCRE - 28
Testowane na Regex101
Ta odpowiedź wciąż działa ...
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
31. Smak Perla - 29
[?[CP(].[-<)|w]|^P|^[^C|\\]*$
Nie wiem, jak to działa, został wyprodukowany przez moją pierwszą wyprawę do algorytmów genetycznych . Jest wyjście programu, które wspomina odpowiedź.
Następna odpowiedź musi pasować:
i zawieść:
źródło
29
jest W ten sposób wkrótce się to nie skończy ... Myślę, że głównym wyzwaniem jest znalezienie ostatniego, ostatecznego wyrażenia regularnego.32. PCRE - 30 bajtów
Testowane na Regex101
Następna odpowiedź musi pasować do następujących ciągów :
I zawiodłem na tych ciągach :
źródło
1. Smak ECMAScript - 2 bajty
Przetestuj na Regex101.
Początkowy zestaw pasujący to
PPCG
zestaw niepoprawny[PPCG]
. Dlatego te wyrażenie regularne po prostu sprawdza, czy ciąg zaczyna się odP
.Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
3. Smak ECMAScript - 6 bajtów
Sprawdź to tutaj
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłeś na tych ciągach:
źródło
7. Smak Python - 16
Testowane na Regex101
Musisz dodać \ do listy meczów :)
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
12. Smak ECMAScript - 17
Sprawdź to tutaj .
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
22. Smak PCRE - 29 bajtów
Ponieważ oryginał nr 22 nie jest modyfikowany przez 1 godzinę, zakładam, że stał się nieważny.
Próbny
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
26. Smak Python - 28
Test na Regex101
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
30. Smak Python - 28
Testowane na Regex101
Kiedy jest wola ...
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
37. Smak Perla - 30
Zgłoszenie na Regex101 .
Rozwiązanie zostało opracowane przez ten sam program co poprzednio. Program wydrukował również 29-znakowe rozwiązanie
\?[^$w]*\$|[]^C]\w)$|w.]|\w.\
, nie wiem dlaczego, ponieważ wygląda na zniekształconą regex ...Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
40. PCRE - 33 bajty
Testowane na Regex101
Następna odpowiedź musi pasować do następujących ciągów :
I zawiodłem na tych ciągach :
źródło
4. Smak ECMAScript - 5 bajtów
Sprawdź to tutaj .
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
5. Smak ECMAScript - 6 bajtów
Testowane na Regex101 .
Czas nieco urozmaicić zestaw sukcesów.
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
6. Smak ECMAScript - 9 bajtów
Testowane na Regex101 .
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
14. Smak PCRE - 25
Testowane na Regex101
To zaczyna być dość trudne.
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
15. Smak PCRE - 26
Testowane na Regex101
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
16. Smak PCRE - 21
Testowany na Regex 101 .
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
PPCG
.25. Smak PCRE - 29
Testowane tutaj. (Wyrażenie testowe zawiera dodatkowe,
\n
aby upewnić się, że żadne dopasowanie nie obejmuje wielu wierszy. Nie jest konieczne dopasowanie każdego łańcucha).To był nisko wiszący owoc! :) Muszę pogratulować plannapusowi, ten regex jest niesamowicie elegancki dla obecnych zestawów testowych. Jeśli chcesz głosować za odpowiedzią, pamiętaj, aby głosować również na poprzednią!
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło
35. PCRE - 35 bajtów
Testowane na Regex101
Następna odpowiedź musi pasować do następujących ciągów :
I zawiodłem na tych ciągach :
źródło
36. Smak Pythona - 32
Testowane na Regex101
Miałem przygotowane trzy 32-bajtowe wyrażenia regularne i na szczęście jeden z nich nadal działa: D
Następna odpowiedź musi pasować do następujących ciągów:
I zawiodłem na tych ciągach:
źródło