Süslü Dize Değiştir


16

let S, ave bher bir dize temsil

Hedef: Eğer tüm tekrarlarını değiştirmek nerede standart dize işlevini yerine yaz abir dizede Sile bsürece azaten bir örneğiyle bir parçası değildirb

örneğin, S=My oh my that there is a big ol' that

ve bir fantezi ile değiştirin yapmak istediği a = thatve b = that therebiz her örneği yerini alacak thatolan that thereörneğinin sürece thatzaten bir örneği değilthat there

Yani bu durumda çıktı: My oh my that there is a big ol' that there

Birincisi thatdeğiştirilmedi çünkü zaten bir örneğinin parçasıthat there

notlar

  • 3 girişin tümü yalnızca yazdırılabilir ascii karakterleri içeren dizeler olmalıdır

  • Giriş 3 ayrı dize veya 3 dize listesi olarak verilebilir

  • Girdi sırayla olacak S, a, baksi cevap belirtilmediği sürece

  • Amacıyla için abir parçası olarak kabul edilecek börneğinin tüm aörneğine bir parçası olmalıdırb

Açıklanan Bazı Köşe Kılıfları

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

Yukarıdaki örnekte, ikincisi 22değiştirilir. Bir kısmı bir örneğinin parçası olsa da b, tamamı bir örneğinin parçası DEĞİLDİR b. Örneğinin tamamı bir örneğinin aparçası olmadığından bdeğiştirilir.

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

Bu test durumu yukarıdaki ile aynı durumu ancak belki biraz daha açık bir şekilde göstermektedir. Yine 2ortada, bir örneğin hem bir örneğinin bir parçası hem de bir örneğinin bir aparçasıdır b, ancak hepsi abunun örneğinin bir parçası olmadığından bhala değiştirilir.

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

Yukarıdaki test durumunda, hem öncesinde hem de sonrasındaki boş dize p, örneğin örneğinin bir parçası olarak kabul edilebilir p.

Diğer Test Durumları

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"

Bu kod golf için bir soru, bu yüzden bayttaki en kısa cevap kazanıyor.


Yanıtlar:


6

Perl 6 , 76 bayt

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

Çevrimiçi deneyin!

Anonim kod bloğu girişini alır, mesela f(a,b)(s).

Eminim bu sorunun amacı ile örtüşüyor. Temel olarak, ikame işlemini ancak konumu a, çakışan eşleşmelerin hiçbirinde değilse yapar b.


2
ancak testlerde 2p var: pEpmpptpypyerinepEpmptpyp
Nahuel Fouilleul

@Nahuel Düzeltildi. Bu aynı zamanda diğer test vakalarını da ele almalıdır (ve bence bunu ilk yapan kişi)
Jo King

İşaret Test vakalarının bazı yeniden düşünmek sonra maalesef @JoKing, son test durumu başarısız olacağını düşünüyorum [ 1222, 22, 122] -> 12122. Bu köşe vakasını daha önce netleştirmediğimi açıklığa kavuşturmak ve özür dilemek için soruyu güncelledim.
Quinn

i ile benzer bir sorunu vardı s/(?!$b)$a/$b/g, $ a boş olduğunda boş dize sonra peşleşen çünkü (?!p)gerekli(?<!p)(?!p)
Nahuel Fouilleul

1
@Quinn Sabit sanırım?
Jo King

5

Kömür , 55 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

≔⁰ε

Son değiştirilen eşleşmenin nerede bittiğini göstermek için bir değişkeni başlatın.

F⌕Aθη

Tüm örtüşen eşleşmeleri bul aiçinde S.

F‹‹ιε

Bir sonraki maç son başarılı yedek ile çakışmazsa ...

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

... ve aynı zamanda hiçbir kopyasını örtüşür biçinde S...

≔⁺⁺ω✂θει¹ζω

... sonra son eşleme ile bu eşleşme arasındaki ara alt dizeyi bçıkış dizesiyle birleştirin ...

≔⁺ιLηε

... ve son maç sonu değişkenini bu yeni maçın sonuna güncelleyin.

»⁺ω✂θε

Sonunda, kalanını ekleyin Sve sonucu alın.


1
@tsh Tamam bu tam bir yeniden yazma, umarım bu şimdi tüm olası vakaları kapsar ...
Neil

1
@Neil Bunun da geçerli olduğuna inanıyorum!
Quinn

@Neil Bunun geçerli olduğuna inanıyorum.
tsh

@Quinn Ooh, bu beni ilk cevaplarını geçerli kılıyor mu? Temiz!
Neil

@Neil JoKing'in de geçerli bir cevabı olduğuna inanıyorum
Quinn

3

Wolfram Dili (Mathematica) , 43 122 96 88 bayt

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

Çevrimiçi deneyin!

+79: düzeltilmelidir.

Olarak arayın 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 için başarısız - çıktı 121212
Falco

@attinat Bana sabit görünüyor!
Quinn

1

Perl 5 ( -lpF/;/), 41 bayt

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

TIO


[ 1222, 22, 122] Gerektiği çıkışı 12122, ama seninki çıkışları11222
Quinn

Tamam, belki sabit ve daha kısa
anlamadım

Oh, aslında son test vakasında çok fazla 12s var, yaptığım soru aslında düşündüğümden çok daha zor oldu!
Quinn

: @Quinn, o değil tutarlı geliyor bana 123, 23, 12> - 112ama 1212, 1, 121-> 1212(? Olmamalı neden 121212)
Nahuel FOUILLEUL

netleştirilmesi Sgereken şey b, bir sonraki maçı
aramadan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.