Biorąc pod uwagę (na STDIN, jako argumenty wiersza poleceń lub jako argumenty funkcji) dwa różne niepuste ciągi, znajdź i zwróć najkrótszy ciąg pierwszego ciągu, który nie jest ciągiem drugiego. Jeśli taki podciąg nie istnieje, możesz zwrócić pusty ciąg, zwrócić dowolny ciąg, który nie jest podciągiem oryginalnego ciągu, lub zgłosić wyjątek. Jeśli wracasz z funkcji, możesz również zwrócić null (lub niezdefiniowany, None, itp.) W tym przypadku. Jeśli kilka takich podciągów jest powiązanych w najkrótszym czasie, możesz zwrócić jeden z nich.
Ciągi znaków mogą zawierać dowolne znaki ascii do wydrukowania.
Dane wejściowe podane na STDIN będą podawane z jednym ciągiem w każdej linii. Na żądanie można dodać jedną pustą linię na końcu danych wejściowych.
To jest golf golfowy, więc wygrywa najkrótszy prawidłowy program.
NIEKTÓRE PRZYPADKI TESTOWE
WEJŚCIE:
STRING ONE
STRING TWO
WYNIK:
E
WEJŚCIE:
A&&C
A&$C
WAŻNE PRODUKTY:
&&
&C
WEJŚCIE:
(Dwa losowo generowane ciągi 80-literowe)
QIJYXPYWIWESWBRFWUHEERVQFJROYIXNKPKVDDFFZBUNBRZVUEYKLURBJCZJYMINCZNQEYKRADRYSWMH
HAXUDFLYFSLABUCXUWNHPSGQUXMQUIQYRWVIXGNKJGYUTWMLLPRIZDRLFXWKXOBOOEFESKNCUIFHNLFE
WSZYSTKIE WAŻNE PRODUKTY:
AD
BJ
BR
CZ
DD
EE
ER
EY
EY
FF
FJ
FW
FZ
HE
IJ
IN
IW
JC
JR
JY
KL
KP
KR
KV
LU
MH
MI
NB
NQ
OY
PK
PY
QE
QF
QI
RA
RB
RF
RO
RV
RY
RZ
SW
UE
UH
UN
UR
VD
VQ
VU
WB
WE
WI
WU
XN
XP
YI
YK
YK
YM
YS
YW
YX
ZB
ZJ
ZN
ZV
Odpowiedzi:
Brachylog , 23 bajty
Działa na starym transpilerze Java. Oczekuje, że dwa ciągi na liście jako dane wejściowe, ujednolica dane wyjściowe z podłańcuchem. Jeśli nie znaleziono żadnego podłańcucha, zwraca false.
Niestety nie zakodowałem jeszcze podzbioru wbudowanego w nowy transpiler Prolog.
Wyjaśnienie
źródło
Python,
11911591Przypadki testowe:
Pracuję nad tym, aby był krótszy, ale to mój instynkt mózgu. Jeszcze nie bardzo golfista.
Dzięki @ user81655 i @NonlinearFruit za dodatkowe bajty.
Edytuj :
Dang. Próbowałem tego kodu:
Pomyślałem, że jest o kilka bajtów krótszy. Okazuje się, że był o 1 bajt dłuższy niż to, co miałem przed edycją.
źródło
(r=range)(1,len(a)+1)
wtedy używaćr
?range
dor
w powyższej linii, faktycznie dodaje bajt. Dobry pomysł. Prawdopodobnie istnieje krótszy sposób na iterację przez podciągi.range(1,len(a))
irange(len(a)-1)
powinno działać, prawda? Myślę też, że użycie znaku tabulacji dla wcięcia dwóch spacji uratuje bajt.range(1,len(a))
czwartym rzutem testowym kończy się niepowodzeniem, ponieważ nie wypróbuje pełnego ciągu; przejdzie tylko do długości łańcucha - 1. I zrange(len(a)-1)
, pierwszy przypadek testowy nie powraca'cd'
zamiast po prostu'd'
. Coś jednak może tam być.range(1,len(a)+1)
irange(len(a))
.Python,
8786 bajtówJeśli istnieje, zwróci skrajnie lewy ze wszystkich najkrótszych unikalnych podciągów.
Jeśli nie ma unikalnego podłańcucha, zgłaszany jest błąd IndexError .
Przetestuj na Ideone .
źródło
enumerate
rozpoczęciaj
wi+1
.j
najpierw definiujei
.'ab'
dane wejściowe'abc','aaa'
.Python, 82 bajty
Zastosowanie:
f('A&&C', 'A&$C')
-> zwraca'&&'
Podnosi ValueError, jeśli nie ma odpowiedniego podciągu.
Wyjaśnienie:
g=lambda u:{u}|g(u[1:])|g(u[:-1])if u else{''}
rekurencyjnie tworzy zestaw podciągów zu
f=lambda s,t:min(g(s)-g(t),key=len)
najkrótszych podciągów z różnicy w zestawieźródło
JavaScript (ES6), 79 bajtów
Jeśli zwracanie
false
jest dopuszczalne, zapisz 2 bajty, używając&&s
zamiast?s:''
.źródło
Pyth, 11 bajtów
Wypróbuj online!
źródło
JavaScript (Firefox), 80 bajtów
Test działa tylko w przeglądarce Firefox. Zwraca,
undefined
jeśli nie ma podciągu.źródło
b.includes
zamiast tego?includes
.SyntaxError: unexpected token 'for'
Siatkówka , 37 bajtów
Dane wyjściowe są puste, jeśli nie znaleziono poprawnego podłańcucha w
A
.Wypróbuj online! (Nieznacznie zmodyfikowano, aby uruchamiało kilka przypadków testowych jednocześnie. Format wejściowy jest faktycznie oddzielony od linii, ale zestawy testów najłatwiej jest napisać z jednym przypadkiem w linii. Środowisko testowe przekształca przestrzeń w kanał przed rozpoczęciem właściwego kodu.)
Wyjaśnienie
Dla każdej możliwej pozycji początkowej w
A
dopasuj najkrótszy podciąg, który nie pojawia się wB
.&
Jest dla nakładających się mecze, takie, które rzeczywiście staramy każdą pozycję wyjściową, nawet jeśli jest to mecz dłużej niż jeden znak. W\G
gwarantuje, że nie pominąć żadnej pozycji - w szczególności w ten sposób mamy do przystanku przy wysuw, tak że nie mamy dodatkowe mecze odB
siebie. Powód, dla którego to nie psuje, jest w rzeczywistości dość subtelny: ponieważ jeśli jest pozycja początkowaA
której nie możemy znaleźć żadnego prawidłowego podłańcucha, oznacza to również awarię, która spowoduje, że\G
przestaniesz sprawdzać dalsze pozycje. Jeśli jednak (z bieżącej pozycji początkowej) wszystkie podciągi pojawią się wB
, podobnie jak wszystkie podciągi, które zaczynają się bardziej na prawo od bieżącej pozycji, więc ich odrzucenie nie stanowi problemu (i faktycznie poprawia wydajność).Ze względu na
M!
konfigurację wszystkie te mecze zostaną zwrócone ze sceny, połączone z liniami.To sortuje linie poprzedniego wyniku według długości. Odbywa się to poprzez dopasowanie linii do
.+
. Następnie$
aktywuje formę „sortowania według”, dzięki czemu dopasowanie jest zastępowane$.&
określaniem kolejności sortowania.$.&
Sama zastępuje mecz z jego długości. Na koniec#
opcja mówi Retinie, aby sortowała numerycznie (w przeciwnym razie traktowałaby powstałe liczby jako łańcuchy i sortowała je leksykograficznie).Wreszcie, po prostu zachowujemy tylko pierwszą linię, używając etapu grep z pustym wyrażeniem regularnym (który zawsze pasuje) i limitem
1
.źródło
Perl,
8785Jest to anonimowa funkcja, która zwraca pierwsze (według pozycji) najkrótszych podciągów
$_[0]
, które nie występują w$_[1]
lubundef
jeśli takie podciąg nie istnieje.Program testowy z ciągami zaczerpniętymi z odpowiedzi @ iAmMortos, przetestowany w Perlu 5.22.1:
źródło
Haskell, 72 bajty
Przykład użycia:
"abcd" # "dabc"
->"cd"
.Prosta implementacja: zbuduj wszystkie podciągi
a
i zachowaj te, które się nie pojawiająb
.argmin
zwraca element listy, który minimalizuje funkcję otrzymują 2nd argument tutaj:length
.źródło
argmin
! Wydaje się to niezwykle przydatne.Pyth -
96 bajtówWypróbuj online tutaj .
źródło
C #, 152 bajty
źródło
Rubinowy, 70 bajtów
Zbiera wszystkie podciągi o określonej długości z pierwszego ciągu, a jeśli istnieje taki, którego nie ma w drugim ciągu, zwróć go.
źródło
Burleska - 26 bajtów
W tej chwili najkrótszą drogą, jaką mogę wymyślić, jest:
źródło
Japt , 14 bajtów
Wypróbuj online!
Zwraca,
undefined
jeśli nie ma prawidłowego podłańcucha . Różni się to od zwracania ciągu „niezdefiniowany” , chociaż różnica jest widoczna tylko z powodu flagi -Q.Wyjaśnienie:
źródło
Japt
-h
, 11 bajtówSpróbuj
źródło