пусть 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, поэтому выигрывает самый короткий ответ в байтах.
Ответы:
Perl 6 , 76 байт
Попробуйте онлайн!
Блок анонимного кода, который принимает ввод карри, как
f(a,b)(s)
.Я почти уверен, что это соответствует цели вопроса. По сути, он делает замену только в том случае, если позиция
a
не находится ни в одном из перекрывающихся совпаденийb
.источник
pEpmpptpyp
вместо вместоpEpmptpyp
1222
,22
,122
] ->12122
. Я обновил вопрос, чтобы уточнить и принести извинения, что я не разъяснил этот угловой случай ранее.s/(?!$b)$a/$b/g
, когда $ a пусто, потому что мнеp
соответствовала пустая строка после того, как это было(?!p)
нужно(?<!p)(?!p)
Древесный уголь , 55 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Инициализируйте переменную, чтобы показать, где закончилось последнее замененное совпадение.
Найти все совпадающие совпадения
a
вS
.Если следующий матч не перекрывает последнюю успешную замену ...
... и это также не перекрывает копию
b
вS
...... затем объединить промежуточную подстроку между последним совпадением и этим совпадением с
b
выходной строкой ...... и обновить последнюю переменную конца совпадения до конца этого нового совпадения.
В конце добавьте остаток
S
и выведите результат.источник
Wolfram Language (Mathematica) ,
431229688 байтПопробуйте онлайн!
+79: должно быть исправлено.
Звоните как
f[a,S,b]
.источник
Perl 5 (
-lpF/;/
), 41 байтTIO
источник
1222
,22
,122
] Должен выдать12122
, но у вас выходы11222
12
s, оказывается, вопрос, который я задал, был гораздо сложнее, чем я думал!123
,23
,12
->112
а1212
,1
,121
->1212
(? Почему это не должно быть121212
)S
не должны совпадатьb
или какую часть пропустить, прежде чем искать следующий матч