Строки с контекстом
Для целей этой задачи строка с контекстом представляет собой тройку строк, называемых левым контекстом , частью данных и правым контекстом . Он представляет подстроку более длинной строки. Мы используем вертикальную трубу |
в качестве разделителя, поэтому пример строки с контекстом: cod|e-go|lf
где левый контекст cod
, данные e-go
и правый контекст lf
. Этот пример представляет собой подстроку e-go
из code-golf
.
Теперь, чтобы объединить две строки с контекстом, мы поступим следующим образом, используя aa|bcc|dee
и в cc|de|eee
качестве примеров. Мы выравниваем строки как на диаграмме
a a|b c c|d e e
c c|d e|e e e
так что их части данных являются смежными. Часть данных конкатенации в данном случае является конкатенацией частей данных bccde
. В этом случае левый контекст - это часть, которая расширяет дальше слева от первой части данных aa
. Точно так же правильный контекст eee
, поэтому конкатенация - это строка с контекстом aa|bccde|eee
. Для второго примера рассмотрим a|bb|cd
и aabb|cd|
, где второе слово имеет пустой правый контекст. Диаграмма выравнивания
a|b b|c d
a a b b|c d|
где левый контекст второго слова распространяется дальше, чем первый. Конкатенация есть aa|bbcd|
.
Но подождите, есть ошибка: если буквы диаграммы выравнивания не совпадают, конкатенация не существует! В качестве примера, диаграммы aa|bb|cc
и c|c|c
IS
a a|b b|c c
c|c|c
где b
и c
в четвертой колонке не согласны, поэтому они не могут быть объединены.
Задание
Ваша задача - написать программу, которая принимает две строки с контекстом, части которого разделены, |
как указано выше, и выводит их конкатенацию, если она существует, и что-то еще, если нет. «Что-то еще» может быть любым значением, включая отсутствие вывода, если оно не является допустимой строкой с контекстом и одинаково во всех случаях. Однако выбрасывание ошибки не допускается. Вы можете указать либо программу STDIN-to-STDOUT, либо функцию, и анонимные функции также принимаются. Наименьшее количество байтов выигрывает, и стандартные лазейки запрещены.
Тестовые случаи
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=""
к определению&
должно решить это. Извините, я не указал это более явно в спецификации, я отредактирую это.'|'
знаков, когда строки не совпадают, хорошо?Python (242 байта)
объяснение
Лямбда-функция
m
возвращает длинную из двух строк, если они имеют общий префикс. Она делает это путем конкатенации пустой строки''
вместо каких - либо недостающих значений, то поворачивая результат (который может принимать формыaa
,ab
,a
илиb
в случаях матча / рассогласование / разная длина) в набор уникальных символов в каждой позиции.join
ожидает один аргумент, поэтому распаковка набора с более чем одним элементом вызовет повышение значенияTypeError
.Основная функция тогда
m
для объединения левого контекста и части данных первое слово с левым контекстом второго (справа налево поверх перевернутых строк)m
для объединения правого контекста первого слова с частью данных и правого контекста второгоЧасти данных двух исходных слов обрезаются с правой и левой сторон нового контекста.
Поскольку мы знаем, что смещение вызывает
m
повышениеTypeError
, в этих случаях мы ловим исключение и возвращаемся неявноNone
.тестирование
Выход
источник