Ganti String Fancy

16

biarkan S, adan bmasing - masing mewakili string

Sasaran: Menulis fungsi penggantian string standar di mana Anda mengganti semua kemunculan adalam string Sdengan bselama abelum menjadi bagian dari instance darib

misalnya, jika kita memiliki string S=My oh my that there is a big ol' that

dan kami ingin melakukan penggantian yang bagus a = thatdan b = that therekami akan mengganti setiap instance thatdengan that thereselama instance thatbelum menjadi instancethat there

Jadi dalam hal ini hasilnya adalah: My oh my that there is a big ol' that there

Yang pertama thattidak diganti karena sudah menjadi bagian dari contohthat there

Catatan

  • Ketiga input harus berupa string yang hanya berisi karakter ascii yang dapat dicetak

  • Input dapat diberikan sebagai 3 string terpisah atau daftar 3 string

  • Masukan akan berada di urutan S, a, bkecuali ditentukan lain dalam jawaban

  • Agar adapat dianggap sebagai bagian dari b, semua instance aharus menjadi bagian dari instanceb

Beberapa Kasus Pojok Dijelaskan

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

Dalam contoh di atas contoh yang terakhir 22diganti. Meskipun bagian dari itu adalah bagian dari contoh b, keseluruhannya BUKAN bagian dari contoh b. Karena seluruh instance abukan bagian dari instance bdiganti

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

Kasus uji ini menggambarkan kasus yang sama seperti di atas tetapi mungkin dengan cara yang sedikit lebih jelas. Lagi-lagi yang 2di tengah adalah bagian dari instance amaupun bagian dari instance b, namun karena semua abukan bagian dari instance byang masih diganti.

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

Dalam kasus uji di atas baik string kosong sebelum dan sesudah ptidak diganti karena sepenuhnya dapat dianggap sebagai bagian dari contoh p.

Kasus Uji Lainnya

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"

Ini adalah pertanyaan untuk kode-golf sehingga jawaban tersingkat dalam byte menang.

Quinn
sumber

Jawaban:

6

Perl 6 , 76 byte

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

Cobalah online!

Blok kode anonim yang memerlukan input kari, seperti f(a,b)(s).

Saya cukup yakin ini cocok dengan maksud pertanyaan. Pada dasarnya, itu hanya membuat penggantian jika posisi atidak dalam salah satu pertandingan yang tumpang tindihb .

Jo King
sumber
2
Namun dalam tes ada 2p: di pEpmpptpypbukannyapEpmptpyp
Nahuel Fouilleul
@Nahuel Diperbaiki. Ini juga harus menangani kasus uji lainnya (dan saya pikir ini yang pertama kali melakukannya)
Jo King
@JoKing Sayangnya setelah memikirkan kembali beberapa uji kasus menunjukkan, saya pikir kasus tes terakhir akan gagal [ 1222, 22, 122] -> 12122. Saya telah memperbarui pertanyaan untuk mengklarifikasi dan meminta maaf bahwa saya belum menjelaskan kasus sudut ini sebelumnya.
Quinn
saya memiliki masalah yang sama dengan s/(?!$b)$a/$b/g, ketika $ a kosong karena string kosong setelah pcocok (?!p)saya butuhkan(?<!p)(?!p)
Nahuel Fouilleul
1
@ Cepat Diperbaiki saya pikir?
Jo King
5

Arang , 55 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

≔⁰ε

Menginisialisasi variabel untuk menunjukkan di mana pertandingan yang terakhir diganti berakhir.

F⌕Aθη

Temukan semua kecocokan tumpang tindih adi S.

F‹‹ιε

Jika pertandingan berikutnya tidak tumpang tindih dengan penggantian yang berhasil terakhir ...

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

... dan juga tumpang tindih tidak ada salinan bdi S...

≔⁺⁺ω✂θει¹ζω

... lalu gabungkan substring antara antara pertandingan terakhir dan pertandingan ini dengan bke string output ...

≔⁺ιLηε

... dan perbarui variabel akhir pertandingan terakhir hingga akhir pertandingan baru ini.

»⁺ω✂θε

Pada akhirnya, tambahkan sisa Sdan hasilkan hasilnya.

Neil
sumber
1
@tsh OK ini penulisan ulang lengkap, saya harap ini sekarang mencakup semua kasus yang mungkin ...
Neil
1
@Neil Saya percaya ini juga valid!
Quinn
@Neil Saya percaya ini valid sekarang.
tsh
@ Quinn Ooh, apakah itu membuat saya lebih dulu untuk membuat jawaban mereka valid? Rapi!
Neil
@Neil Saya percaya JoKing juga memiliki jawaban yang valid
Quinn
3

Bahasa Wolfram (Mathematica) , 43 122 96 88 byte

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

Cobalah online!

+79: harus diperbaiki.

Sebut sebagai 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
attinat
sumber
2
Gagal untuk 121212, 1, 121 - harus menghasilkan 121212
Falco
@attinat Sepertinya sudah diperbaiki bagi saya!
Quinn
1

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

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

TIO

Nahuel Fouilleul
sumber
[ 1222, 22, 122] Harus output 12122, tetapi Anda output11222
Quinn
ok tidak mengerti itu, mungkin diperbaiki, dan lebih pendek
Nahuel Fouilleul
Oh tidak, sebenarnya test case terakhir memiliki satu terlalu banyak 12, ternyata pertanyaan yang saya buat jauh lebih sulit daripada yang saya pikir!
Quinn
@Quinn, tampaknya bagi saya bahwa itu tidak konsisten: 123, 23, 12-> 112tapi 1212, 1, 121-> 1212(? Mengapa tidak harus 121212)
Nahuel Fouilleul
tampaknya apa yang harus diklarifikasi adalah posisi mana yang Stidak boleh cocok dengan batau bagian mana untuk dilewati sebelum mencari pertandingan berikutnya
Nahuel Fouilleul