Czasami zdarza się, że podczas pisania zdania jestem rozkojarzony i w końcu wpisuję te same słowa dwa razy dwa razy pod rząd.
Aby upewnić się, że nie przeszkadza to innym, Twoim zadaniem jest napisanie programu, który rozwiąże ten problem!
Zadanie
Biorąc pod uwagę ciąg wejściowy (jeśli ma to znaczenie dla twojego języka, możesz założyć, że wejście zawiera tylko ASCII, które nie zawiera kanałów.) str
, Które zawiera gdzieś pośrodku podciąg, który występuje dwa razy z rzędu, zwróć ciąg z jedną instancją tego podciąg usunięty.
W przypadku wielu możliwości zwróć najkrótszą możliwą odpowiedź (to znaczy wybierz najdłuższy podciąg powtarzający się i usuń tę).
W przypadku wielu, równie długich kolejnych powtarzających się podciągów, usuń pierwszy (to znaczy pierwszy napotkany podczas czytania ciągu od przodu do tyłu).
Możesz założyć, że dane wejściowe są poprawne (tzn. Zawsze zawierają kolejne powtarzające się podciągi), co może pomóc w obniżeniu ich golfa.
Przykłady
- Wejście:
hello hello world
-> Wyjście:hello world
. - Wejście:
foofoo
-> Wyjście:foo
. (Więc: Tak, ciąg może składać się tylko z powtarzającej się części dwa razy). - Dane wejściowe:
aaaaa
-> Dane wyjściowe:,aaa
ponieważ znajduje się tutaj najdłuższy powtarzający się podciągaa
. - Dane wejściowe:
Slartibartfast
-> To nie jest poprawne wejście, ponieważ nie zawiera kolejnych powtarzających się podciągów, więc nie musisz zajmować się tą sprawą. - Wejście:
the few the bar
-> Jest to kolejne nieprawidłowe wejście, ponieważ powtarzająca się część powinna natychmiast następować po części oryginalnej. W tym przypadku,the
ithe
są oddzielone przez coś innego w międzyczasie, więc to wejście jest nieprawidłowy. - Wejście:
ababcbc
-> Wyjście:abcbc
. Dwa możliwe najdłuższe kolejne powtarzające się podciągi toab
ibc
. Jakab
napotkano wcześniej w ciągu, ta odpowiedź jest poprawna. - Wejście:
Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo
. Wyjście:Buffalo buffalo buffalo buffalo Buffalo buffalo
. (W wykonanej zamianie rozróżniana jest wielkość liter). - Wejście:
Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice couple of words twice in succession.
-> Wyjście:Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice in succession.
. Usuwane są tylko najdłuższe kolejne powtarzające się podciągi.
Twój kod powinien być możliwie jak najkrótszy, ponieważ jest to gra w golfa , więc wygrywa najkrótsza odpowiedź w bajtach. Powodzenia!
Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice couple of words twice in succession.
jako dane wejściowe, wynik powinien byćSometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice in succession.
. Usuwane jest tylko najdłużej znalezione powielenie.p
whappens
Odpowiedzi:
Perl 6 , 40 bajtów
Spróbuj
źródło
Siatkówka ,
3533 bajtówLiczba bajtów zakłada kodowanie ISO 8859-1.
Wypróbuj online!
Wyjaśnienie
Ponieważ silniki wyrażeń regularnych szukają dopasowań od lewej do prawej, znalezienie najdłuższego dopasowania bez względu na pozycję nie jest trywialne. Można to zrobić za pomocą grup równoważących .NET, ale wynik jest raczej nieprzyjemnie długi:
Pomyślałem więc, że spróbuję tego uniknąć, wykorzystując inne funkcje Retina.
Zaczynamy od zastosowania zasadniczo wszystkich możliwych podstawień, po jednym w każdym wierszu. Aby to zrobić, dopasowujemy pozycję przed meczem (zamiast samego meczu), aby umożliwić nakładanie się meczów. Odbywa się to poprzez umieszczenie prawdziwego wyrażenia regularnego w spojrzeniu w przyszłość. Ten lookahead następnie przechwytuje pozostałe oprócz duplikatu, który chcemy usunąć w grupie 2. Zapisujemy grupę 2 (usuwając duplikat), wysuw liniowy, a następnie całe dane wejściowe aż do dopasowania, co daje nam zasadniczo świeżą linię do być podstawionym.
Na koniec będziemy mieć jeden wiersz dla każdego dopasowania, z usuniętym odpowiednim duplikatem. Na koniec będzie też ponownie pełne wejście bez dokonywania żadnych zmian.
Teraz, gdy mamy wszystkie możliwe podstawienia, chcemy uzyskać najkrótszy wynik (który odpowiada najdłużej usuniętemu powtórzeniu).
Więc najpierw sortujemy linie według długości.
A potem zachowujemy tylko pierwszą linię.
źródło
Galaretka ,
2219 bajtów-2 bajty dzięki Dennisowi (unikaj zamiany argumentów, usuń subtelnie zbędny przyrost)
Wypróbuj online!
Pełny program (znaleziono błąd
ÐṀ
polegający na tym, że nie działa z odpowiednią aranżacją w stosunku do diadów, co zostanie wkrótce naprawione; chociaż nie jestem pewien, czy może to zrobić tutaj krótszy kod).W jaki sposób?
Znajduje pierwszy z najdłuższych segmentów danych wejściowych w taki sposób, że w danych wejściowych istnieje powtórzenie i usuwa je z danych wejściowych.
źródło
JavaScript (ES6),
8174 bajtówEdycja: Zapisano 7 bajtów, kradnąc
m[r.length]
sztuczkę @ Arnauld .źródło
PowerShell , 87 bajtów
Wypróbuj online! (wszystkie przypadki testowe)
Wyjaśnienie
Zaczynając od środka, w zasadzie uruchamiamy
Matches
z(.+)\1
wyrażeniem regularnym, aby zwrócić wszystkie obiekty dopasowania dla określonego ciągu. Wyrażenie regularne pasuje do dowolnej sekwencji znaków, po której następuje sam.Następnie powstałe obiekty dopasowania są wpompowywane w
sort
celu posortowania według ichLength
właściwości (skróconej do symbolu wieloznacznego). Powoduje to tablicę dopasowań posortowaną według długości, rosnąco, więc indeksuj za pomocą,[-1]
aby uzyskać ostatni element (najdłuższy). Wartość tego dopasowania jest jednak dopasowaniem, a nie grupą, więc obejmuje powtórzenie, więc pobieramy obiekt Group (|% Gr*
), a następnie wartość tego (|% V*
), aby uzyskać największy powtarzany ciąg. Rzecz w tym, że obiekt grupy jest w rzeczywistości tablicą, ponieważ grupa 0 jest zawsze zgodna, ale chcę rzeczywistą grupę (1), więc wartość wynikowa jest w rzeczywistości wartością s , stąd indeksowanie w celu uzyskania drugiego elementu[1]
. Ta wartość jest rzutowana na sam obiekt wyrażenia regularnego, a następnieReplace
Metoda jest wywoływana w stosunku do oryginalnego ciągu, zamieniając na nic i zastępowane jest tylko pierwsze dopasowanie (|% Re* $s '' 1
).źródło
Haskell , 101 bajtów
Główną funkcją jest
f
, bierze i zwraca aString
.Wypróbuj online!
Kiedy zacząłem to, że importowane
Data.List
i wykorzystywanemaximum
,tails
,inits
iisPrefixOf
. Jakoś to się zmieniło w to. Ale nadal udało mi się tylko zgolić 11 bajtów ...Notatki
splitAt
/a
dzieli ciąg pod danym indeksem.s
jest łańcuchem wejściowym.i
to lista liczb[0 .. length s - 1]
, która-1
ma obejśćsplitAt
podział na końcu, jeśli ma zbyt duży indeks.n
jestlength s
minus bieżąca długość celu dla powtarzanej części, jest ona wybrana w ten sposób, abyśmy nie musieli używać dwóch list liczb i / lub pełnej składni listy malejącej.p
,r
it
są trójdrożnym podziałems
, zr
zamierzoną powtarzaną częścią.fmap
Nie używa(,) String
Functor
w celu uniknięcia zmiennych dla pośredniego podziale.!!0
wybiera pierwszy element z listy dopasowań.źródło
Galaretka ,
2321 bajtówDzięki @JonathanAllan za
Ṭœp
pomysł, który oszczędził 2 bajty.Wypróbuj online!
źródło
Mathematica,
636059 bajtów4 bajty zapisane dzięki Martinowi Enderowi .
Funkcja anonimowa. Pobiera ciąg jako dane wejściowe i zwraca ciąg jako dane wyjściowe.
źródło
~SortBy~StringLength
sortuje ciągi alfabetycznie, jeśli ich długości są takie same ...SortBy
i zawijanieStringLength
listy, aby uzyskać stabilny sort.JavaScript (ES6), 70 bajtów
Przypadki testowe
Pokaż fragment kodu
źródło
aaaabaaab
, ale przyjemne użyciereduce
.To powinien być komentarz, ale nie mam wystarczającej reputacji, aby móc komentować. Chcę tylko powiedzieć @Neil, że jego kod można zmniejszyć do 77 bajtów. W wyrażeniach regularnych nie trzeba używać potwierdzenia do przodu. Oto zmniejszona wersja:
źródło
aabab
jest najkrótszym przykładem niepowodzenia Twojej sugestii.C #, 169 bajtów
Wyjaśnienie
Jest to podejście typu brute-force: wypróbuj każdy możliwy podciąg, aż znajdziemy najdłuższy powtarzający się podciąg. Niewątpliwie Regex jest bardziej wydajny, ale radzenie sobie z nim w języku C # bywa dość szczegółowe.
źródło
PHP,
8482 bajtówUwaga: używa kodowania IBM-850.
Uruchom tak:
Wyjaśnienie
Poprawki
źródło