派手な文字列の置換


16

let Saおよびbそれぞれは文字列を表します

目標:あなたは、すべての出現置き換える機能置き換える標準の文字列を書くa文字列にしSbいる限り、aすでにのインスタンスの一部ではないがb

たとえば、文字列S= がある場合My oh my that there is a big ol' that

私たちは空想のに置き換えやってみたかったa = thatb = 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つの文字列のリストとして指定できます

  • 入力が順番になります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"

これはcode-golfの質問なので、バイト単位の最短回答が優先されます。


回答:


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空の文字列の後があるため$空の場合、pマッチングされた(?!p)私が必要(?<!p)(?!p)
ナウエルFouilleul

1
@Quinn Fixed私は思う?
ジョーキング

5

、55バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

≔⁰ε

変数を初期化して、最後に置換された一致が終了した場所を示します。

F⌕Aθη

のすべての重複する一致を検索aSます。

F‹‹ιε

次の一致が最後に成功した置換と重複しない場合...

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

...また、bin のコピーも重複しませんS...

≔⁺⁺ω✂θει¹ζω

...次に、最後の一致とこの一致との間の中間部分文字列をb出力文字列に連結します...

≔⁺ιLηε

...最後のマッチ終了変数をこの新しいマッチの終わりに更新します。

»⁺ω✂θε

最後に、残りの部分を追加しSて結果を出力します。


1
@tsh OKこれは完全な書き換えです。これですべての可能なケースがカバーされることを望みます...
ニール

1
@Neilこれも有効だと思います!
クイン

@Neilこれは今では有効だと思います。
tsh

@Quinn Ooh、それは彼らの答えを有効にするために最初に私を作るのですか?きちんとした!
ニール

@Neil JoKingにも有効な答えがあると思う
クイン

3

Wolfram言語(Mathematica)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
ファルコ

@attinat私に固定されているようです!
クイン

1

Perl 5(-lpF/;/)、41バイト

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

TIO


[は122222122]が出力する12122が、あなたの出力を11222
クイン

わかりませんでした。おそらく修正されていて、短いです
ナウエル・フイユル

実際、最後のテストケース12のsの数が多すぎるため、私が出した質問は当初考えていたよりもはるかに困難でした。
クイン

@Quinn、それは一貫していないだと私には思える:1232312- > 112しかし12121121- > 1212(?それはすべきではない理由121212
ナウエルFouilleul

明確にする必要があるのは、次の試合を探す前にどの位置とS一致しないbか、どの部分をスキップするかであるようです
ナウエル・フイユル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.