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


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, поэтому выигрывает самый короткий ответ в байтах.


Ответы:


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

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