สายอักขระแฟนซีแทนที่


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"

ในกรณีที่การทดสอบดังกล่าวข้างต้นทั้งสตริงว่างก่อนและหลังจะไม่ได้ถูกแทนที่เป็นเครือได้รับการพิจารณาเป็นส่วนหนึ่งของอินสแตนซ์ของpp

กรณีทดสอบอื่น ๆ

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 ดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ


ขอให้เรายังคงอภิปรายนี้ในการแชท
Quinn

คำตอบ:


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: pEpmpptpypแทนpEpmptpyp
Nahuel Fouilleul

@Nahuel คงที่ สิ่งนี้ควรจัดการกับกรณีทดสอบอื่น ๆ (และฉันคิดว่าเป็นคนแรกที่ทำเช่นนั้น)
Jo King

@JoKing แต่น่าเสียดายที่หลังจากทบทวนบางส่วนของกรณีทดสอบชี้ให้เห็นผมคิดว่ากรณีทดสอบที่ผ่านมาจะล้มเหลว [ 1222, 22, 122] 12122-> ฉันได้อัปเดตคำถามเพื่อให้ความกระจ่างและขอโทษที่ฉันไม่ได้ทำให้มุมนี้ชัดเจนขึ้นก่อนหน้านี้
Quinn

ฉันมีปัญหาที่คล้ายกันกับs/(?!$b)$a/$b/gเมื่อ $ a ว่างเพราะสตริงที่ว่างเปล่าหลังจากที่pถูกจับคู่ที่(?!p)ฉันต้องการ(?<!p)(?!p)
Nahuel Fouilleul

1
@Quinn คงที่ฉันคิดว่า?
Jo King

5

ถ่าน , 55 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

≔⁰ε

เริ่มต้นตัวแปรเพื่อแสดงตำแหน่งที่การแข่งขันแทนที่ครั้งสุดท้ายสิ้นสุดลง

F⌕Aθη

ค้นหารายการที่ตรงกันที่ทับซ้อนกันทั้งหมดในaS

F‹‹ιε

หากการแข่งขันครั้งต่อไปไม่ทับซ้อนการแทนที่ที่สำเร็จครั้งสุดท้าย ...

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

... และยังไม่มีการทับซ้อนbในS...

≔⁺⁺ω✂θει¹ζω

... จากนั้นเชื่อมสตริงย่อยกลางระหว่างการแข่งขันครั้งสุดท้ายและการจับคู่นี้กับbสตริงออก ...

≔⁺ιLηε

... และอัปเดตตัวแปรสิ้นสุดการแข่งขันสุดท้ายเป็นสิ้นสุดการแข่งขันใหม่นี้

»⁺ω✂θε

ในตอนท้ายให้เพิ่มส่วนที่เหลือSและเอาท์พุทผลลัพธ์


1
@tsh ตกลงนี่คือการเขียนที่สมบูรณ์ฉันหวังว่าตอนนี้ครอบคลุมทุกกรณีที่เป็นไปได้ ...
Neil

1
@Neil ฉันเชื่อว่านี่เป็นสิ่งที่ถูกต้องเช่นกัน!
Quinn

@Neil ฉันเชื่อว่านี่ถูกต้องแล้ว
TSH

@Quinn Ooh นั่นทำให้ฉันก่อนเพื่อให้คำตอบของพวกเขาถูกต้องหรือไม่ เรียบร้อย!
Neil

@Neil ฉันเชื่อว่า JoKing มีคำตอบที่ถูกต้องด้วย
Quinn

3

ภาษา Wolfram (Mathematica) , 43 122 96 88 bytes

##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 ดูเหมือนว่าจะคงอยู่กับฉัน!
Quinn

1

Perl 5 ( -lpF/;/), 41 ไบต์

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

TIO


[ 1222, 22, 122] ควรเอาท์พุท12122แต่คุณเอาท์พุท11222
ควินน์

ตกลงไม่เข้าใจว่าอาจจะคงที่และสั้นกว่า
Nahuel Fouilleul

โอ้ไม่จริงกรณีการทดสอบครั้งสุดท้ายมีจำนวนมากเกินไป12กลายเป็นคำถามที่ฉันทำยากกว่าที่ฉันคิดไว้มาก!
Quinn

@Quinn มันดูเหมือนว่าฉันว่ามันไม่สอดคล้องกัน: 123, 23, 12-> 112แต่1212, 1, 121-> 1212(? ทำไมมันไม่ควรจะเป็น121212)
Nahuel Fouilleul

ดูเหมือนว่าสิ่งที่ควรชี้แจงคือตำแหน่งSใดที่ไม่ควรจับคู่bหรือข้ามส่วนใดก่อนที่จะมองหาแมตช์ต่อไป
Nahuel Fouilleul
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.