Okresy lokalne
Weź niepusty ciąg s . Lokalny okres od s o indeksie i jest najmniejszym dodatnia n takie, że dla każdego 0 ≤ k <n , mamy s [I + K] = s [n + i, k] , gdy obie strony są określone. Alternatywnie, jest to minimalna długość łańcucha niepusty wag taki sposób, że gdy powiązanie WW znajduje się obok s tak, że druga kopia w rozpoczyna się wskaźnika i w s , a następnie dwa ciągi zgadzają gdzie zachodzą one na siebie.
Jako przykład, obliczmy lokalny okres s = "abaabbab" przy (0) indeksie 2.
- Spróbuj n = 1 : następnie s [2 + 0] ≠ s [2-1 + 0] , więc ten wybór jest nieprawidłowy.
- Spróbuj n = 2 : następnie s [2 + 0] = s [2-2 + 0] ale s [2 + 1] ≠ s [2-2 + 1] , więc to również nie jest poprawne.
- Próby n = 3 : I y [2 + 0-3] nie jest zdefiniowana, S [2 + 1] = s [3/2 + 1] i S [2 + 2] = s [2-3 + 2] . Tak więc okres lokalny wynosi 3.
Oto wizualizacja okresów lokalnych z wykorzystaniem drugiej definicji, z średnikami dodanymi pomiędzy dwiema kopiami w dla jasności:
index a b a a b b a b period
0 a;a 1
1 b a;b a 2
2 a a b;a a b 3
3 a;a 1
4 b b a b a a;b b a b a a 6
5 b;b 1
6 a b b;a b b 3
7 b a;b a 2
Zauważ, że w niekoniecznie jest podciągiem s . Dzieje się tak tutaj w przypadku indeksu-4.
Zadanie
Twój wkład jest niepusty ciąg s z małych znaków ASCII. W razie potrzeby można go traktować jako listę znaków. Twój wynik powinien być listą zawierającą lokalny okres s dla każdego z jego wskaźników. W powyższym przykładzie poprawny wynik wyniósłby [1,2,3,1,6,1,3,2] .
Najniższa liczba bajtów w każdym języku wygrywa. Obowiązują standardowe zasady gry w golfa .
Przypadki testowe
a -> [1]
hi -> [1, 2]
www -> [1, 1, 1]
xcxccxc -> [1, 2, 2, 5, 1, 3, 2]
abcbacb -> [1, 4, 7, 7, 7, 3, 3]
nininini -> [1, 2, 2, 2, 2, 2, 2, 2]
abaabbab -> [1, 2, 3, 1, 6, 1, 3, 2]
woppwoppw -> [1, 4, 4, 1, 4, 4, 4, 1, 4]
qwertyuiop -> [1, 10, 10, 10, 10, 10, 10, 10, 10, 10]
deededeededede -> [1, 3, 1, 5, 2, 2, 5, 1, 12, 2, 2, 2, 2, 2]
abababcabababcababcabababcaba -> [1, 2, 2, 2, 2, 7, 7, 7, 7, 2, 2, 2, 19, 19, 5, 5, 2, 5, 5, 12, 12, 2, 2, 2, 7, 7, 5, 5, 2]
qwertyuiop
, w będzie obrócony wersjęqwertyuiop
. Zobacz także przykład o indeksie 4: w niekoniecznie jest podciągiem s .;
jest to w twoim przykładzie). Pozbyłoby się to czołowej 1.Odpowiedzi:
Siatkówka ,
8986 bajtówWypróbuj online! Edycja: Zapisano 3 bajty dzięki @MartinEnder. Wyjaśnienie:
Podziel dane wejściowe na każdy znak, tworząc parę linii, jedną dla prefiksu i jedną dla sufiksu prefiksu.
Uruchom resztę skryptu dla każdej wynikowej pary.
Znajdź wszystkie pokrywające się mecze i wyświetl wyniki. (Patrz poniżej.)
Odrzuć puste dopasowanie.
Weź długość każdego meczu.
Sortuj numerycznie.
Weź najmniejszy.
Dopasowywanie polega na podzieleniu prefiksu i sufiksu na trzy części. Należy rozważyć cztery ważne przypadki:
Wyrażenie regularne pozwala więc dopasować A i C tylko z jednej strony na raz.
źródło
$&$'
jest równa,$<'
a długość linii obliczeniowej jest krótsza%C`.
. tio.run/##K0otycxLNPz/X49LJeHQNhUb9UPbuPQ14mr0tDUPbdPT1o/...Java 8,
167154152 bajtów-2 bajty dzięki @ceilingcat .
Wypróbuj online.
Wyjaśnienie:
źródło
JavaScript (ES6), 84 bajtów
Pobiera dane wejściowe jako tablicę znaków.
Przypadki testowe
Pokaż fragment kodu
źródło
Rubinowy ,
104102 bajtówWypróbuj online!
Lambda akceptuje ciąg i zwraca tablicę.
-2 bajty: Zamień punkty końcowe zakresu za pomocą osłon związanych z indeksem
Nie golfowany:
źródło
Japt ,
3332 bajtyZaoszczędzono 1 bajt dzięki @Shaggy
Przetestuj online!
Wyjaśnienie
Moją pierwszą myślą było porównanie każdego znaku w lewym podciągu z odpowiednim znakiem w prawym podciągiem, jak w odpowiedzi JS. Nie działałoby to jednak, ponieważ metoda Japt, aby uzyskać znak, po prostu zawija się na drugi koniec łańcucha, jeśli indeks jest ujemny lub zbyt duży.
Zamiast tego moje rozwiązanie buduje wyrażenie regularne z drugiego podłańcucha i testuje je na pierwszym podciągu. Weźmy na przykład piąty element w przypadku testowym
abaabbab
:Główną sztuczką jest to
^
można dopasowywać nieskończenie długo, aż do dopasowania postaci. To pozwala nam zignorować dowolną liczbę znaków od początku wyrażenia regularnego, zapewniając jednocześnie, że wszystkie pozostałe są dopasowywane kolejno, kończąc na końcu łańcucha testowego.Nie jestem pewien, czy dobrze to wytłumaczyłem, więc proszę dać mi znać, jeśli jest coś, co chciałbyś wyjaśnić, lub cokolwiek innego, co powinno zostać wyjaśnione.
źródło
C (gcc) ,
143142140139128126123 bajtów!b&&printf
w golfab||printf
.for
nawiasy korpusu pętli, żonglującprintf
umieszczeniem.b+=S[i+k]!=S[i-n+k]
w golfab|=S[i+k]-S[i-n+k]
.l=strlen(S)
warunkowania obu pętli obsługi ciągów, aby przerywały się po osiągnięciu końca łańcucha (bajt zerowy'\0'
).i-n+k>~0
w golfai-n>~k
.b||printf("|"),n++
jest równoważne zn+=b||printf("|")
.Wypróbuj online!
źródło
b||printf("%d,",n)
do pętli for:i,b,k,n,l;f(char*S){for(l=strlen(S),i=-1;++i<l;)for(b=n=1;b;b||printf("%d,",n),n++)for(b=k=0;k<n;k++)i+k<l&i-n+k>=0&&(b+=S[i+k]!=S[i-n+k]);}
140 bajtówPython 2 , 115 bajtów
Wypróbuj online!
źródło