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.