Фантазний рядок замінити


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"

Це питання для коду-гольфу, тому найкоротша відповідь у байтах виграє.


Відповіді:


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: in pEpmpptpypзамістьpEpmptpyp
Nahuel Fouilleul

@Nahuel Виправлено. Це також має
Джо Кінг

@JoKing На жаль , після переосмислення деяких з тестів вказували, я думаю , що останній тест зазнає невдачі [ 1222, 22, 122] -> 12122. Я оновив питання, щоб уточнити і вибачитися, що раніше я не робив більш чітким цей кутовий випадок.
Квін

У мене була аналогічна проблема s/(?!$b)$a/$b/g, коли $ a порожня, тому що порожня рядок після pбула (?!p)потрібна мені потрібною(?<!p)(?!p)
Nahuel Fouilleul

1
@Quinn Виправлений я думаю?
Джо Кінг

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
@Neil Я вважаю, що це також справедливо!
Квін

@Neil Я вважаю, що це зараз дійсно.
TSH

@Quinn Ooh, це змушує мене спочатку зробити їх відповідь достовірною? Акуратно!
Ніл

@Neil Я вважаю, що JoKing також має вагому відповідь
Квін

3

Мова Вольфрама (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 - має вивести 121212
Falco

@attinat Здається, виправлений до мене!
Квін

1

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

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

ТІО


[ 1222, 22, 122] Повинен видати 12122, але у вас виходи11222
Quinn

гаразд, не зрозумів цього, можливо, виправлено, і коротше
Nahuel Fouilleul

О, насправді останній тестовий випадок не має занадто багато 12с, виявляється, що питання, яке я поставив, було набагато складніше, ніж я спочатку думав!
Квін

@Quinn, мені здається , що це не відповідає: 123, 23, 12-> 112а 1212, 1, 121-> 1212(? Чому це не повинно бути 121212)
Науель FOUILLEUL

Мабуть, слід уточнити, на яких позиціях Sне слід відповідати bабо з якою частиною пропустити, перш ніж шукати наступного матчу
Nahuel Fouilleul
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.