Wprowadzenie
W tym wyzwaniu Twoim zadaniem jest znalezienie uogólnionych podciągów ciągów. Podsekwencje niekoniecznie są ciągłe i mogą również „owijać” sznurek, przechodząc poza jego koniec i rozpoczynając od początku. Będziesz jednak chciał zminimalizować liczbę owinięć.
Bardziej formalnie, niech u
i v
być dowolne dwa ciągi i k ≥ 0
liczbą całkowitą. Mówimy, że u
jest k
pakowania, dozowania podciąg z v
, jeśli istnieją wyraźne wskaźniki , takie, że , i co najwyżej indeksów zaspokoić . Oznacza to, że można go znaleźć w środku , przechodząc od lewej do prawej, wybierając po drodze niektóre z jego postaci i owijając się w większości przypadków (równoważnie, wykonując co najwyżej przemiatanie ). Zauważ, że żadna postać nie może być wybrana więcej niż jeden raz, nawet po zawinięciu, a podsekwencje owijania są dokładnie zwykłymi podsekwencjami, które wszyscy znamy.i1, i2, ..., ilen(u)
u == v[i1] v[i2] ... v[ilen(u)]
k
ij
ij > ij+1
u
v
k
k+1
v
0
Zadanie
Twoje wejścia są dwa niepuste ciągi alfanumeryczne u
i v
, a wyjście jest najmniejsza liczba całkowita k
takie, że u
jest k
pakowania, dozowania podciąg v
. Jeżeli takiego nie k
ma, wynik powinien wynosić -1
.
Przykład
Rozważ dane wejściowe u := xyzyxzzxyx
i v := yxzzazzyxxxyz
. Jeśli zaczniemy szukać bohaterów u
w v
zachłanny sposób, obejrzymy się 3 razy:
yxzzazzyxxxyz
>─x─────y────z┐
┌─────────────┘
└y───────x────┐
┌─────────────┘
└──zz─────x─y─┐
┌─────────────┘
└──────────x──>
Zatem poprawne wyjście wynosi co najwyżej 3. Zwróć uwagę, jak lewy znak x
jest wybierany jeden raz, a następnie ignorowany przy drugim przeciągnięciu, ponieważ nie można go ponownie użyć. Istnieje jednak krótsza metoda z tylko 2 obejściami:
yxzzazzyxxxyz
>──────────xyz┐
┌─────────────┘
└yxzz────x────┐
┌─────────────┘
└───────y─x───>
Okazuje się, że jedno zawinięcie (czyli dwa wyciągnięcia po ścieżce) nie wystarczy, więc poprawne wyjście to 2
.
Zasady i bonusy
Możesz napisać funkcję lub pełny program, a także, w razie potrzeby, zmienić kolejność wejść. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Istnieje premia w wysokości -10% za obliczenie wszystkich przypadków testowych w sumie poniżej 10 sekund. Będę testować niejasne przypadki na moim komputerze; moja referencyjna implementacja w Pythonie zajmuje około 0,6 sekundy. Mam 7-letniego laptopa z dwurdzeniowym procesorem 1,86 GHz, który warto wziąć pod uwagę.
Przypadki testowe
"me" "moe" -> 0
"meet" "metro" -> -1
"ababa" "abaab" -> 1
"abaab" "baabaa" -> 1
"1c1C1C2B" "1111CCCcB2" -> 3
"reverse" "reserved" -> 2
"abcdefg" "gfedcba" -> 6
"xyzyxzzxyx" "yxzzazzyxxxyz" -> 2
"aasdffdaasdf" "asdfddasdfsdaafsds" -> 2
źródło
x
jest używany w trzech różnych zakresach. Można go użyć tylko raz.Odpowiedzi:
Pyth, 34 bajty
Definiuje to funkcję
g
, która przyjmuje dwa ciągi jako parametr. Wypróbuj online: Pyth Compiler / ExecutorTen kod jest bardzo nieefektywny. Ma złożoność czasową i pamięćową
len(v)!/(len(v)-len(u))!
. Nie jest w stanie rozwiązać dłuższych przypadków testowych w czasie krótszym niż 10 sekund. (Prawdopodobnie nastąpi awaria, ponieważ zabraknie pamięci.)źródło
Haskell, 160 * 0,9 = 144 bajtów
Czas dla wszystkich przypadków testowych (uwaga: argumenty są odwracane):
Jak to działa (wersja skrócona): prosta brutalna siła, która wymaga minimum użycia pasującej postaci i pominięcia jej. Zatrzymuję wyszukiwanie, gdy albo skończę (zwracam liczbę cykli), albo gdy wykonałem cykl więcej niż minimum (do tej pory -1).
Zaoszczędziłem dużo bajtów w porównaniu do mojej pierwszej wersji, głównie dlatego, że przełączyłem się z pełnego programu na funkcję.
Z kilkoma komentarzami i odpowiednimi odstępami gra w golfa Haskell jest dość czytelna:
Dla odniesienia: stara wersja, pełny program, 187 bajtów
źródło
JavaScript (ES6) 174 (193–10%)
Wyszukiwanie rekurencyjne, podobnie jak odpowiedź @ nimi, z zachowaniem minimalnej liczby owinięć. Przestrzeń rozwiązań jest duża (przede wszystkim dla ostatniego przykładu), ale skrócenie wyszukiwania przy aktualnie znalezionej min utrzymuje czas na niskim poziomie. Edycja 1 Dodaj brakującą skrzynkę testową, nieco skrócona Edytuj 2 Nie ma potrzeby przekazywania parametrów, jest naprawiona
Nie golfił
Przetestuj w konsoli Firefox / FireBug
Dane wyjściowe (ostatni wiersz to czas wykonania w ms)
źródło