Необычная замена строки

16

пусть S, aи bкаждый представляет собой строку

Цель: Написать стандартную строку заменить функцию , где вы заменить все вхождения aв строку Sс bтех пор , как aэто уже не часть экземпляраb

например, если у нас есть строка S=My oh my that there is a big ol' that

и мы хотели сделать фантазии заменить a = thatи b = that thereмы бы заменить каждый экземпляр thatс that thereтех пор , как экземпляр thatуже не является экземпляромthat there

Таким образом, в этом случае вывод будет: My oh my that there is a big ol' that there

Первый thatне заменяется, потому что он уже является частью экземпляраthat there

Примечания

  • Все 3 входа должны быть строками, содержащими только печатные символы ascii

  • Ввод может быть дан как 3 отдельные строки или список из 3 строк

  • Ввод будет в порядке S, a, bесли иное не указано в ответе

  • Чтобы aсчитаться частью b, все экземпляры aдолжны быть частью экземпляра.b

Объяснение некоторых угловых случаев

Input:  ["1222", "22", "122"]
Output: "12122"

В приведенном выше примере последний 22заменяется. Даже если его часть является частью экземпляра b, его целостность НЕ является частью экземпляра b. Поскольку весь экземпляр aне является частью экземпляра, bон заменяется.

Input:  ["123 ", "23", "12"]
Output: "112 "

Этот тестовый пример иллюстрирует тот же случай, что и выше, но, возможно, немного более наглядно. Опять же, 2посередине является как частью экземпляра, aтак и частью экземпляра b, однако, поскольку все aне является частью экземпляра, bон все равно заменяется.

Input: ["Empty", "", "p"]
Output: "pEpmptpyp"

В приведенном выше контрольном примере пустая строка до и после pне заменяется, поскольку она может рассматриваться как часть экземпляра p.

Другие тестовые случаи

Input:  ["aabbaa", "aa", "aabb"]
Output: "aabbaabb"

Input:  ["Hello World!", "o", " no"]
Output: "Hell no W norld!"

Input: ["Wow, oh wow, seriously WOW that's... wow", "wow", "WOW,"]
Output: "Wow, oh WOW,, seriously WOW that's... WOW,"

Input: ["Empty", "", "b"]
Output: "bEbmbpbtbyb"

Input: ["Empty", "b", "br"]
Output: "Empty"

Input: ["Empty", "pty", "Empty"]
Output: "Empty"

Input:  ["aabbaaa", "aa", "PP"]
Output: "PPbbPPa"

Input:  ["121212","1","121"]
Output: "121212"

Это вопрос для Code-Golf, поэтому выигрывает самый короткий ответ в байтах.

Quinn
источник

Ответы:

6

Perl 6 , 76 байт

{$^b;$^a;&{S:g/$a<?{$!=$/;all m:ex/$b/>>.&{$!.to>.to||.from>$!.from}}>/$b/}}

Попробуйте онлайн!

Блок анонимного кода, который принимает ввод карри, как f(a,b)(s).

Я почти уверен, что это соответствует цели вопроса. По сути, он делает замену только в том случае, если позиция aне находится ни в одном из перекрывающихся совпадений b.

Джо Кинг
источник
2
однако в тестах есть 2p: pEpmpptpypвместо вместоpEpmptpyp
Науэль Фуий
@ Науэль Исправлено. Это также должно относиться и к другим контрольным случаям (и я думаю, что это первым
Джо Кинг,
@JoKing К сожалению , после переосмысления некоторых из тестов указывали, я думаю , что последний тест потерпит неудачу [ 1222, 22, 122] -> 12122. Я обновил вопрос, чтобы уточнить и принести извинения, что я не разъяснил этот угловой случай ранее.
Куинн
у меня была похожая проблема s/(?!$b)$a/$b/g, когда $ a пусто, потому что мне pсоответствовала пустая строка после того, как это было (?!p)нужно(?<!p)(?!p)
Науэль Фуйе
1
@ Куинн Исправлено, я думаю?
Джо Кинг
5

Древесный уголь , 55 байт

≔⁰εF⌕AθηF‹‹ιε⬤⌕Aθζ∨‹ικ›⁺ιLη⁺κLζ«≔⁺⁺ω✂θει¹ζω≔⁺ιLηε»⁺ω✂θε

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

≔⁰ε

Инициализируйте переменную, чтобы показать, где закончилось последнее замененное совпадение.

F⌕Aθη

Найти все совпадающие совпадения aв S.

F‹‹ιε

Если следующий матч не перекрывает последнюю успешную замену ...

⬤⌕Aθζ∨‹ικ›⁺ιLη⁺κLζ«

... и это также не перекрывает копию bв S...

≔⁺⁺ω✂θει¹ζω

... затем объединить промежуточную подстроку между последним совпадением и этим совпадением с bвыходной строкой ...

≔⁺ιLηε

... и обновить последнюю переменную конца совпадения до конца этого нового совпадения.

»⁺ω✂θε

В конце добавьте остаток Sи выведите результат.

Нил
источник
1
@tsh Хорошо, это полное переписывание, я надеюсь, что теперь оно охватывает все возможные случаи ...
Нил
1
@ Нил, я верю, что это также верно!
Куинн
@ Нил, я верю, что это действительно сейчас.
TSH
@ Куинн Ох, это заставляет меня первым сделать их ответ верным? Ухоженная!
Нил
@Neil Я верю, что у ДжоКинга тоже есть правильный ответ
Куинн,
3

Wolfram Language (Mathematica) , 43 122 96 88 байт

##2~StringReplacePart~Cases[#2~P~#,{a_,b_}/;And@@(#2<b||#>a&@@@P@##2)]&
P=StringPosition

Попробуйте онлайн!

+79: должно быть исправлено.

Звоните как f[a,S,b].

                                                                      & (* a function which finds *)
                            #2~P~#,                                     (* the positions {start,end} where a occurs in S *)
                      Cases[       {a_,b_}/;And@@(#2<b||#>a&@@@     )]  (* which are not a subrange of any of the *)
                                                               P@##2    (* positions of b in S, *)
##2~StringReplacePart~                                                  (* and replaces those parts of the string with b *)
P=StringPosition
attinat
источник
2
Сбои для 121212, 1, 121 - должен
Falco
@attinat Кажется, мне это удалось!
Куинн
1

Perl 5 ( -lpF/;/), 41 байт

($_,$a,$b)=@F;s/(?<!(?=$b).)(?!$b)$a/$b/g

TIO

Науэль Фуйе
источник
[ 1222, 22, 122] Должен выдать 12122, но у вас выходы11222
Quinn
хорошо, не понял этого, может быть исправлен, и короче
Науэль Фуий
О, нет, на самом деле последний тестовый пример имеет слишком много 12s, оказывается, вопрос, который я задал, был гораздо сложнее, чем я думал!
Куинн
@Quinn, мне кажется , что это не соответствует: 123, 23, 12-> 112а 1212, 1, 121-> 1212(? Почему это не должно быть 121212)
Науэль FOUILLEUL
Похоже, что следует уточнить, какие позиции Sне должны совпадать bили какую часть пропустить, прежде чем искать следующий матч
Науэль Фуйе