Fancy String Replace

16

pozwolić S, aa bkażdy reprezentuje ciąg

Cel: Wpisz ciąg zastąpić standardową funkcję gdzie zastąpić wszystkie wystąpienia aw ciąg Sz btak długo, jak anie jest już częścią instancjib

na przykład, jeśli mamy ciąg S=My oh my that there is a big ol' that

i chcieliśmy zrobić fantazyjny zastąpić a = thati b = that therechcielibyśmy zastąpić wszystkie wystąpienia thatz that theretak długo, jak instancja thatnie jest już instancjąthat there

W takim przypadku dane wyjściowe byłyby następujące: My oh my that there is a big ol' that there

Pierwszy thatnie jest zastępowany, ponieważ jest już częścią wystąpieniathat there

Notatki

  • Wszystkie 3 dane wejściowe muszą być ciągami zawierającymi tylko drukowane znaki ascii

  • Dane wejściowe można podać jako 3 osobne ciągi lub listę 3 ciągów

  • Wejście będzie w porządku S, a, bo ile nie zaznaczono inaczej w odpowiedzi

  • Aby azostać uznanym za część b, wszystkie wystąpienia amuszą być częścią wystąpieniab

Wyjaśniono niektóre przypadki narożne

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

W powyższym przykładzie ten ostatni 22został zastąpiony. Chociaż część tego jest częścią instancji b, całość NIE jest częścią instancji b. Ponieważ cała instancja anie jest częścią instancji b, jest zastępowana.

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

Ten przypadek testowy ilustruje ten sam przypadek jak powyżej, ale być może w nieco bardziej wyraźny sposób. Ponownie, 2w środku jest zarówno część wystąpienia, ajak i część wystąpienia b, jednak ponieważ wszystko anie jest częścią wystąpienia b, jest ono nadal zastępowane.

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

W powyższym przypadku testowym zarówno pusty ciąg przed, jak i po nim pnie są zastępowane, ponieważ można je w całości uznać za część wystąpienia p.

Inne przypadki testowe

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"

To jest pytanie do golfa kodowego, więc wygrywa najkrótsza odpowiedź w bajtach.

Quinn
źródło

Odpowiedzi:

6

Perl 6 , 76 bajtów

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

Wypróbuj online!

Anonimowy blok kodu, który pobiera dane wejściowe curry, jak f(a,b)(s).

Jestem prawie pewien, że pasuje to do treści pytania. Zasadniczo dokonuje podstawienia tylko wtedy, gdy pozycjaa nie mieści się w żadnym z nakładających się dopasowań b.

Jo King
źródło
2
jednak w testach jest 2p: pEpmpptpypzamiastpEpmptpyp
Nahuel Fouilleul
@Nahuel Naprawiono. Powinno to również obsługiwać inne przypadki testowe (i myślę, że to pierwszy)
Jo King
@JoKing Niestety po przemyślenie niektórych przypadkach badania wskazał, myślę, że ostatni przypadek próba zakończy się niepowodzeniem [ 1222, 22, 122] -> 12122. Zaktualizowałem pytanie, aby wyjaśnić i przeprosić, że wcześniej nie wyjaśniłem tej sprawy w rogu.
Quinn
miałem podobny problem z tym s/(?!$b)$a/$b/g, że $ a jest pusty, ponieważ ppasujący pusty łańcuch po był (?!p)potrzebny(?<!p)(?!p)
Nahuel Fouilleul
1
@Quinn Naprawiono myślę?
Jo King
5

Węgiel drzewny , 55 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

≔⁰ε

Zainicjuj zmienną, aby pokazać, gdzie zakończyło się ostatnie zastąpione dopasowanie.

F⌕Aθη

Znajdź wszystkie pokrywające się mecze aw S.

F‹‹ιε

Jeśli następny mecz nie pokrywa się z ostatnim udanym zamiennikiem ...

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

... i nie nakłada się też na żadną kopię bw S...

≔⁺⁺ω✂θει¹ζω

... następnie połącz pośredni podciąg między ostatnim dopasowaniem a tym dopasowaniem z bciągiem wyjściowym ...

≔⁺ιLηε

... i zaktualizuj ostatnią zmienną końcową dopasowania do końca tego nowego dopasowania.

»⁺ω✂θε

Na koniec dodaj resztę Si wyślij wynik.

Neil
źródło
1
@tsh OK, to jest kompletne przepisanie, mam nadzieję, że teraz obejmuje wszystkie możliwe przypadki ...
Neil
1
@Neil Uważam, że jest to również ważne!
Quinn,
@ Neil Uważam, że jest to teraz ważne.
tsh
@Quinn Ooh, czy to sprawia, że ​​najpierw muszę udzielić odpowiedzi? Schludny!
Neil
@Neil Wierzę, że JoKing również ma ważną odpowiedź
Quinn
3

Wolfram Language (Mathematica) , 43 122 96 88 bajtów

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

Wypróbuj online!

+79: należy naprawić.

Jak zadzwonić 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
źródło
2
Nie powiedzie się dla 121212, 1, 121 - powinien dać wynik 121212
Falco
@attinat Wygląda na naprawione dla mnie!
Quinn
1

Perl 5 ( -lpF/;/), 41 bajtów

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

TIO

Nahuel Fouilleul
źródło
[ 1222, 22, 122] Powinien wyjść 12122, ale wyjścia yours11222
Quinn
ok, nie rozumiem tego, może naprawione i krótsze
Nahuel Fouilleul
O nie, tak naprawdę ostatni przypadek testowy ma o jeden za dużo 12s, okazuje się, że zadane przeze mnie pytanie było znacznie trudniejsze, niż początkowo myślałem!
Quinn,
@Quinn, wydaje mi się, że nie jest to zgodne: 123, 23, 12-> 112ale 1212, 1, 121-> 1212(dlaczego nie powinno być 121212)
Nahuel FOUILLEUL
wydaje się, że należy wyjaśnić, które pozycje Snie powinny się zgadzać blub w której części pominąć przed rozpoczęciem następnego meczu
Nahuel Fouilleul