Напишите программу или функцию, которая, учитывая две строки ASCII A
и B
, создаст строки A'
и в B'
которых общие подстроки перевернуты на свои места. Процесс поиска A'
выглядит следующим образом:
A'
изначально пуст.- Если первый символ
A
находится вB
, найдите самый длинный префиксA
которого является подстрокойB
. Удалите этот префиксA
и добавьте его кA'
. - В противном случае удалите этот первый символ из
A
и добавьте его вA'
. - Повторите шаги 2-3, пока не
A
станет пустым.
Нахождение B'
производится аналогично.
пример
Давайте рассмотрим строки A = "abc bab"
и B = "abdabc"
. Ибо A'
вот что происходит:
A = "abc bab"
: Первый символ"a"
находится в B, а самый длинный префикс A, найденный в B, -"abc"
. Мы удаляем этот префикс из A и добавляем его обращение"cba"
к A '.A = " bab"
: Первый символ" "
отсутствует в B, поэтому мы удаляем этот символ из A и добавляем его в A '.A = "bab"
: Первый символ"b"
находится в B, а самый длинный префикс A, найденный в B, -"b"
. Мы удаляем этот префикс из A и добавляем его обращение (которое все еще"b"
) к A '.A = "ab"
: Первый символ"a"
находится в B, а самый длинный префикс A, найденный в B, -"ab"
. Мы удаляем этот префикс из A и добавляем его обращение"ba"
к A '.A = ""
: А пусто, поэтому мы остановимся.
Таким образом мы получаем A' = "cba" + " " + "b" + "ba" = "cba bba"
. Для B 'процесс аналогичен:
B = "abdabc" -> "a" in A, remove prefix "ab"
B = "dabc" -> "d" not in A, remove "d"
B = "abc" -> "a" in A, remove prefix "abc"
Таким образом мы получаем B' = "ba" + "d" + "cba" = "badcba"
.
Наконец, мы возвращаем две строки, т.е.
(A', B') = ("cba bba", "badcba")
Контрольные примеры
"abc bab", "abdabc" -> "cba bba", "badcba"
"abcde", "abcd bcde" -> "dcbae", "dcba edcb"
"hello test", "test banana" -> "hello tset", "tset banana"
"birds flying high", "whistling high nerds" -> "bisdr flyhgih gni", "wihstlhgih gni nesdr"
Самый короткий код в байтах побеждает.
"cba bba", "badcba"
включая кавычки и запятую?Ответы:
Pyth, 29 байт
Тест Жгут.
Формат ввода:
Выход:
источник
Haskell,
120111 байтовТестовые прогоны:
источник
SWI-Пролог, 312 байт
Пример:
a("birds flying high","whistling high nerds",X,Y).
выходыПуть, путь слишком долго решение , которое идет слишком показать , как многословный Пролог при работе со строками. Можно было бы сократить эту вещь, используя массивы кодов (
`birds flying high`
) вместо строк ("birds flying high"
).источник
Python 2.7,
169156152141 байтФункция
m
принимает 2 строки в качестве входных данных. Онаb
дважды вызывает функцию, которая выполняет фактическую обработку в соответствии со спецификациями.Демо здесь .
Тестирование это -
ВЫХОДЫ:
PS: спасибо orlp за решение с помощью
next()
источник
m=lambda A,B:(b(A,B),b(B,A))
while len(A)>0
простоwhile A
. Точно так жеif len(p)>0
становитсяif p
.if len(p)
тоже может бытьif p
. (Уже сказано выше, но вы пропустили это.)len(p)>0
наlen(p)
. Спасибо за это :)while A:j=next((j for j in range(len(A),0,-1)if A[:j]in B),1);C+=A[:j][::-1];A=A[j:]
.