花式字符串替换


16

Sab各自代表一个字符串

目标:写在你更换所有出现一个标准的字符串替换功能a的字符串Sb,只要a是没有的一个实例的一部分b

例如,如果我们有字符串S=My oh my that there is a big ol' that

我们想做一个花哨取代a = thatb = that there我们将取代每个实例thatthat there,只要实例that是不是已经实例that there

因此,在这种情况下,输出为: My oh my that there is a big ol' that there

that不替换第一个,因为它已经是实例的一部分。that there

笔记

  • 所有3个输入必须是仅包含可打印ASCII字符的字符串

  • 输入可以给出3个单独的字符串或3个字符串的列表

  • 输入将在订货Sab除非在回答另有规定

  • 为了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"

这是关于代码高尔夫球的问题,因此最短的答案以字节为单位。


Answers:


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,我认为最后的测试情况下会失败[ 122222122] - > 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θη

查找所有重叠的匹配aS

F‹‹ιε

如果下一场比赛与上一次成功替换不重叠...

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

...它也没有重叠的副本bS...

≔⁺⁺ω✂θει¹ζω

...然后将最后一个匹配和此匹配之间的中间子字符串连接b到输出字符串...

≔⁺ιLηε

...,然后将最后一个比赛结束变量更新为该新比赛的末尾。

»⁺ω✂θε

最后,将的任何余数相加S并输出结果。


1
@tsh OK,这是一个完整的重写,我希望现在可以覆盖所有可能的情况……
Neil

1
@Neil我相信这也是有效的!
奎因(Quinn),

@Neil我相信这现在是有效的。
tsh

@Quinn Ooh,这是否使我首先使他们的答案有效?整齐!
尼尔,

@Neil我相信JoKing也有一个有效的答案
Quinn

3

Wolfram语言(数学)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

蒂奥


[ 122222122]应输出12122,但你输出11222

好的,我不明白,也许是固定的,而且更短
Nahuel Fouilleul

哦,最后一个测试用例实际上没有一个太多的12s,结果我提出的问题比我原先想的要难得多!
奎因(Quinn),

@Quinn,在我看来,这不是一致:1232312- > 112但是12121121- > 1212(?为什么它不应该是121212
纳乌艾尔乌Fouilleul

似乎应该弄清楚的是,在寻找下一场比赛之前,哪些位置S不应该匹配b或跳过哪一部分
Nahuel Fouilleul 19'Aug
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.