Utwórz program lub funkcję, która pobiera listę ciągów jako dane wejściowe i wyświetla najdłuższy ciąg, który jest podciągiem wszystkich ciągów wejściowych. Jeśli istnieje kilka podciągów o równej długości i już nie jest podciągających, wypisz jeden z nich.
- Może to oznaczać wyprowadzenie pustego ciągu.
- Jeśli istnieje kilka prawidłowych wyników, możesz wypisać dowolne z nich. Nie musisz podawać spójnych danych wyjściowych dla danych wejściowych, o ile dane wyjściowe są zawsze prawidłowe.
- Na wejściu zawsze będzie co najmniej jeden ciąg, ale może nie być niepustego ciągu.
- Wszystkie drukowane znaki ASCII mogą pojawić się na wejściu. Możesz założyć, że są to jedyne pojawiające się postacie.
- Możesz pobierać dane wejściowe lub generować dane wyjściowe dowolną z metod domyślnych .
- Standardowe luki są niedozwolone.
- To jest golf golfowy - im mniej bajtów kodu, tym lepiej.
Przypadki testowe:
[Inputs] -> [Valid outputs (choose one)]
["hello", "'ello"] -> ["ello"]
["very", "much", "different"] -> [""]
["empty", "", "STRING"] -> [""]
["identical", "identical"] -> ["identical"]
["string", "stRIng"] -> ["st", "ng"]
["this one", "is a substring of this one"] -> ["this one"]
["just one"] -> ["just one"]
["", "", ""] -> [""]
["many outputs", "stuptuo ynam"] -> ["m", "a", "n", "y", " ", "o", "u", "t", "p", "s"]
["many inputs", "any inputs", "ny iii", "yanny"] -> ["ny"]
["%%not&", "ju&#st", "[&]alpha_numeric"] -> ["&"]
code-golf
string
subsequence
Sara J.
źródło
źródło
undefined
oznacza to, że nie ma prawidłowego ciągu wyjściowego. Jeśli pusty ciąg (lub jakikolwiek inny ciąg) jest prawidłowym wyjściem, twierdzenie, że nie ma prawidłowego wyjścia, jest niepoprawne.Odpowiedzi:
Python 2 , 82 bajty
Wypróbuj online!
Pobiera dane wejściowe. Przekroczy limit czasu dla danych wejściowych, w których pierwszy ciąg jest długi.
Chodzi o to, aby wziąć podciągi pierwszych ciągów,
h
aby znaleźć najdłuższy, który pojawia się we wszystkich pozostałych ciągacht
. Aby to zrobić, rekurencyjnie rozgałęziamy się po usunięciu pierwszego lub ostatniego znakuh
.Python 2 , 94 bajty
Wypróbuj online!
Bardziej bezpośrednia metoda. Funkcja pomocnicza
g
generuje zestaw wszystkich podciągóws
, a funkcja główna zajmuje najdłuższą na swoim skrzyżowaniu.źródło
Brachylog (v2),
39 bajtówWypróbuj online!
Pełny program Wejście ze standardowego wejścia (jako lista ciągów w stylu JSON), wyjście na standardowe wyjście.
Wyjaśnienie
Najwyraźniej kolejność rozstrzygania remisów
s
nie jest taka, jak w prawie wszystkich innych elementach Brachylog, więc musimy ręcznie ją zastąpić, aby uzyskać jak najdłuższy wynik. (To trochę frustrujące: cztery dodatkowe znaki do zastąpienia oraz dwa znaki grupujące, ponieważ Brachylog nie analizuje dwóch metapredykatów z rzędu).Brachylog
s
nie zwraca pustych podciągów, więc potrzebujemy trochę sztuczki, aby sobie z tym poradzić: zamiast składać funkcję (co jest normalnie wykonywane), piszemy pełny program, wypisujący na standardowe wyjście. W ten sposób, jeśli istnieje wspólny substring, po prostu go wyprowadzamy i gotowe. Jeśli nie ma wspólnego podłańcucha, program wyskakuje - ale nadal nie wypisuje nic na standardowe wyjście, więc wypisuje ciąg zerowy zgodnie z przeznaczeniem.źródło
s
zły, a nadpisanie tego rozkazu jest dość drogie bajtowo. Robi to teraz i tak, ponieważ ważne jest, aby odpowiedź była poprawna. Jakoś żaden z przypadków testowych, które próbowałem, nie zauważył różnicy.s
tworzy podciągi, najpierw podając wszystkie prefiksy wejścia (najpierw najdłuższe), a następnie upuszczając pierwszy i powtarzającGalaretka ,
126 bajtówWypróbuj online!
Dzięki @JonathanAllan za uratowanie 6 bajtów!
źródło
Ẇ€œ&/Ṫḟ0
że wykonałbym zadanie i zaoszczędziłby cztery bajty, ponieważ podłańcuchy są już uporządkowane według długości, stąd wynik będzie filtrowany; wtedy pozostaje tylko to, że gdy nie ma dopasowań, ogon generuje zero, a ponieważ mamy zagwarantowane listy znaków, możemy je po prostu odfiltrować.œ&/
może zostać zastąpiony przezf/
tutaj, oszczędzając innegoẆ€f/ṛ/
.Ruby 2.6,
76 5954 bajtówWypróbuj online! - Wersja Ruby 2.5 (56 bajtów)
W jaki sposób?
Utwórz listę potencjalnych dopasowań, początkowo ustawioną na oryginalną tablicę. Iteruj na liście, a jeśli ciąg nie pasuje, dodaj 2 nowe ciągi do końca listy, odcinając pierwszy lub ostatni znak. Na końcu zostanie znalezione dopasowanie (ewentualnie pusty ciąg).
Dzięki Kirill L za -2 bajty i histokrat za kolejne -2
źródło
R ,
119116108106 bajtówWypróbuj online!
Znajdź wszystkie podłańcuchy każdego łańcucha, znajdź przecięcie każdej listy podciągów, a następnie w końcu zwróć (jeden z) najdłuższych.
-3 bajty dzięki Kirill L.
-8 bajtów
lapply
zamiastMap
-2 bajty dzięki Kirillowi L. ponownie, usuwając aparat ortodontyczny
źródło
nchar
wystarczą, aby coś uratować, zadeklarującnchar
jako jednoargumentowy operator.list
podobnie daje nam -3 bajty.05AB1E ,
1498 bajtów-6 bajtów dzięki @Adnan .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
€Œ.«Ãõªéθ
powinien działać na 9 bajtów.Å«Ã
, ale nie zdawałem sobie sprawy, że powinienem był użyć.«Ã
… Dzięki!€Œ.«ÃéθJ
powinien pracować dla 8.Zsh ,
126 ...96 bajtów-3 bajtów z arytmetyki dla, -6 bajtów z niejawnych
"$@"
(dzięki roblogic), -5 bajtów z usuwania niepotrzebnych{
}
, -1 bajtów z krótkiej formyfor
, -1 bajtów przy użyciurepeat
, -1 bajtów przez konkatenacjęfor s ($b)
z ciałem, -13 bajtów zmieniając pętlę powtarzania dla jakiegoś ewankowego kija.Wypróbuj online! Wypróbuj online!Wypróbuj online!Wczytujemy wszystkie możliwe podciągi do tablicy
a
, a następnie ustawiamyb
na przecięcie tablica
ib
. Konstrukt${b-$a}
podmieni się tylko$a
przy pierwszej iteracji: W przeciwieństwie do rozszerzenia rodzeństwa${b:-$a}
, nie zastąpi, gdyb
jest ustawiony, ale pusty.źródło
a+=( $l[1+i/$#l,1+i%$#l] )
for
pętlifor l in "$@"
na prostyfor l;
- to sztuczka bashb=(${${b-$a}:*a})}
man zshexpn
aman zshparam
szczególnie. Zawsze mam je otwarte podczas pisania odpowiedzi.Haskell , 80 bajtów
Wypróbuj online!
Zbierz wszystkie sufiksy (
tails
) pierwszego słowax
na liście i podejmują wszystkie prefiksy (inits
) tych przyrostków, aby uzyskać wszystkie podciągis
ox
. Sobie nawzajems
, żeisInfixOf
all
struny na liście pozostałyr
. Uporządkować te podciągi pod względem długości (korzystając z(0<$)
podstęp ) i powrócić ostatni.źródło
Retina 0.8.2 , 48 bajtów
Wypróbuj online! Wyjaśnienie:
Dla każdego sufiksu pierwszego łańcucha znajdź najdłuższy prefiks, który jest jednocześnie podciągiem wszystkich pozostałych łańcuchów. Wymień wszystkie prefiksy sufiksów (tzn. Podłańcuchy). Jeśli nie ma pasujących podciągów, po prostu kończymy na pustym ciągu, czego i tak chcemy.
Posortuj podciągi w odwrotnej kolejności według długości.
Zachowaj tylko pierwszy, czyli najdłuższy podciąg.
źródło
n
jest liczbą ciągów argumentów. Więc(?=(.*\n.*\1)*.*$)
powinno być(?=(.*\n.*\1){n-1}.*$)
, prawda? Przypadek testowy:["very", "different", "much"] -> [""]
{n}
można usunąć początkowe i końcowe wzory i zachować(.+)(?=(.*\n.*\1){n}
jeśli Retina pozwala pisaćn
krócej niż(?<=^.*).*$
Zapytanie TSQL, 154 bajty
Wypróbuj online
Uwzględniono wielkość liter, deklarując kolumnę „a” z zestawieniem zawierającym CS (wielkość liter ma znaczenie).
Rozdzielając wszystkie ciągi znaków z 2540 pozycji początkowych (wiele identycznych), ale przydatne wartości mieszczą się w zakresie od 1 do 2070 i kończąc od 0 do 22 znaków po pozycji początkowej, pozycja końcowa może być dłuższa przez zmianę typu na „P” zamiast „L”, ale osłabiłoby wydajność.
Te odrębne ciągi znaków w każdym numerze są liczone. Najwyższa liczba będzie zawsze równa liczbie wierszy w zmiennej tabeli „@”. Odwrócenie kolejności o tę samą liczbę spowoduje pozostawienie podciągu z większością dopasowań na górze wyników, a następnie odwrócona długość podłańcucha pozostawi najdłuższe dopasowanie z większością dopasowań na górze. Zapytanie wybiera tylko pierwszy wiersz.
Aby uzyskać wszystkie odpowiedzi, zmień pierwszą część zapytania na
źródło
C # (interaktywny kompilator Visual C #),
320257 bajtówWypróbuj online!
Rekwizyty do @Expired Data i @dana
źródło
Perl 6 ,
6260 bajtówWypróbuj online!
Jestem trochę zirytowany Perl 6 nie może zrobić zestaw operacji na listach list, dlatego istnieje dodatkowy
.comb
i>>
tam.Inną irytującą rzeczą jest to, żeJak wskazano w komentarzach,max
nie może wziąć funkcji porównywania przedmiotów, co oznacza, że muszę użyćsort
zamiast tego.max
można wziąć argument, jednak kończy się to dłużej, ponieważ muszę wziąć pod uwagęmax
zwracanie ujemnej nieskończoności, gdy występują wspólne podciągi ( Wypróbuj online! ).źródło
max
może przyjąć taką funkcję (choć arity 1), albo przez pozycję, gdy jest wywoływana w trybie OO, albo nazwany:by
argument w trybie proceduralnym.Japt v2.0a0
-hF
, 8 bajtówDzięki Shaggy za uratowanie 3 bajtów
Spróbuj
źródło
-F
domyślnie pusty ciąg.Japt
-h
, 8 bajtów(Mógłbym zrzucić ostatnie 3 bajty i
-Fh
zamiast tego użyć flagi, ale nie jestem fanem używania-F
)Wypróbuj lub uruchom wszystkie przypadki testowe
źródło
Python 3 , 137 bajtów
Wypróbuj online!
źródło
Python 2 , 103 bajty
Wypróbuj online!
Jest to anonimowa lambda, która przekształca każdy element w zestaw wszystkich podciągów, następnie
reduce
s to przez set przecięcie (set.__and__
), a następnie zwracamax
element przezlen
gth.źródło
set.intersection
.C # (interaktywny kompilator Visual C #) ,
147145 bajtówWypróbuj online!
źródło
Perl 5 (
-aln0777F/\n/
-M5.01
-MList::util=max
), 99 bajtówmoże być golfem z pewnością
TIO
źródło
JavaScript (ES6),
9892 bajtówWypróbuj online!
źródło
Węgiel drzewny , 30 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Algorytm ten jest bardziej wydajny i krótszy niż generowanie wszystkich podciągów. Wyjaśnienie:
Pop ostatni ciąg z listy wprowadzania do zmiennej.
Zeruj indeks początkowy podłańcucha.
Pętla nad wszystkimi możliwymi wskaźnikami końca podłańcucha. (Właściwie to pętle od 0 wyłączają długość, więc wartość jest korygowana później.)
Uzyskaj bieżący podciąg.
Sprawdź, czy ten podciąg jest zawarty we wszystkich innych ciągach wejściowych.
Jeśli tak, to nadrukuj poprzednio wyprowadzony podciąg.
W przeciwnym razie spróbuj zwiększyć indeks początkowy podłańcucha.
źródło
Bash ,
295.. 175 bajtówNie ładna, ale przynajmniej działa. Wypróbuj online
-37 przez ogólne sprzątanie ; -52 poprzez plagiat z odpowiedzi zsh ; -26 poprzez zamianę tablicy na pętlę ; -2 dzięki GammaFunction ; -3 usunięto
i=0
zfor
pętliOto oryginalny niepolecany skrypt z komentarzami
źródło
((k==$#))&&
z((k-$#))||
. Pozwala to także na użyciek=
zamiast ustawiania na 0.Czerwony ,
266174 bajtówWypróbuj online!
Zmieniłem rekurencję na iterację i pozbyłem się sortowania.
źródło
Perl 5 , 87 bajtów
Wypróbuj online!
źródło
JavaScript (Node.js) , 106 bajtów
Wypróbuj online!
źródło
Gaia , 15 bajtów
Wypróbuj online!
źródło
PowerShell ,
16516387 bajtów-76 bajtów dzięki Nail za niesamowite wyrażenie regularne .
Wypróbuj online!
Mniej golfa:
źródło
JavaScript (Node.js) , 90 bajtów
Wypróbuj online! Przypadki testowe bezwstydnie skradzione z @Arnauld. Port mojej odpowiedzi na węgiel drzewny.
źródło
Java (JDK) , 158 bajtów
Wypróbuj online!
Kredyty
źródło
Perl 5 , 86 bajtów
Wypróbuj online!
źródło
Pyth , 16 bajtów
Wypróbuj online!
źródło