Отношения назад


10

Напишите программу или функцию, которая, учитывая две строки ASCII Aи B, создаст строки A'и в B'которых общие подстроки перевернуты на свои места. Процесс поиска A'выглядит следующим образом:

  1. A' изначально пуст.
  2. Если первый символ Aнаходится в B, найдите самый длинный префикс Aкоторого является подстрокой B. Удалите этот префикс Aи добавьте его к A'.
  3. В противном случае удалите этот первый символ из Aи добавьте его в A'.
  4. Повторите шаги 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"

Самый короткий код в байтах побеждает.


Предполагается ли, что все вводимые данные являются строчными ASCII? Ожидается ли точный вывод, "cba bba", "badcba"включая кавычки и запятую?
AdmBorkBork

@TimmyD Точный формат ввода / вывода - ваш выбор. Вы не можете предполагать, что ввод - это строчный ASCII - это может быть любой печатный ASCII.
orlp

Является ли пустая строка допустимым вводом?
MtnViewMark

@MtnViewMark Да.
orlp

Ответы:



2

Haskell, 120 111 байтов

import Data.List
a&b=(a#b,b#a)
[]#_=[]
(a:y)#b=[a]%y where p%(i:w)|reverse(i:p)`isInfixOf`b=(i:p)%w;p%x=p++x#b

Тестовые прогоны:

λ: "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")

1

SWI-Пролог, 312 байт

a(A,B,X,Y):-b(A,B,"",X),b(B,A,"",Y).
b(A,B,R,Z):-A="",R=Z;sub_string(A,0,1,_,C),(sub_string(B,_,1,_,C),(string_length(A,J),I is J-1,between(0,I,K),L is J-K,sub_string(A,0,L,_,S),sub_string(B,_,L,_,S),string_codes(S,E),reverse(E,F),string_codes(Y,F));S=C,Y=C),string_concat(S,V,A),string_concat(R,Y,X),b(V,B,X,Z).

Пример: a("birds flying high","whistling high nerds",X,Y).выходы

X = "bisdr flyhgih gni",
Y = "wihstlhgih gni nesdr" .

Путь, путь слишком долго решение , которое идет слишком показать , как многословный Пролог при работе со строками. Можно было бы сократить эту вещь, используя массивы кодов ( `birds flying high`) вместо строк ( "birds flying high").


1

Python 2.7, 169 156 152 141 байт

m=lambda A,B:(b(A,B),b(B,A))
def b(A,B,C=''):
 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:]
 return C

Функция mпринимает 2 строки в качестве входных данных. Она bдважды вызывает функцию, которая выполняет фактическую обработку в соответствии со спецификациями.
Демо здесь .
Тестирование это -

l=[("abc bab", "abdabc"),
("abcde", "abcd bcde"),
("hello test", "test banana"),
("birds flying high", "whistling high nerds")]
for e in l:
    print m(*e)

ВЫХОДЫ:

('cba bba', 'badcba')
('dcbae', 'dcba edcb')
('hello tset', 'tset banana')
('bisdr flyhgih gni', 'wihstlhgih gni nesdr')

PS: спасибо orlp за решение с помощью next()


m=lambda A,B:(b(A,B),b(B,A))
orlp

Также вы можете заменить while len(A)>0просто while A. Точно так же if len(p)>0становится if p.
orlp

if len(p)тоже может быть if p. (Уже сказано выше, но вы пропустили это.)
mbomb007

@ mbomb007 Не правильно прочитал. Просто заменили len(p)>0на len(p). Спасибо за это :)
Kamehameha

Еще короче 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:].
orlp
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.