Ciągi z kontekstem
Na potrzeby tego wyzwania ciąg z kontekstem jest potrójnym ciągiem zwanym lewym kontekstem , częścią danych i prawym kontekstem . Reprezentuje podciąg dłuższego łańcucha. Używamy pionowej rury |
jako separatora, więc przykładem łańcucha z kontekstem jest cod|e-go|lf
, gdzie jest lewy kontekst cod
, dane są e-go
, a prawy kontekst lf
. Ten przykład przedstawia podciąg e-go
w code-golf
.
Teraz, aby połączyć dwa ciągi z kontekstem, postępujemy w następujący sposób, używając aa|bcc|dee
i cc|de|eee
jako przykładów. Wyrównujemy ciągi jak na schemacie
a a|b c c|d e e
c c|d e|e e e
tak aby ich części danych sąsiadowały. W tym przypadku częścią danych konkatenacji jest konkatenacja części danych bccde
. Lewy kontekst to część, która rozciąga się dalej na lewo od pierwszej części danych, w tym przypadku aa
. Podobnie jest właściwy kontekst eee
, więc konkatenacja jest ciągiem z kontekstem aa|bccde|eee
. W drugim przykładzie zastanów się, a|bb|cd
a aabb|cd|
gdy drugie słowo ma pusty prawy kontekst. Schemat wyrównania to
a|b b|c d
a a b b|c d|
gdzie lewy kontekst drugiego słowa rozciąga się dalej niż pierwszy. Konkatenacja jest aa|bbcd|
.
Ale poczekaj, jest gotcha: jeśli litery na schemacie wyrównania nie pasują, konkatenacja nie istnieje! Na przykład, w schemacie aa|bb|cc
oraz c|c|c
Is
a a|b b|c c
c|c|c
gdzie b
i c
w czwartej kolumnie się nie zgadzają, więc nie można ich połączyć.
Zadanie
Twoim zadaniem jest napisanie programu, który przyjmuje dwa ciągi z kontekstem, którego części są oddzielone |
jak powyżej, i wyświetla ich konkatenację, jeśli istnieje, i coś innego, jeśli nie. „Coś innego” może mieć dowolną wartość, w tym brak danych wyjściowych, o ile nie jest to prawidłowy ciąg znaków z kontekstem i jest taki sam we wszystkich przypadkach. Zgłaszanie błędu jest jednak niedopuszczalne. Możesz podać program STDIN-to-STDOUT lub funkcję, a funkcje anonimowe są również akceptowane. Wygrywa najmniejsza liczba bajtów, a standardowe luki są niedozwolone.
Przypadki testowe
aa|bcc|dee cc|de|eee -> aa|bccde|eee
a|bb|cd aabb|cd| -> aa|bbcd|
a|b|cccd aab|cc|c -> aa|bcc|cd
a|b|c b||cd -> a|b|cd
aa|bb|cc c|c|c -> None
aaa|b|c abb|cd|d -> None
|bb|cd abb|c|ed -> None
a|b|c a||cd -> None
|1<2=""
do definicji&
powinno rozwiązać ten problem. Przepraszam, że nie'|'
znaków, gdy łańcuchy nie pasują, jest w porządku?Python (242 bajty)
Wyjaśnienie
Funkcja lambda
m
zwraca dłuższy z dwóch ciągów, o ile mają one wspólny przedrostek. Czyni to poprzez złączenie pusty łańcuch''
w miejsce brakujących wartości, a następnie obracając wynik (który może przyjąć formyaa
,ab
,a
, lubb
w przypadku meczu / niedopasowanie / nierówne długości) na zestaw unikalnych znaków w każdej pozycji.join
oczekuje jednego argumentu, więc rozpakowanie zestawu z więcej niż jednym elementem spowoduje, że podniesie on wartośćTypeError
.Główna funkcja wtedy
m
do połączenia lewego kontekstu i części danych pierwszego słowa z lewym kontekstem drugiego (od prawej do lewej po odwróconych ciągach)m
do połączenia właściwego kontekstu pierwszego słowa z częścią danych i odpowiedniego kontekstu drugiegoCzęści danych dwóch oryginalnych słów są przycinane z prawej i lewej strony nowych kontekstów.
Ponieważ wiemy, że przesunięcia powodują
m
podniesienie aTypeError
, w takich przypadkach wychwytujemy wyjątek i domyślnie wracamyNone
.Testowanie
Wynik
źródło