Thay thế chuỗi ưa thích


16

hãy S, abmỗi đại diện cho một chuỗi

Mục tiêu: Viết hàm thay thế chuỗi tiêu chuẩn trong đó bạn thay thế tất cả các lần xuất hiện atrong một chuỗi Svới bđiều kiện akhông phải là một phần của thể hiện củab

ví dụ: nếu chúng ta có chuỗi S=My oh my that there is a big ol' that

và chúng tôi muốn thực hiện một thay thế ưa thích a = thatb = that therechúng tôi sẽ thay thế mọi trường hợp thatvới that theremiễn là trường hợp thatkhông phải là một thể hiện củathat there

Vì vậy, trong trường hợp này, đầu ra sẽ là: My oh my that there is a big ol' that there

Cái đầu tiên thatkhông được thay thế bởi vì nó đã là một phần của thể hiện củathat there

Ghi chú

  • Tất cả 3 đầu vào phải là các chuỗi chỉ chứa các ký tự ascii có thể in

  • Đầu vào có thể được cung cấp dưới dạng 3 chuỗi riêng biệt hoặc danh sách 3 chuỗi

  • Đầu vào sẽ được theo thứ tự S, a, btrừ trường hợp quy định tại các câu trả lời

  • Để ađược coi là một phần của b, tất cả các trường hợp aphải là một phần của một thể hiệnb

Một số trường hợp góc giải thích

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

Trong trường hợp trên ví dụ sau 22được thay thế. Mặc dù một phần của nó là một phần của thể hiện b, toàn bộ nó KHÔNG phải là một phần của thể hiện b. Vì toàn bộ thể ahiện không phải là một phần của thể hiện của bnó được thay thế.

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

Trường hợp thử nghiệm này minh họa trường hợp tương tự như trên nhưng có lẽ theo một cách rõ ràng hơn một chút. Một lần nữa, 2ở giữa là cả một phần của một thể hiện acũng như một phần của một thể hiện b, tuy nhiên vì tất cả akhông phải là một phần của thể hiện của bnó vẫn được thay thế.

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

Trong trường hợp thử nghiệm ở trên, cả chuỗi rỗng trước và sau chuỗi pkhông được thay thế vì hoàn toàn có thể được coi là một phần của thể hiện của p.

Các trường hợp kiểm tra khác

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"

Đây là một câu hỏi cho mã golf, vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


Câu trả lời:


6

Perl 6 , 76 byte

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

Hãy thử trực tuyến!

Khối mã nặc danh mà mất đầu vào, như thế f(a,b)(s).

Tôi khá chắc chắn rằng điều này phù hợp với mục đích của câu hỏi. Về cơ bản, nó chỉ thực hiện thay thế nếu vị trí củaa không nằm trong bất kỳ trận đấu chồng chéo nào của b.


2
tuy nhiên trong các thử nghiệm có 2p: pEpmpptpypthay vìpEpmptpyp
Nahuel Fouilleul

@Nahuel Đã sửa. Điều này cũng sẽ xử lý các trường hợp thử nghiệm khác (và tôi nghĩ là người đầu tiên làm như vậy)
Jo King

@JoKing Đáng tiếc là sau khi suy nghĩ lại một số các trường hợp thử nghiệm đã chỉ ra, tôi nghĩ rằng trường hợp thử nghiệm cuối cùng sẽ thất bại [ 1222, 22, 122] -> 12122. Tôi đã cập nhật câu hỏi để làm rõ và xin lỗi rằng tôi đã không làm cho trường hợp góc này rõ ràng hơn trước đó.
Quinn

tôi gặp vấn đề tương tự s/(?!$b)$a/$b/g, khi $ a trống vì chuỗi rỗng sau pkhớp với (?!p)tôi cần(?<!p)(?!p)
Nahuel Fouilleul

1
@Quinn Cố định tôi nghĩ sao?
Jo King

5

than củi , 55 byte

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

Hãy thử trực tuyến!Liên kết là phiên bản dài dòng của mã. Giải trình:

≔⁰ε

Khởi tạo một biến để hiển thị nơi trận đấu thay thế cuối cùng kết thúc.

F⌕Aθη

Tìm tất cả các trận đấu chồng chéo của atrong S.

F‹‹ιε

Nếu trận đấu tiếp theo không trùng lặp lần thay thế thành công cuối cùng ...

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

... và nó cũng chồng lấp không có bản sao btrong S...

≔⁺⁺ω✂θει¹ζω

... sau đó nối chuỗi con trung gian giữa trận đấu cuối cùng và trận đấu này với bchuỗi đầu ra ...

≔⁺ιLηε

... và cập nhật biến kết thúc trận đấu cuối cùng vào cuối trận đấu mới này.

»⁺ω✂θε

Cuối cùng, thêm vào bất kỳ phần còn lại Svà xuất kết quả.


1
@tsh OK đây là một bản viết lại hoàn chỉnh, tôi hy vọng nó hiện bao gồm tất cả các trường hợp có thể ...
Neil

1
@Neil Tôi tin rằng điều này cũng hợp lệ!
Quinn

@Neil Tôi tin rằng điều này là hợp lệ ngay bây giờ.
tsh

@Quinn Ooh, điều đó làm cho tôi đầu tiên để làm cho câu trả lời của họ hợp lệ? Khéo léo!
Neil

@Neil Tôi tin rằng JoKing cũng có câu trả lời hợp lệ
Quinn

3

Ngôn ngữ Wolfram (Mathicala) , 43 122 96 88 byte

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

Hãy thử trực tuyến!

+79: nên được sửa.

Gọi như 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
Thất bại cho 121212, 1, 121 - nên xuất 121212
Falco

@attinat Có vẻ cố định với tôi!
Quinn

1

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

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

TIO


[ 1222, 22, 122] Nên đầu ra 12122, nhưng kết quả đầu ra của bạn11222
Quinn

ok không hiểu điều đó, có thể đã sửa và ngắn hơn
Nahuel Fouilleul

Ồ không thực sự trường hợp thử nghiệm cuối cùng có quá nhiều 12s, hóa ra câu hỏi tôi đưa ra khó hơn nhiều so với tôi nghĩ ban đầu!
Quinn

@Quinn, có vẻ như với tôi rằng nó không phù hợp: 123, 23, 12-> 112nhưng 1212, 1, 121-> 1212(? Tại sao nó không nên 121212)
Nahuel Fouilleul

có vẻ như điều cần làm rõ là vị trí nào Skhông phù hợp với bhoặc phần nào nên bỏ qua trước khi tìm kiếm trận đấu tiếp theo
Nahuel Fouilleul
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.