Chcę wypróbować nowy rodzaj golfowego wyrażenia regularnego, który prosi o rozwiązanie nietrywialnych zadań obliczeniowych bez podstawiania wyrażeń regularnych. Aby uczynić to bardziej możliwym i mniej uciążliwym, będziesz mógł zastosować kilka zmian, jedna po drugiej.
Wyzwanie
Zaczniemy od prostego: biorąc pod uwagę ciąg znaków zawierający dwie dodatnie liczby całkowite, jako liczby dziesiętne oddzielone a ,
, wygeneruj ciąg zawierający ich sumę, również jako liczbę dziesiętną. Więc bardzo prosto
47,987
powinien zamienić się w
1034
Twoja odpowiedź powinna działać dla dowolnych liczb całkowitych dodatnich.
Format
Każda odpowiedź powinna być sekwencją kroków podstawienia, każdy krok składa się z wyrażenia regularnego i łańcucha zastępczego. Opcjonalnie, dla każdego z tych kroków w sekwencji, możesz powtarzać podstawienie, aż łańcuch przestanie się zmieniać. Oto przykładowe przesłanie (które nie rozwiązuje powyższego problemu):
Regex Modifiers Replacement Repeat?
\b(\d) g |$1 No
|\d <none> 1| Yes
\D g <empty> No
Biorąc pod uwagę dane wejściowe 123,456
, przedłożenie to przetworzyłoby dane wejściowe w następujący sposób: pierwsze podstawienie jest stosowane raz i daje:
|123,|456
Teraz drugie podstawienie jest stosowane w pętli, aż łańcuch przestanie się zmieniać:
1|23,|456
11|3,|456
111|,|456
111|,1|56
111|,11|6
111|,111|
Wreszcie trzecia zamiana jest stosowana raz:
111111
Zauważ, że kryterium zakończenia pętli jest to, czy łańcuch się zmienia, a nie czy wyrażenie regularne znalazło dopasowanie. (Oznacza to, że może również zakończyć się, jeśli znajdziesz dopasowanie, ale zamiennik jest identyczny z dopasowaniem).
Punktacja
Twój wynik główny będzie liczbą kroków podmiany w twoim zgłoszeniu. Każda powtórzona zamiana będzie się liczyła przez 10 kroków. Tak więc powyższy przykład uzyskałby wynik 1 + 10 + 1 = 12
.
W (niezbyt mało prawdopodobnym) przypadku remisu wynik dodatkowy jest sumą rozmiarów wszystkich kroków. Do każdego kroku dodaj regex ( bez ograniczników), modyfikatory i łańcuch podstawienia. W powyższym przykładzie byłoby to (6 + 1 + 3) + (3 + 0 + 2) + (2 + 1 + 0) = 18
.
Różne zasady
Możesz użyć dowolnego smaku wyrażenia regularnego (który powinieneś wskazać), ale wszystkie kroki muszą używać tego samego smaku. Ponadto, należy nie używać żadnych cech języka gospodarza smaku, podobnie jak callbacków zamiennych lub Perl e
modyfikatora, który ocenia kod Perl. Wszelkie manipulacje muszą odbywać się wyłącznie poprzez podstawienie wyrażenia regularnego.
Pamiętaj, że to od Twojego smaku i modyfikatorów zależy, czy każda pojedyncza zamiana zastępuje wszystkie wystąpienia, czy tylko jedno. Np. Jeśli wybierzesz smak ECMAScript, pojedynczy krok domyślnie zastąpi tylko jedno wystąpienie, chyba że użyjesz g
modyfikatora. Z drugiej strony, jeśli używasz smaku .NET, każdy krok zawsze zastępuje wszystkie wystąpienia.
W przypadku języków, które mają różne metody zastępowania pojedynczej i globalnej zamiany (np. Ruby's sub
vs. gsub
), załóż, że pojedyncza zamiana jest domyślna i traktuj globalną zamianę jak g
modyfikator.
Testowanie
Jeśli wybranym przez Ciebie smakiem jest .NET lub ECMAScript, możesz użyć Retiny do przetestowania swojego przesłania (powiedziano mi, że działa również na Mono). W przypadku innych smaków prawdopodobnie będziesz musiał napisać mały program w języku hosta, który zastosuje podstawienia w kolejności. Jeśli tak, proszę dołączyć ten program testowy do swojej odpowiedzi.